Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je souhaite quand je fais un update à un objet, mettre en ‘disable’ un champ précis à la condition qu'un autre champ de la table soit à 'vrai'
Exemple :
Table ITEM
item_id
item_truc
item_bool
Donc si (item_bool == true) alors item_truc ne changera plus.
Alors la ligne suivante marche bien, et le select est bien désactivé.
$item_truc->setOptions(array('disabled'=>'disabled'));
Mais il faut que je rajoute une condition :
if ($this->item_bool==true) { $item_truc->setOptions(array('disabled'=>'disabled')); }
Et là ça ne fonctionne plus!
Chose important à rajouter, si j'écris
if ($this->item_bool==false) {
Cette condition renvoi toujours vrai
Et
if ($this->item_bool==false) {
Renvoi toujours faux
J'en conclue qu'il n'accède pas vraiment à la valeur de item_bool.
Merci de votre aide.
Hors ligne
$this->item_bool te renvoi un Zend_Form_Element
Pour la valeur :
$this->item_bool->getValue()
Hors ligne
Fatal error: Call to a member function getValue() on a non-object in C:\wamp\www\test\application\forms\Item.php on line 75
je ne vois pas ce que je peux faire.
Hors ligne
c'est quoi "$this" dans ton code ? Zend_Form ? l'Element item_bool a été créé quand tu as appelé la fonction ?
Hors ligne
Voilà
class Form_Item extends Zend_Form { public function __construct($options = null){ parent::__construct($options); } public function init() { $this->setName('item'); $id = new Zend_Form_Element_Hidden('item_id'); //pleins de choses $cc= new Zend_Form_Element_Select('item_cc'); $cc->setLabel('cc') ->setRequired(true) ->addValidator('NotEmpty') ->addMultiOption('','Choose'); $table_ccc = new Model_DbTable_cc(); foreach ($table_ccc->findForSelect() as $row) { $ccname = $row->cc_number . "\t" . $row->cc_name; $cc->addMultiOption($row->cc_id, $ccname); } if ($this->item_bool->getValue()==true) $cc->setOptions(array('disabled'=>'disabled')); $submit = new ...... $this->addElements(array($id,$cc,$submit)); } }
dsl de mettre du code comme ça, je trouve que c'est plus simple que de l'expliquer
Et Merci de m'avoir répondu
Dernière modification par maryooman (26-04-2010 16:49:21)
Hors ligne
beh, c'est bien la le problème, je ne vois toujours ou est défini ton item_bool
Hors ligne
ah!
Dans le controller je fais un fetchAll sur la table item:
$table = new Model_DbTable_Item() $this->view->res = $table->fetchAll();
et le formulaire est ce que j'ai écris au dessus.
Je n'ai mis item_bool nul par, je pensais pouvoir y accéder comme ça, puisque il fait parti du résultat du fetchAll ...
Il faut donc faire un champ hidden avec la valeur du item_bool?
Ainsi soit-il !
$b = new Zend_Form_Element_Hidden('item_bool'); if ($b->getValue()==true) $cc->setOptions(array('disabled'=>'disabled'));
Le résultat est exactement le même qu'avant.
Je me demande si le getValue renvoie quelque chose ?
alors j'ai fais
$name = new Zend_Form_Element_Input('truc'); $b = new Zend_Form_Element_Hidden('item_bool'); $name->setValue($b->getValue());
Il n'y a rien qui s'affiche dans le champ input !
Donc getValue ne revoi rien je pense
EDIT : je peux faire un autre accès à la base de donnée, mais je préfère apprendre à faire une méthode propre
Dernière modification par maryooman (27-04-2010 14:05:03)
Hors ligne
Nan, mais tu fais tout de travers la.
Tu ne m'as pas répondu lorsque j'ai t'ai demandé quel type d'objet était $this quand tu fesais $this->item_bool
maintenant, je sais ! je croyais que c'était un Zend_Form, mais non
test ca :
var_dump($this->view->res); exit();
Si tu fois que item_bool est à false ou true, à toi de voir pourquoi dans ta table comment/pourquoi changé cette valeur
Dernière modification par nORKy (28-04-2010 09:05:37)
Hors ligne
me revoilà, dsl de retard.
J'ai fais un Zend_Debug::dump($form) dans le controller juste apres le populate()
Il y a un élément Hidden :
["item_bool"] => object(Zend_Form_Element_Hidden)#94 (29) {
["helper"] => string(10) "formHidden"
["_allowEmpty":protected] => bool(true)
["_autoInsertNotEmptyValidator":protected] => bool(true)
etc ....
et en regardant vers la fin il y a cette ligne :
["_value":protected] => string(1) "1"
et la veleur change en fonction de l'item ("0" ou "1")
Donc le soucis c'est l'acces à cette valeur puisque getValue() sur le champs hiddent ne renvoit rien!
Dernière modification par maryooman (29-04-2010 12:21:11)
Hors ligne
bon revenu au début
$form = new Form_Item(); $form->submit->setLabel('update'); $this->view->form = $form; if ($this->getRequest()->isPost()) { etc .... } else { $id = $this->_getParam('id', 0); $table = new Model_DbTable_Item(); $form->populate($table->fetchAll($id)) }
et la table
Table ITEM
item_id
item_truc
item_bool
A partir d'ici
Les valeur remplissent automatiquement le formulaire mais,
Comment je peux acceder à une valeur d'un champs de ma table, sachant que je suis dans le formulaire ?
Je veux simplement connaitre la valeur de item_bool.
Merci
Hors ligne
Tu fais une fonction dans ton formulaire.
Ex: en surchargeant directement populate
function populate(array $values) { $res = parent::populate($values); if ($values['item_bool']) { $this->truc->setOptions(bidule); } else { .... } return $res; }
Hors ligne
très bonne idée,
la condition 'if' est prise en compte,
par conte la ligne
$this->truc->setOptions(bidule);
renvoie une erreur
Fatal error: Call to a member function setOptions() on a non-object in C:\wamp\www\test\application\forms\Item.php on line 20
alors je me suis dis pourquoi ne faire une variable static de la classe Form_Item (ce formulaire) :
private static $_bool;
function populate(array $values) { self::$_crossCharged = 1; return $res; }
Or elle n'ai pas prise en compte.
Si je met cette meme ligne dans le init() :
self::$_crossCharged = 1;
Elle marche très bien ...
Dernière modification par maryooman (29-04-2010 17:31:05)
Hors ligne
si 'truc' n'existe pas, c'est normal.
Je copie juste ton code. Dans ton premier poste, tu as mis
$item_truc->setOptions(array('disabled'=>'disabled'));
Si tu l'as pas créé, ca peut pas marché
Hors ligne
ca marche !!!!!
merci beaucoup!!
Je vais mettre un code exemple minimal :
class Form_Item extends Zend_Form{ public function __construct($options = null){ parent::__construct($options); } function populate(array $values) { $res = parent::populate($values); if ($values['item_bool']) { $this->item_truc->setOptions(array('disabled'=>'disabled')); } return $res; } public function init() { $truc= new Form_Element_Text('item_truc'); $submit = new Zend_form_Element_Submit('submit'); $submit->setAttrib('id', 'submitbutton'); $this->addElements(array($truc,$submit)); } }
par controle il y a un avertissement :
Notice: Undefined index: item_bool in C:\wamp\www\test\application\forms\Item.php on line 16
et c'est étrange car malgré l'avertissement, la valeur de item_bool est prise en compte car quand item_bool = 1 le champ est grisé, quand item_bool = 0 il ne l'ai pas !
Hors ligne
j'ai eu une idée de faire ça :
function populate(array $values) { $res = parent::populate($values); if ($this->item_bool->getValue()) { $this->item_truc->setOptions(array('disabled'=>'disabled')); } return $res; }
le message d'avertissment disparait, la condition de mettre un champ Hidden pour item_bool
Hors ligne
Au vu de dernier code, je laisse tombé. je crois que je comprendrais jamais ce que tu veux faire...
Je crois que tu as des défauts de logique, d'habitude et de connaissance de programmation PHP...
Hors ligne
Croie moi que si j'avais plus de connaissance, je n'aurais pas eu besoin de venir sur des forums de php.
Mais ton aide m'a été extrêmement utile puisque j'ai solutionné un problème majeur dans mon programme et par le même coup compris que je pouvais surcharger des méthodes (populate()) de cette manière.
Et franchement c'est ce genre de site communautaire qui m'a fait choisir Zend.
Même si c'est réglé, je vais reformuler, pour les éventuels futurs lecteurs.
Je veux griser un champ du formulaire de mise à jour d'un item lorsqu’un champ de la base de données est à vrai.
Et toute la difficulté à été d'accéder à la valeur du champ de la base de données (le item_bool) à partir du formulaire.
En tout cas c’est fait.
Merci. A la prochaine.
Hors ligne
Pages: 1