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