В настоящее время я создаю свой собственный набор элементов формы с помощью Zend_Form и хочу, чтобы все мои элементы в моей пользовательской форме могли использовать мои собственные декораторы
Итак, я создал пользовательскую форму, подобную этой:
<?php
class Nuke_Form extends Zend_Form
{
public function __construct($options = null)
{
$this->addElementPrefixPath('Nuke_Form_Decorator_TwitterBootstrap', 'Nuke/Form/Decorator/TwitterBootstrap/', 'decorator');
parent::__construct($options);
}
}
И ради полноты, это мой Декоратор
<?php
class Nuke_Form_Decorator_TwitterBootstrap_ControlGroup extends Zend_Form_Decorator_Abstract
{
public function render($content)
{
$class = $this->getOption('class') ?: "control-group";
$element = $this->getElement();
$errors = $element->getMessages();
if (!empty($errors)) {
$class .= " error";
}
$output = '<div class="' . $class . '">' . $content . '</div>';
return $output;
}
}
и конкретная реализация формы, которую я создаю в моих контроллерах
class App_Form_Index_Test extends Nuke_Form
{
public function init()
{
parent::init();
$this->addAttribs(array('class' => 'form-horizontal'));
$username = new Nuke_Form_Element_Text('username');
$username->setLabel("Gebruikersnaam")
->setDescription("This is a description")
->setRequired(true)
->addValidator('NotEmpty', true)
->addValidator('int');
$submit = new Zend_Form_Element_Submit('submit');
$this->addElements(array($username, $submit));
}
}
Но по какой-то причине Элементы не могут найти Декораторы и выдают следующее исключение:
Message: Plugin by name 'ControlGroup' was not found in the registry; used paths: Zend_Form_Decorator_: Zend/Form/Decorator/
Анализируя исключение, я вижу, что мой путь к плагину не добавлен, хотя я добавил его явно, используя addElementPrefixPath () в классе Nuke_Form.
Странно то, что когда я добавляю PluginPath к каждому из моих пользовательских элементов в отдельности, он работает безупречно, как показано ниже.
<?php
class Nuke_Form_Element_Text extends Zend_Form_Element_Text
{
public function init()
{
$this->addPrefixPath('Nuke_Form_Decorator_TwitterBootstrap', 'Nuke/Form/Decorator/TwitterBootstrap/', 'decorator');
$this->addDecorators(array(
array('ViewHelper', array(
'helper' => 'formText'
)),
array('Errors'),
array('Description', array(
'placement' => Zend_Form_Decorator_Abstract::APPEND,
'class' => 'help-block'
)),
array(array('controls' => 'HtmlTag'), array(
'tag' => 'div',
'class' => 'controls',
)),
array('Label', array(
'class' => 'control-label',
'requiredSuffix' => ' *',
'placement' => Zend_Form_Decorator_Abstract::PREPEND
)),
array('ControlGroup')
));
}
}
Я использую последнюю версию Zend Framework (v1.11.11).
После некоторого исследования я заметил, что addElementPrefixPath () добавит путь ко всем добавленным элементам формы при вызове, я думаю, именно поэтому он не будет работать при вызове его в конструкторе Nuke_Form, поскольку в то время ни один элемент не имел был добавлен еще. Но как мы должны использовать этот метод тогда? Я нашел несколько примеров в сети, которые с успехом вызывают его в конструкторе. Я озадачен или что-то упускаю из виду.