3

How to Use the Zend Form ViewScript Decorator In All Modules

If you’ve been using Zend Forms for any length of time, you’ll know just how flexible and configurable they are. Whether you’re initialising them in code or via Zend_Config with one of the adapters Zend_Config_Xml, Zend_Config_Ini, Zend_Config_Json, Zend_Config_Yaml. There’s not much that you can’t do with them, besides link them to a database model for validation – but that’s another story.

What’s more, we can, as I’m quite fond of, use the ViewScript decorator. This allows us to have nearly 100% control of the configuration of the look and feel of our rendered forms. Take the following script template, of a user profile form, as an example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<form action="<?php print $this->escape($this->element->getAction()); ?>"
  method="<?php print $this->escape($this->element->getMethod()); ?>"
  name="<?php print $this->escape($this->element->getName()); ?>"
  id="<?php print $this->escape($this->element->getId()); ?>"
  class="<?php print $this->escape($this->element->getAttrib('class')); ?>">
  <div>
    <fieldset>
      <legend><?php print $this->translate('Profile Details:'); ?></legend>
        <div class="control-group">
          <label class="control-label" for="username">
            <?php print $this->element->username->getLabel(); ?>
          </label>
          <div class="controls">
            <?php print $this->element->username; ?>
          </div>
        </div>
        <div class="control-group">
          <label class="control-label" for="email">
            <?php print $this->element->email->getLabel() ?>
          </label>
          <div class="controls">
            <?php print $this->element->email ?>
          </div>
        </div>
        <div class="form-actions">
          <?php print $this->element->submit; ?>
          <?php print $this->element->cancel; ?>
        </div>
      </fieldset>
    </div>
  </form>

You can see that we can layout forms exactly where and when we want them. There is a bit of a catch that we have to remember all the options that we want to display, but that’s not really an overarching concern.

Caveat Emptor

But buyer beware, there is a catch. Depending on how long you’ve been using them you may or may not have come across the situation where involving the viewScript decorator. That is, it’s alright when the form’s being rendered in the module that it’s created in, but in any other module, it fails to find the view template.

What’s The Solution

If you’ve come across this situation, there is a solution. When you’re using the ViewScript decorator, pass the viewModule parameter as an argument when initialising it.

Similar to rendering partials within other view template scripts, the viewModule parameter provides a module-specific path for finding view script templates. Have a look at the following example to see just how simple it is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Default_Form_MyForm extends Zend_Form
{
  public function init()
  {
    // … other form initialisation ...
 
    // do custom rendering of the form
    $this->setDecorators(array(
 
    array('ViewScript', array(
        // the view template script
        'viewScript' => 'forms/myformtemplate.phtml',
 
        // the module that contains our view templates
        'viewModule' => 'default'
      ))
    ));
 
  }
 
}

We have now specified that the viewScript template will be under application/module/default/forms/. So irrespective of where in the application this form is initialised, if the template is in that location, the form will render with it correctly.

Your Thoughts

Having troubles with the viewScript decorator? Put your thoughts in the comments.

Image courtesy: kiler129

Matthew is a freelance technical writer and technical editor and regular contributor to a number of tech publications, including PHP Architect, PHPMaster, CloudSpring and New Relic. When he's not contributing there, he's writing content here on Malt Blue. What can he say, he's an avid technical writer and software developer. Get in touch if you want awesome, up to the minute, technical content for your blog, business or publication.

Get Updates! (It's FREE)

Subscribe to the newsletter and get regular updates, podcasts, screencasts, tips, pointers and more - All you need to go from beginner to advanced knowledge of the Zend Framework.

Get The Book :: Zend Framework 2 - For Beginners

Zend Framework 2 - For Beginners :: The Book If you're new to or migrating to the Zend Framework this book will help you get up and running quickly. Whether you're completely new to Zend Framework, have experience in PHP or other MVC-based frameworks, this book will teach you what you need to know to successfully develop applications with Zend Framework 2. Register your interest TODAY to get your copy of the book when it's released in April

Post comment as twitter logo facebook logo
Sort: Newest | Oldest
stevepop1 5 pts

Thanks Matt! I came across this at work today because after having created a login form, the project owners wanted the Login form with a particular design. Thanks you saved me time trying to dig out how to do this!