Zend_Form, campi Date e filtro LocalizedToNormalized

Ciao a tutti,

sono alle prese con questo problema:

Mysql memorizza un campo Date con il  formato "Y-MM-dd"

nel zend_form lo voglio visualizzare come "dd/MM/Y"

Normalizzo i dati restituiti dal Model e li passo alla form con il campo definito così:

         $data_nascita = new Zend_Form_Element_Text('data_nascita', array(
             'label'    =>  'data di nascita: ',
             'required' =>  true,
             'filters'  =>  array(
                 array('NormalizedToLocalized', array(array('date_format'=>'dd/MM/Y'))))
         ));

mi aspettavo che lo visualizzasse Localizzato, e questo lo fa, e che lo restituisse ->getValues() normalizzato, questo non lo fa.

se lo facesse lo passerei al Model che lo Localizzerebbe nel formato "Y-MM-dd" per MySql prima di salvarlo.

è chiaro che mi sono perso qualcosa, avete qualche idea?

Grazie,

Ciao

inviato 5 anni fa
fabio.pellati
X 0 X

Ho risolto in un altro modo.

avevo pensato che la sequenza di trasformazioni del dato nella form potesse essere questa:

source ('yyyy-MM-dd') --> [filtroLTN] --> result (array('yyyy', 'MM', 'dd'))

pensavo anche e quì mi sbagliavo di brutto che a questo funzionasse anche al contrario ma non è così.

la mia soluzione risiede tutta nel Model ed è applicata da queste due funzioni:

protected function LocaleForRead($data){
      $fields[]=array('type'=>'data', 'field'=>'data_nascita', 'readformat'=>'dd/MM/yyyy', 'writeformat'=>'yyyy-MM-dd');
      $LN=new  Zend_Filter_LocalizedToNormalized;
      $NL=new Zend_Filter_NormalizedToLocalized;
      foreach($fields as $field){
          if (isset ($data[$field['field']])){
               switch ($field['type']) {
                   case 'data':
                       $val = $LN->setOptions(array('date_format'=>$field['writeformat']))->filter($data[$field['field']]);
                       $val = $NL->setOptions(array('date_format'=>$field['readformat']))->filter($val);
                       break;
                    }
               $data[$field['field']]=$val;
           }
       }
  return $data;
}

protected function LocaleForWrite($data){
    $fields[]=array('type'=>'data', 'field'=>'data_nascita', 'readformat'=>'dd/MM/yyyy', 'writeformat'=>'yyyy-MM-dd');
    $LN=new  Zend_Filter_LocalizedToNormalized;
    $NL=new Zend_Filter_NormalizedToLocalized;
    foreach($fields as $field){
         if (isset ($data[$field['field']])){
             switch ($field['type']) {
                 case 'data':
                     $val=$LN->setOptions(array('date_format'=>$field['readformat']))->filter($data[$field['field']]);
                     $val=$NL->setOptions(array('date_format'=>$field['writeformat']))->filter($val);
                     break;
                 default:
                     break;
             }
             $data[$field['field']]=$val;
         }
   }
   return $data;
}

LocaleForWrite elabora gli array di dati tutte le volte che devo scrivere sul database,

LocaleForRead elabora gli array di dati tutte le volte che li devo restituire al controller.

lo switch sul tipo è messo lì per gestire altri tipi di dato che ora non ho necessità ne tempo di fare.

risposto 5 anni fa
fabio.pellati
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda