Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
je sais qu'il y a déjà des sujets à ce propos mais je n'ai pas trouvé de réponse qui me satisfasse...
Lorsque je crée ou met à jour un enregistrement dans ma base de données,
tout champ laissé vide étant de type Date dans ma BDD est mis à 0000-00-00 et à 0 pour un type INT malgré les DEFAULT value mis à NULL...
Ca a l'air d'être propre à ZEND...Je comprend quelque part ce comportement, mais vis à vis de l'utilisateur c'est pas très esthétique...
Faut-il manuellement remettre les données en question à NULL ou ya til un autre moyen plus adapté??
Merci
Hors ligne
il ne faut pas mettre de valeur dans le champ du row
lorsque tu positionne la valeur à null ou à zéro (ou avec la valeur vide d'un formulaire)
Zend construit un insert avec un valeur à '' pour le champ or '' c'est en fait \0 soit donc l'entier 0
du coup tu n'utilise pas le défaut à null
il te faut faire un unset avant
unset($row->date);
du coup le champ n'étant pas présent dans la liste des champs à insérer il ne peu l'être
c'est la valeur par défaut de la base qui fait alors le travail.
A+JYT
Hors ligne
Merci pour cette réponse, le comportement est bien celui que je pensais...
Cependant, le problème est comment rendre generique la création de Row à partir d'un formulaire avec cette contrainte??
J'utilise quelque chose de ce genre :
if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $row = $groupes->createRow(); $row->setFromArray($form->getValues()); ...
Quel est le meilleur moment pour faire la correction???
Ou dois je surcharger la fonction setFromArray??
Hors ligne
dans ta classe row tu surcharge le constructeur qui fait ce qu'il faut
ainsi lorsque tu fais le create row ça exécute ton constructeur
A+JYT
Hors ligne
Bon je crois avoir réussi, ca a l'air de marcher, je poste la réponse pour faire profiter :
j'ai surchargé la classe Row:
<?php class My_Db_Table_Row extends Zend_Db_Table_Row_Abstract { public function setFromArray(array $data) { $data = array_intersect_key($data, $this->_data); foreach ($data as $columnName => $value) { if($value==""){ $value=NULL; } $this->__set($columnName, $value); } return $this; } } ?>
et ensuite préciser dans mes classes de table cette nouvelle classe Row
<?php abstract class My_Db_Table extends Zend_Db_Table { protected $_rowClass = 'My_Db_Table_Row'; } ?>
Et voila merci à toi sekaijin...
Dernière modification par enjoy (21-04-2009 16:37:32)
Hors ligne
Pages: 1