Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonsoir tout le monde,
Cela fait quelques temps que je bataille avec le ZF pour utiliser un decorator scriptView avec mon Zend_Form.
J'ai un contrôlleur assez simple :
application/controllers/IndexController.php
<?php class IndexController extends Zend_Controller_Action { public function indexAction() { $form = new Zend_Form(); $form->setName("myForm"); $form->setDecorators(array(array("ViewScript", array("viewScript" => "index/demo-form.phtml")))); $form->addElement("text", "myField", array( "label" => "nom :", "decorators" => array("ViewHelper", "Errors", "Label"))); $this->view->myForm = $form; } }
Une vue tout aussi simple :
application/views/scripts/index/index.phtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Untitled page</title> </head> <body> <p>Hello World from Zend Framework !</p> <?= $this->myForm ?> </body> </html>
et pour finir le ViewScript que devrait utiliser le Zend_Form lors du render :
application/views/scripts/index/myForm.phtml
<h4>Please register with us!</h4> <form action="<?= $this->escape($this->getAction()) ?>" method="<?= $this->escape($this->getMethod()) ?>"> <fieldset> <legend>Demographics</legend> <p> Please provide us the following information so we can know more about you. </p> <?= $this->myField ?> </fieldset> </form>
Et le résultat final assez décevant en soit :
<h4>Please register with us!</h4> <form action="</body> </html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Untitled page</title> </head> <body> <p>Hello World from Zend Framework !</p>
Je connais pas encore bien le ZF, je dois sûrement louper un truc tout bête mais j'ai beau écumer le net je vois pas ce que j'ai de faux. D'ailleurs si quelqu'un se sent l'âme de faire un bon tuto sur le Zend_Form avec un decorator scriptView, je pense qu'il y aura des heureux parce que j'en ai pas trouvé de bien transcendant...
Merci de votre aide.
Bonne nuit
Hors ligne
Y'a pas un array de trop la :
$form->setDecorators(array(array("ViewScript", array("viewScript" => "index/demo-form.phtml"))));
J'ai jamais utilisé viewscript mais j'ai l'intention de l'utiliser aujourd'hui
Donc si personne ne t'a répondu, j'aurais pt etre une réponse au plus tard cet après-midi
Hors ligne
Je viens d'utiliser viewscript avec succès.
Mais, je ne l'ai pas utilisé avec form mais avec un élément (je n'ai pas envi de faire un décorateur juste pour 2 éléments différents des autres).
Mon but est de rendre 2 éléments sans le input et sans le label, mais intégrer au formulaire comme si çà en était.
(tu comprendras en voyant le code).
Voici mon formulaire :
class My_Form_User_Account_Index extends My_Form_Agora { public function init() { $this->setAction('/user/account/index'); $this->addElement('text', 'login', array( 'decorators' => $this->_standardElementDecorator, 'label' => 'Identifiant:', )); $this->addElement('text', 'email', array( 'decorators' => $this->_standardElementDecorator, 'label' => 'Adresse E-mail:', )); $this->addElement('text', 'regdate', array( 'decorators' => $this->_untaggedElementDecorator, 'label' => 'Inscrit le:', )); $this->addElement('text', 'ip', array( 'decorators' => $this->_untaggedElementDecorator, 'label' => 'Dernière IP Connue:', )); $this->addElement('text', 'connectdate', array( 'decorators' => $this->_untaggedElementDecorator, 'label' => 'Date de dernière connexion:', )); $this->addDisplayGroup( array('login', 'email', 'regdate', 'ip', 'connectdate'), 'useraccountdata', array( 'disableLoadDefaultDecorators' => true, 'decorators' => $this->_standardGroupDecorator, 'legend' => 'Vue d\'ensemble' )); $this->addElement('submit', 'submit', array( 'decorators' => $this->_buttonElementDecorator, 'label' => 'Mettre à jour le compte' )); } }
Mon formulaire étend une autre class qui contient notamment :
protected $_untaggedElementDecorator = array( array('ViewScript', array('viewScript' => 'element.phtml')), );
Donc, certains élements seront rendu à l'aide de la vue element.phtml
Je suis en structure modulaire, mon script est placé ici :
modules/user/views/script/element.html
Il n'est pas dans un répertoire du controller, car on ne sait jamais, je pourrais pt etre en avoir besoin dans un autre controller du module. C'est plus 'global'.
Sinon, tu peux mettre
'viewScript' => 'account/element.phtml'
et la tu le placeras ici :
modules/user/views/script/account/element.html
le code de element.html :
<div class="ctrlHolder"> <p class="label"><?= $this->element->getLabel();?></p> <?= $this->element->getValue();?> </div>
Il est très simple pour la bonne raison que de mon cas, c'est une information ;et donc je n'ai pas besoin de générer les erreurs, les descriptions, etc...
Le rendu final : (j'ai coupé autour)
<div class="ctrlHolder"> <label for="email" class="optional">Adresse E-mail:</label> <input type="text" name="email" id="email" value="toto@titi.comr" /> </div> <div class="ctrlHolder"> <p class="label">Inscrit le:</p> 12 mars 2008 </div> <div class="ctrlHolder"> <p class="label">Dernière IP Connue:</p> </div> <div class="ctrlHolder"> <p class="label">Date de dernière connexion:</p> </div> </fieldset> <div class="buttonHolder"> <input type="submit" name="submit" id="submit" value="Mettre à jour le compte" /> </div> </form>
Pour info, dans ma mise en form, j'ai déclarer en css
label,
.label {
...
}
ce qui fait que je peux rendre mes <label> et <p class="label"> de la même manière
J'espère t'avoir aidé.
Hors ligne
Pages: 1