Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Avant d'enregistrer des infos dans ma table j'élimine tous les éléments du formulaire qui ne sont pas des champs dans ma table.
J'utilisait la propriété $this -> _cols qui était générée automatiquement par ZF en faisant :
public function preparerPourEnregistrement ($infosPost) { $this -> infosSQL = array_intersect_key($infosPost, array_flip($this -> _cols)); }
Le petit hic c'est qu'avec la version 1.7 apparemment $this -> _cols n'existe plus.
Savez-vous si elle est accessible ailleurs ou bien est-elle simplement supprimée ?
Merci de vos réponses.
Cordialement,
Kaimite
Hors ligne
Hello,
Normalement j'ai patché pour la 1.7 : http://framework.zend.com/issues/browse/ZF-2243 , donc tu n'as plus besoin de faire preparerPourEnregistrement.
A+
Hors ligne
Je me réponds à moi même...
En modifiant le code de la façon suivante j'ai retrouvé mon $this -> _cols
public function preparerPourEnregistrement ($infosPost) { $this -> info(); $this -> infosSQL = array_intersect_key($infosPost, array_flip($this -> _cols)); }
Désolé pour le post inutil !
@++ Kaimite
Hors ligne
Hello,
De plus pour accéder au colonnes, ce n'est pas une bonne pratique d'utiliser $this->_cols directement :
public function preparerPourEnregistrement ($infosPost) { $this -> infosSQL = array_intersect_key($infosPost, array_flip($this ->info(Zend_Db_Table_Abstract::COLS)); }
A+
Dernière modification par mikaelkael (20-11-2008 15:10:13)
Hors ligne
moi je fais :
$maTable->createRow($form->getValues()).
Tout est déja prévu dans cette méthode (createRow())
Hors ligne
Hello,
Ben c'est ça l'objet de l'issue ZF-2243, c'est que createRow et setFromArray() aient le même comportement.
A+
Hors ligne
Mickael> Excuses, j'ai répondu trop vite. Ce patch est très bon : j'avais remarqué ce comportement il y a quelques mois, bien vu ^^
Hors ligne
Bonsoir,
Voilà, j'ai teste createRow() :
$nouvelEnregistrement = $this -> createRow($this -> infosSQL); $nouvelEnregistrement -> save();
J'obtiens le message suivant :
Cannot refresh row as parent is missing
Mais les informations sont bien enregistrés dans la table
En revanche quand je veux faire une maj j'ai le message suivant :
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 1
Si vous avez des conseils je suis preneur
Bonne soirée
Hors ligne
Hello,
Pour l'update :
$row = $table->find($id); $row->setFromArray($new_data); $row->save();
Pour ton erreur, après un insert de données, une nouvelle lecture est faite au cas où un trigger est présent. Dans ton cas cette relecture pose problème car ta clé primaire est manquante ou quelquechose comme ça. A cette heure ci je ne m'en rappelle plus .
A+
Hors ligne
Merci pour cette réponse à une heure tardive
Je n'ai pas fait attention au ID car j'avais cru comprendre que createRow() était une méthode "intelligente" qui pouvait detecter un INSERT ou UPDATE...
Selon le bouqin de Julien :
Remarquez que la méthode save() est intelligente. S’il s’agit d’une
modification d’un enregistrement existant, alors elle exécutera une
requête de type update. Dans le cas contraire, une requête insert sera
alors utilisée.
Pour l'autre soucis je vais jeter un p'tit coup d'oeil sur ce qui est fait après l'enregistrement
Cordialement,
Kaimite
Hors ligne
Hello,
Save est une méthode intelligente pas createRow() (c'est bien ce qu'écrit Julien ). Son intelligence s'arrête au fait qu'elle va savoir si tu as fait un find() ou un createRow(), elle stocke en interne les données initiales permettant de voir les changements effectués. Si pas de données initiales alors insert, sinon update.
A+
Hors ligne
oki,
J'ai fait un petit raccourci alors...
Mais j'ai un autre soucis, voici mon code :
<?php class Article extends Zend_Db_Table { /** * Le nom de la table * @var string */ protected $_name = "articles"; function enregistrerArticle() { if ( !empty($this -> infosSQL) ) { //--> TEST INSERT OU UPDATE if ( isset($this -> infosSQL['uid']) AND is_numeric($this -> infosSQL['uid']) ) { $Enregistrement = $this -> find($this -> infosSQL['uid']); $Enregistrement -> setFromArray($this -> infosSQL); $Enregistrement -> save(); } else { /* pas encore fait */ } return "normalement l'id de l'article enregistré"; } else { return false; } } } ?>
Et j'obtiens le message suivant :
Fatal error: Call to undefined method Zend_Db_Table_Rowset::setFromArray()
Y a surement un truc que je fait pas comme il faut
Merci pour votre aide en tout cas
Désolé si je patauge mais je suis dans une phase "Je capte plus rien" !
Kaimite
Hors ligne
Hello,
Remplaces
$Enregistrement = $this -> find($this -> infosSQL['uid']);
par
$Enregistrement = $this -> find($this -> infosSQL['uid'])->current();
A+
Hors ligne
Pages: 1