Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Savez vous si il existe un moyen avec ZF de spécifier automatiquement le format des dates que l'on souhaite en lecture et qu'il s'occupe de les convertir au format supportée par la base de donnée.
Par exemple, je fait un select -> date au format D/M/Y
je fait un insert avec la date au format D/M/Y et il le converti en Y-M-D pour mysql
Par avance merci
Olivier
Hors ligne
Oui, en vérité j'oserai dire : tout est possible.
Pour ta question, la logique est :
il faut redéfinir la méthode _fetch de l'adapter, détecter le type de requête, à chaque requête insert/update : analyser les métadata de chaque colonne ( elles sont mises en cache, donc c'est pas lourd niveau base ) via la clé DATA_TYPE du tableau metadata, s'il s'agit d'un colonne de type date, analyser la donnée qu'on veut y insérer, puis la transformer dans le format désiré.
Hors ligne
merci.
C'est ce que j'ai commencé à faire.
Hors ligne
Bien voilà, c'est du brute de forge car j'ai laissé tomber cette solution (en traitant les infos au cas par cas)
abstract class TI_DBTable extends Zend_Db_Table { /** * Fait la liste des champs de type date et dérivés * * @return array */ protected function getDateFields() { $metadata = $this->info(); $metadata = $metadata['metadata']; $result = array(); foreach ($metadata as $col => $meta) { if ((eregi('^date', $meta['DATA_TYPE'])) and ($col!='updated_on') and ($col!='created_on')) $result[]=$col; } return $result; } /** * Modifie toutes les datesInitialise un tableau de résultat (Fetch) */ protected function convertDateFieldsFromDB(array $fetch) { $dateFld = $this->getDateFields(); if (count($dateFld)>0) { foreach ($fetch as &$row) { foreach ($dateFld as $fld) { if (isset($row[$fld])) { $dte = date_parse($row[$fld]); $newDate=$dte['month'].'/'.$dte['day'].'/'.$dte['year']; if (($dte['hour']!=0) or ($dte['minute']!=0) or ($dte['second']!=0)) $newDate.=' '.$dte['hour'].':'.($dte['minute']<10?'0'.$dte['minute'] : $dte['minute']).':'.($dte['second']<10?'0'.$dte['second'] : $dte['second']); $row[$fld]=$newDate; } } } } } protected function convertDateFieldsToDB(array $data) { $dateFld = $this->getDateFields(); if (count($dateFld)>0) { foreach ($dateFld as $fld) { if (isset($data[$fld])) { $dte = date_parse($data[$fld]); $newDate=$dte['year'].'-'.$dte['month'].'-'.$dte['day']; if (($dte['hour']!=0) or ($dte['minute']!=0) or ($dte['second']!=0)) $newDate.=' '.$dte['hour'].':'.($dte['minute']<10?'0'.$dte['minute'] : $dte['minute']).':'.($dte['second']<10?'0'.$dte['second'] : $dte['second']); $data[$fld]=$newDate; } } } } .... /* Il faut utiliser c'est méthodes dans le fetch et surchager aussi le insert() / update() */
Traitement un peu long pour de simple dates ...
Hors ligne