Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 22-02-2010 16:14:31

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

[Résolu]enrgister un formulaire grâce à une boucle et un save()

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 :

Code:

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:

Code:

$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

 

#2 23-02-2010 04:05:35

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: [Résolu]enrgister un formulaire grâce à une boucle et un save()

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 wink

Hors ligne

 

#3 23-02-2010 14:00:32

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: [Résolu]enrgister un formulaire grâce à une boucle et un save()

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

 

#4 23-02-2010 23:00:58

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: [Résolu]enrgister un formulaire grâce à une boucle et un save()

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:

Code:

$row = $data->createRow();
$row->titre_fr = $form->getValue('titre_fr');
$row->titre_en = $form->getValue('titre_en');
$row->save();

Pour modifier

Code:

$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

 

#5 21-04-2010 13:44:40

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: [Résolu]enrgister un formulaire grâce à une boucle et un save()

je me permet de rajouter un message car j'ai compris d'ou viens l'erreur (ça fait un moment quand même ^^)

Code:

$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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages