Zend Framework: Настройка декораторов и меток - это должно быть сделано в представлении или классе формы? - PullRequest
4 голосов
/ 16 ноября 2010

Я заметил, что многие (большинство?) Люди, работая с Zend Framework, добавляют декораторы и метки в сам класс Form.

class User_Form_Add extends Zend_Form
{
    public function init()
    {
        parent::init();
        $username = new Zend_Form_Element_Text('username');
        $username->setLabel('Username:')
                 ->setRequired(true)
                 ->addFilter('StringTrim')
                 ->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30))
                 ->setDecorators(array(
                     'ViewHelper',
                     array('Description', array('tag' => 'p', 'class' => 'description')),
                     array('Label',       array('requiredPrefix'      => '<span class="asterisk">*</span>&nbsp;', 'escape' => false)),
                     array('HtmlTag',     array('tag' => 'p', 'class' => 'element'))
                 ));
    }
}

Но, конечно, это не хорошая практика? Я бы подумал, что декораторы и метки являются частью уровня представления в приложении MVC. Когда я смотрю на этот класс формы, он выглядит «разбитым» со всеми видами разметки, тегов и текста, которые должны быть в слое вида.

Этот подход означает, что если вам нужно поработать с разметкой вашей формы, вам нужно работать как с классом формы , так и с сценарием представления.

Мне не нравится эта концепция, и поэтому при рендеринге форм я разделяю формы и декораторы на подлинные сценарии представления. Я хочу, чтобы эти конфликтующие «проблемы» моего приложения были отделены друг от друга.

class User_Form_Add extends Zend_Form
{
    public function init()
    {
        parent::init();
        $username = new Zend_Form_Element_Text('username');
        $username->setRequired(true)
                 ->addFilter('StringTrim')
                 ->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30));
    }
}

// add.phtml:

$this->form->username->setLabel('Username:');
$this->form->username->setDecorators(array(
    'ViewHelper',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('Label',       array('requiredPrefix'      => '<span class="asterisk">*</span>&nbsp;', 'escape' => false)),
    array('HtmlTag',     array('tag' => 'p', 'class' => 'element'))
));

echo $this->form->render();

Это оставляет класс формы чистым и вполне аналогичным модельному классу - так я воспринимаю класс формы; Он содержит фильтры, валидаторы и т. Д., Которые связаны с бизнес-логикой.

Если вы затем следуете этому подходу, это упрощает интеграцию ваших форм с вашими моделями, так что вы можете повторно использовать / получать доступ к валидаторам и фильтрам форм непосредственно из ваших моделей - без дополнительных затрат на создание декораторов и тому подобное. .

http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html

Что касается сохранения ваших скриптов вида СУХИМ, чтобы вы не повторяли одни и те же метки и декораторы в нескольких представлениях (т. Е. Когда вам нужно визуализировать одну и ту же форму несколько раз, но в разных сценариях представления), я нахожу вас можно отделять повторно используемые части формы с помощью декоратора ViewScript, чтобы сохранить вещи СУХИМЫМИ.

РЕДАКТИРОВАТЬ : Кроме того, мы также можем переопределить декораторы по умолчанию на те, которые соответствуют нашему проекту, чтобы избежать необязательного объявления декораторов.

Итак, мой актуальный вопрос таков:

Почему никто не работает с такими формами? Какие недостатки вы видите для этого подхода?

Зачем создавать декораторы и метки форм в классе форм, если я могу так же легко добавить их в слой вида?

Я не понимаю, почему почти каждое использование Zend_Form, которое я вижу, включает добавление декораторов / меток в сам класс формы.

Ответы [ 4 ]

1 голос
/ 25 января 2012

Чтобы ответить на ваш вопрос о том, почему вы не видите, чтобы люди это делали, это потому, что это просто нехорошая практика.Форма должна заключать в себе всю логику формы, в основном модуль / виджет ... то, что вы только что сделали, разделило вашу форму, и теперь вам нужно беспокоиться о ваших ярлыках в представлении.Все это должно быть в вашей форме, поэтому вы можете установить метки, декораторы и т.д .. все в форме.

1 голос
/ 24 ноября 2010

Почему никто не работает с такими формами, как эта?

Я никогда не задумывался.Очень хороший подход.

0 голосов
/ 16 ноября 2010

Я думаю, что основная причина, по которой «кто-то еще не работает с такими формами», заключается в том, что по большей части сайт использует только один или два декоратора «по умолчанию». Если вы собираетесь декорировать входные данные одинаково 90% (возможно, меньше) времени, зачем вам объявлять его в каждом скрипте вида?

Как и ответ gokujou, я тоже создам собственный класс декоратора в моей библиотеке. См. Создание пользовательской разметки формы с использованием Zend_Form_Decorator

Мне нравится ваш подход, но я думаю, что он наиболее подходит для случаев, когда у вас есть отклонение от стандартного декоратора (ов). Если я использую одни и те же декораторы большую часть времени, я не хочу беспокоиться об их объявлении в моем скрипте вида.

0 голосов
/ 16 ноября 2010

Я обычно объявляю свои декораторы и тому подобное в классе в пользовательской библиотеке для проекта или в помощнике вида, который я могу затем вызывать в каждой форме и по-прежнему иметь все декораторы в одном месте, чтобы уменьшить объем необходимого кода для них.

...