Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai parcouru beaucoup de sujets à propos des requêtes et insertions.
Et j'ai découvert qu'il été possible de faire un boucle au lieux de prendre un à un les éléments d'un formulaire :
class Model_DbTable_Supplier extends Zend_Db_Table { protected $_name = 'supplier'; protected $_primary = 'supplier_id'; public function addSupplier($form) { $row = $this->createRow(); foreach ($form as $key => $value) { $row->$key = $value; } $row->save(); }
Au passage, j'aimerai tester si la clé ($key) est une colonne de la table, pour la rejeter si elle n’en fait pas parti (exemple le submit du formulaire)
J'ai parcouru le net et je vous avoue que ce que j'ai trouvé je ne l'ai pas compris.
//$this -> infosSQL = array_intersect_key($key, array_flip($this ->info(Zend_Db_Table_Abstract::COLS)));
Ça ne me dit rien ….
Mais avant, les valeurs arrivent de cette façon par le contrôleur:
$values = $form->getValues(); $db = new Model_DbTable_Supplier(); $result = $db->addSupplier($values);
L'ajout est effectif mais me laisse sur une exception :
Application error
Exception information:
Message: Cannot refresh row as parent is missing
Stack trace:
#0 C:\wamp\www\NetApp_IT_Tool\library\Zend\Db\Table\Row\Abstract.php(497): Zend_Db_Table_Row_Abstract->_refresh()
#1 C:\wamp\www\NetApp_IT_Tool\library\Zend\Db\Table\Row\Abstract.php(438): Zend_Db_Table_Row_Abstract->_doInsert()
#2 C:\wamp\www\NetApp_IT_Tool\application\models\DbTable\Supplier.php(30): Zend_Db_Table_Row_Abstract->save()
etc .........
J'ai cherché ce que signifie ce message, il semble avoir un rapport avec la clé primaire (c'est ce que j'ai compris), mais j'ai bien renseigner la clé avec $_primary !
Dernière modification par maryooman (21-04-2010 13:45:04)
Hors ligne
Hum, ton code semble correct même si personnellement, je préfère ne pas utiliser une boucle pour avoir un meilleur contrôle sur la sauvegarde et mes formulaires (sauf s'il font 100 champs en effet, ce qui reste pas d'arriver)
Je n'ai pas la réponses à ton problème, seulement que tu as toujours la chance de faire simple pour éviter de durer trop longtemps sur ce problème
Hors ligne
l'idée était de faire un code 'universel', un truc qui passe sur toute les tables ...
enfin je me contenterai de d'insérer les champs un à un ...
mais j'ai aussi une autre question qui en découle.
J'ai vue que la méthode save() permet soit d'insérer une nouvelle ligne dans la table soit de modifier une existante.
Je me suis contanter de reprendre le code existant de l'ajout d'un 'supplier', me disant que save() va comprendre tout seul si l'id existe déja.
En faite non, il me donne une erreur, l'id est existant (normal je fait une mise à jour d'une ligne).
Y aurait-il une clause spécial à ajouté ?
Hors ligne
Tient, je n'ai pas eu vent de cette capacité au save()
Je me suis jamais vraiment poser la question, je fais toujours comme ceci:
$row = $data->createRow(); $row->titre_fr = $form->getValue('titre_fr'); $row->titre_en = $form->getValue('titre_en'); $row->save();
Pour modifier
$data = new Default_Model_DbTable_News(); $row = $data->fetchRow('idNews='.$id); $row->titre_fr = $form->getValue('titre_fr'); $row->titre_en = $form->getValue('titre_en'); $row->save();
Mais je sais très certainement que ma façon peut être optimiser, c'est vers les classes de models qu'il faut se tourner pour ça !
Hors ligne
je me permet de rajouter un message car j'ai compris d'ou viens l'erreur (ça fait un moment quand même ^^)
$row = $data->createRow(); $row->id = $form->getValue('id'); <------------------------le problème est ici $row->titre_fr = $form->getValue('titre_fr'); $row->titre_en = $form->getValue('titre_en'); $row->save();
à l'insertion d'une nouvelle ligne dans le table, il ne faut rien mettre dans l'ID, c'est PDO qui s'en occupe
pour revenir à ma 1ere question, dans la boucle, l'ID est ajouté, d'ou l'erreur du 'refresh row'
et puis autant garder le contrôle et lister les attributs un à un, même si il y en a 20.
Voilà !
Hors ligne
Pages: 1