Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Je découvre petit à petit Zend_db et voici ce que j'aimerais faire pour me simplifier un peu la vie :
1) j'ai une table avec les attributs zf_nom, zf_prenom, zf_age
2) j'ai un formulaire dans lequel j'ai nommé mes input en fonction du nom de l'attribut, donc je récupère bien un $_POST['zf_nom'], $_POST['zf_prenom'] et $_POST['zf_age']
3) Je déclare ma Zend_Db_Table_Abstract et ma Zend_Db_Table_Row_Abstract en fonction du nom de ma table, je les lie
4) j'aimerais pouvoir faire un $maRow->setFromArray($_POST); et que Zend_db me fasse la mise à jour des attributs.
Vous me direz, que ca fonctionne, oui c'est vrai mais seulement si dans $_POST j'ai d'autre variables style $_POST['lambda'], j'ai ce genre d'exception qui se lève :
'Zend_Db_Table_Row_Exception' with message 'Specified column "lambda" is not in the row'
Et ce que j'aimerais c'est donc que Zend_db soit capable de se rendre compte que je n'ai pas d'attribut "lambda" dans ma table et que donc il ne cherche pas à l'insérer ou l'update et qu'il ne me lève pas d'exception.
Serais-ce possible ?
Hors ligne
Je pense qu'il faut que tu crées toi-même un tableau avec uniquement les clés et les valeurs que tu as besoin.
Comme ceci:
if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $artist = trim($filter->filter($this->_request->getPost('artist'))); $title = trim($filter->filter($this->_request->getPost('title'))); if ($artist != '' && $title != '') { $data = array( 'artist' => $artist, 'title' => $title, ); $album = new Album(); $album->insert($data); $this->_redirect('/'); return; } }
Dernière modification par Seb (27-11-2007 11:25:50)
Hors ligne
utiliser une classe dérivé
Class Client_Table extends Zend_Db_Table_Abstract { protected $_name = 'client'; protected $_rowClass = 'Client_Row'; /** * Make new row associated to this table. * * @param StdClass|array $obj OPTIONAL object to cast * @return Fast_Db_Row */ public function newRow($obj = null) { if ($obj) { if (is_object($obj)) $obj = get_object_vars($obj); $row = $this->createRow($obj); } else { $row = $this->createRow(); } return $row; } }
et
Class Client_Row extends Zend_Db_Table_Row_Abstract { public function add() { return $this->_doInsert(); } public function update() { return $this->_doUpdate(); } }
dans ton controller tu fais
$formData = $this->getAllParam(); $table = new Client_Table(); $client = $table->newRow($formData); $client->add(); // ou ->update()
c'est magique les champs parasites sont supprimées
mais je te conseille d'en passer par des variable de formulaire plus explicite
<input id='client_name' type='text' name='client[zf_nom]' value='' /> <input id='client_firstname' type='text' name='client[zf_prenom]' value='' /> <input id='client_age' type='text' name='client[zf_age]' value='' />
du coup tu récupère ta variable d'un coup comme ceci
$formData = $this->getParam('client'); $table = new Client_Table(); $client = $table->newRow($formData); $client->add(); // ou ->update()
le tableau formData ne contenant alors que les champs du client
A+JYT
Hors ligne
@seb
C'est ce que je faisais en attendant de trouver mieux sur le forum
@sekaijin
Merci c'est exactement ce qu'il fallait, et concernant l'astuce du nommage des champs de formulaire, c'est génial je ne connaissais pas !
PS : j'ai lu ton article sur zend_db ce matin, merci très bon article.
Hors ligne
Ca marche pas chez moi pour le update, j'obtiens tjrs une erreur : The specified Table 'Client_Table' does not have the same primary key as the Row.
Pourtant dans Client_Row et Client_Table j'ai bien $_primary qui est exactement le même.
J'ai un peu regardé le code apparemment ca viens du fait que $_cleanData est vide.
Si je met true à la place de false ici : $where = $this->_getWhereQuery(false); en ligne 455 de Zend_Db_Table_Row_Abstract ca marche.
Je dois faire quelque chose de mal quelque part mais je vois pas j'ai utilisé texto le code de sekaijin.
Dernière modification par Moimeme (04-03-2008 12:13:05)
Hors ligne
sekaijin tu vois ce qui pourrais clocher ? j'suis en 1.5 c'est peut être ca ...
Hors ligne