Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
je débute avec Zend, juste quelques semaines d'expérience, et je bute sur un problème particulier.
J'ai créé un formulaire de création tout simple.
Lors du traitement de ce formulaire, j'initialise mon row avec un :
$item = $table->createRow(array());
puis je remplis mon row avec les données du formulaire :
$item->setFromArray(array_intersect_key($values, $item->toArray()));
et je finis par sauvegarder mon row:
$item->save();
Mon problème est que je rencontre l'erreur :
Cannot refresh row as parent is missing
(Mon objet est bien créé en base de données)
Après avoir mis en place de nombreux logs, j'ai identifié le problème comme étant le suivant:
Lors du createRow, la fonction initialise toutes les colonnes définies dans ma classe (j'utilise une classe passerelle vers ma bdd), y compris la clé primaire qui est vide puisque l'objet n'existe pas encore.
Hors, lors de l'appel de la fonction save, qui appelle la fonction refresh, la valeur de la clé primaire n'est pas mise à jour avec le dernier id inséré (ma clé primaire est un auto-incrément), car la fonction détecte que la clé primaire est définie(même si elle est vide).
Je dois pas être très claire, désolée, il se fait un peu tard.
Le problème se situe dans le fichier Zend/Db/Table/Abstract.php, dans la foncion insert(), à la ligne :
if ($this->_sequence === true && !isset($data[$pkIdentity])) {
$data[$pkIdentity] = $this->_db->lastInsertId();
}
Comme isset($data[$pkIdentity]) vaut true, l'intérieur de la condition n'est pas exécuté.
Si je remplace ce bloc par le code suivant :
if ($this->_sequence === true && (!isset($data[$pkIdentity]) || $data[$pkIdentity] == '')) {
$data[$pkIdentity] = $this->_db->lastInsertId();
}
alors, cela marche sans générer mon erreur.
Je suppose qu'il y a quelque chose que je n'ai pas saisi dans l'utilisation de cette classe, car la création d'objet est tout de même la base,
vous en pensez quoi ?
Merci d'avance les gars
PS: il n'y a pas beaucoup de filles ici ou je me trompe ?
Dernière modification par stefy (28-03-2009 08:20:12)
Hors ligne
Hello,
Et un :
$item = $table->createRow($values); $item->save();
A+
Hors ligne
Merci mikaelkael,
une bonne nuit de repos m'a bien remis les idées claires
Mon problème était en fait que dans mon formulaire de création, je mettais un champ caché avec ma clé primaire à vide.
Il m'a donc suffit de supprimer ce champ pour le formulaire de création, et tout marche correctement,
merci encore
Hors ligne
Pages: 1