So I’m learning PHP and Zend Framework and MVC stuff. And I just figured out how to do a custom decorator on Zend_Form to change the way the form is written to HTML. The default puts each element label and input box into dd and dl tags. I just wanted to put each element in a div, with the input box on the same line as the label. There may be better ways to do this, but this is what I put in the IndexController.php file:
$form = new Zend_Form(array( 'elementDecorators'=>array( 'ViewHelper', array( 'Description', array( 'tag'=>'div', 'class'=>'help' ) ), 'Errors', array('Label'), array( 'HtmlTag', array( 'tag'=>'div', 'class'=>'field' ) ) ), 'decorators'=>array( 'FormElements', array( 'HtmlTag', array('tag' => '<div>') ), 'Form', ), 'method' => 'post', 'action' =>'/url/to/form', 'elements' => array( 'name' => array('text', array( 'label' => 'Name:' )), 'subject' => array('text', array( 'label' => 'Subject:' )), 'submit' => array('submit', array( 'label' => 'Add', )) ), )); $form->submit->removeDecorator('Label'); return $form; } public function formAction() { $this->view->form = $form; }
The $form->submit->removeDecorator(‘Label’) bit removes the extra ‘Add’ from the submit button.
Then you just put
echo $this->form;
in your form.phtml
(This form does nothing)
This results in HTML like:
<form method="post" action="/route/to/form">
<div>
<div class="field">
<label for="name" class="optional">Name:</label>
<input type="text" name="subject" id="subject" value="">
</div>
<div class="field">
<label for="subject" class="optional">Subject:</label>
<input type="text" name="subject" id="subject" value="">
</div>
<div class="field">
<input name="submit" id="submit" value="Add" type="submit">
</div>
</div>
</form>
Instead of the default dd and dl layed out form.
Leave a Reply