Zend: Как добавить Decorators к элементу формы, используя addElement () в качестве фабрики? - PullRequest
1 голос
/ 31 января 2012

Как видно из названия, у меня есть вопрос, касающийся декораторов в Zend Framework. Пожалуйста, рассмотрите следующий пример кода:

$this->addElement('select', 'DisplayUntil', array(
    'label' => 'Display until:',
    'multiOptions' => $this->getOptions(),
    'filters' => array(
        'HTMLEntities',
        'StringTrim',
    ),
    'validators' => array(
        'Int',
    ),
));

Это мой предпочтительный метод добавления элементов в форму. Пытаясь установить лучшие практики, я стандартизировал использование фабричных методов, а не цепочку методов. Зачем? Лично я нахожу это намного более читабельным, и это сокращает длину моего пользовательского класса формы, то есть меньше кода. Приведенный выше пример прекрасно работает, однако мне трудно найти документацию или примеры, в которых тот же метод используется для добавления декораторов. Поэтому, используя тот же фрагмент кода, я предполагал, что при добавлении декораторов вы сделаете следующее:

$this->addElement('select', 'DisplayUntil', array(
    'label' => 'Display until:',
    'multiOptions' => $this->getOptions(),
    'filters' => array(
        'HTMLEntities',
        'StringTrim',
    ),
    'validators' => array(
        'Int',
    ),
    'decorators' => array(
        'ViewHelper', 
        'Label' => array(
            'tag' => 'dt'
        ),
        'HtmlTag' => array(
            'tag' => 'div',
            'openOnly' => true,
            'id' => 'divDisplayUntil',
            'placement' => 'prepend',
        ),
    ),
));

К сожалению, я получаю сообщение об ошибке «Плагин с именем« Dt »не найден в реестре; используются пути: Zend_Form_Decorator_: Zend / Form / Decorator /». Я довольно новичок в Zend, и я был бы признателен, если бы кто-нибудь показал мне, как заставить работать предыдущий пример кода? Этот метод вообще возможен?

Спасибо!

1 Ответ

2 голосов
/ 31 января 2012

Кажется, у декораторов есть еще один слой массивов.Это из руководства 1.1x:

$this->addDecorators(array(
    array('ViewHelper'),
    array('Errors'),
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag', array('tag' => 'dd')),
    array('Label', array('tag' => 'dt')),
));

Так что в вашем случае попробуйте

'decorators' => array(
    array('ViewHelper'), 
    array('Label', array(
        'tag' => 'dt'
        )
    ),
    array('HtmlTag', array(
        'tag' => 'div',
        'openOnly' => true,
        'id' => 'divDisplayUntil',
        'placement' => 'prepend',
        )
    ),
),
...