2009-09-02 5 views
1

(je suis this post GOT la logique comment utiliser Zend_Form sans utiliser les décorateurs.)Zend_Form avec des scripts xhtml (sans l'aide de décorateurs)

au sein de l'action que je crée l'objet Zend_Form et affecté la forme à la vue avant de le restituer :

public function indexAction() 
{ 
     $form = new Zend_Form(); 
     $form->setAction('process') 
      ->setMethod('post'); 

     $username = $form->createElement('text','username'); 
     $username->addValidator('alnum') 
     ->setRequired(true) 
     ->addFilter('StringtoLower'); 

     $description = $form->createElement('textarea','description'); 
     $description->addValidator('alnum') 
        ->setRequired(false) 
        ->addFilter('StringtoLower'); 

     $submit = $form->createElement('submit','Submit'); 

     $form->addElement($username); 
     $form->addElement($description); 
     $form->addElement($submit); 

     $this->view->form = $form; 
     $this->view->render('myForm/index.phtml'); //myForm is the actionController 

    } 

Puis-je ajouter le code suivant à son script de vue (de index.phtml)

<form> 
    <table> 
     <tr> 
      <td><label>Username</label></td> 
      <td><?php echo $this->form->getElement('username')->renderElement(); ?></td> 
     </tr> 
     <tr> 
      <td><label>Description</label></td> 
      <td><?php echo $this->form->getElement('description')->renderElement(); ?></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td><?php echo $this->form->getElement('submit')->renderElement(); ?></td> 
     </tr> 
    </table> 
</form> 

Mais il est obtenir une erreur

Message: Décorateur par Nom de l'élément n'existe pas

Je ne pas utiliser les décorateurs, Quel est le problème de mon code.

Ceci est le message d'erreur personnalisé complet

Application error 
Exception information: 

Message: Decorator by name Element does not exist 
Stack trace: 

#0 [internal function]: Zend_Form_Element->__call('renderElement', Array) 
#1 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\views\scripts\myForm\index.phtml(5): Zend_Form_Element_Text->renderElement() 

#2 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View.php(108): include('C:\Program File...') 
#3 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View\Abstract.php(833): Zend_View->_run('C:\Program File...') 

#4 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\controllers\MyFormController.php(38): Zend_View_Abstract->render('myForm/index.p...') 
#5 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Action.php(513): myFormController->indexAction() 

#6 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction') 
#7 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 

#8 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application\Bootstrap\Bootstrap.php(77): Zend_Controller_Front->dispatch() 
#9 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application.php(335): Zend_Application_Bootstrap_Bootstrap->run() 

#10 C:\Program Files\Zend\Apache2\htdocs\Demo1\public\index.php(27): Zend_Application->run() 
#11 {main} 

Comment puis-je résoudre ce problème sans utiliser les décorateurs

Répondre

4

Vous avez réellement besoin d'enlever les décorateurs par défaut, et ajouter le décorateur ViewScript (le long peut-être le décorateur d'erreur) et ensuite le rendre, jetez un oeil à l'article this.

Exemple simple:

class Demo_Form extends Zend_Form { 
public function init() { 
    $this->addElement('text', 'username', array('decorators' => array('ViewHeper', 'Errors'))); 
    $this->addElement('text', 'lastname', array('decorators' => array('ViewHeper', 'Errors'))); 
    $this->setDecorators(array(array('ViewScript' => array('script' => 'demoForm.phtml')))); 
} 
} 

Et avec un script de vue (demoForm.phtml):

<form action="<?php echo $this->escape($this->form->getAction() ?>" method="<?php echo $this->escape($this->form->getMethod() ?>"> 
<table> 
    <tr> 
     <td>User Name:</td> 
     <td><?php echo $this->form->username; ?></td> 
    </tr> 
    <tr> 
     <td>Last Name:</td> 
     <td><?php echo $this->form->lastname; ?></td> 
    </tr> 
</table> 
</form> 

Vous pouvez avoir un contrôle complet de comment et où rendre vos éléments, puis sur votre finale vue (celle du contrôleur) il suffit d'imprimer votre formulaire le même: formulaire; ?> pour afficher le viewScript sur votre vue.

+0

droit. Lorsque vous ne définissez pas le décorateur ViewScript, il s'attend à ce que vous rendiez le formulaire en tant qu'un, pas en tant qu'éléments individuels. – jimyi

+0

Je ne veux pas utiliser de décorateurs, c'est une utilisation trop compliquée. N'importe qui a une idée de cette erreur en utilisant cette façon. "Message: Décorateur par nom L'élément n'existe pas". J'ai utilisé le même script de vue (qui pour le contrôleur) pour le formulaire HTML. Est-ce qu'il cause une erreur? Merci d'avoir répondu – neobeacon

+0

Et le sujet a une faute d'orthographe. Il doit être "Zend_Form avec des scripts xhtml" .Sorry – neobeacon

0

function indexAction() {

$form = new Zend_form();

..... $this->view->form = $form;

}

après cette étape, il suffit d'aller à chemin/vers/index.phtml et

<%php echo $this->form;

espère que cela fonctionne pour vous, il est de la même façon que je vais pour cela!

0

Depuis la version 1.7, vous pouvez rendre les décorateurs d'éléments de forme individuelle:

echo $form->forename->renderLabel(); 

ou

echo $form->forename->renderErrors(); 

Je pense que votre code essaie de trouver un décorateur élément nommé, mais ne pas réussir.

Vous pouvez rendre « éléments » comme celui-ci:

echo $form->forename->render($view); 

Cela dit, je ne pense pas que ce soit ce que vous voulez. Comme vous aurez les décorateurs attachés par défaut.

Vous avez probablement voulu:

echo $form->forename->renderViewHelper()