Как изменить макет формы с помощью декораторов Zend_Form?

Я совершенно не понимаю, как работают декораторы. Это структура html, которую я пытаюсь достичь:

<form id="" action="" method="post">

    <fieldset><legend>Contact form</legend>
        <p>
            <label for="name">Name</label>
            <input type="text" name="name" id="name" size="30" />
        </p>
        <p>
            <label for="email">Email</label>
            <input type="text" name="email" id="email" size="30" />
        </p>
        <p>
            <label for="web">Website</label>
            <input type="text" name="web" id="web" size="30" />
        </p>                                                                                    
        <p>
            <label for="message">Message</label>
            <textarea name="message" id="message" cols="30" rows="10"></textarea>
        </p>                    

        <p class="submit"><button type="submit">Send</button></p>       

    </fieldset>                 

</form> 

Как мне избавиться от формата списка определений и использовать вместо него макет на основе тегов абзаца?

Обновление. Можно ли применить этот стиль ко всем созданным мною формам? вместо того, чтобы применять декораторы к каждой форме?


person Andrew    schedule 26.10.2009    source источник


Ответы (2)


Если вы хотите изменить элементы вашей формы, вам необходимо сбросить декораторы вашей формы и ее элементы.

Пример включения поля в p-тег

class Default_Form_Contact extends Zend_Form 
{
    public function init()
    {
        $name = new Zend_Form_Element_Text('name');
        $name->setLabel('Name:')
             ->setDecorators(
                array(
                  array('ViewHelper', array('helper' => 'formText')),
                  'Errors',
                  array('Description', array('tag' => 'p', 'class' => 'description')),
                  array('HtmlTag', array('tag' => 'p', 'id'  => 'name-element')),
                  array('Label', array('class' => 'label')),
                )
              ); 
        $this->addElement($name);
    }    
}

Какие декораторы вам действительно нужны, вы должны продумать сами. Для декораторов форм вы можете сделать это в init ()

$this->setDecorators(array(some decorators));
person Peter Smit    schedule 26.10.2009
comment
есть ли способ применить это глобально? - person Andrew; 27.10.2009
comment
Вы можете создать подклассы всех классов Zend_Element и перегрузить loadDefaultDecorators. - person Peter Smit; 27.10.2009

Через некоторое время я просто сдался и использовал только декоратор ViewRenderer. Вот хороший пост, объясняющий, как это сделать (http://weierophinney.net/matthew/archives/215-Rendering-Zend_Form-decorators-individually.html). Остальная часть этой серии также хороша, если вы действительно хотите знать, как использовать декораторы.

С помощью декоратора ViewRenderer вы в основном визуализируете свою форму по шаблону (в отличие от самого MVC). Таким образом, вы получаете полный контроль над всем, но, конечно, то, что вы получаете в гибкости, вы теряете в RAD и компенсируете сложность.

person blockhead    schedule 26.10.2009