Автозагрузка Zend валидаторов и фильтров - PullRequest
2 голосов
/ 10 декабря 2011

Я пытаюсь установить префиксный путь для валидаторов и фильтров Zend Form автоматически. Я провел много исследований и нашел много решений, но я хочу, чтобы они всегда вступали в силу автоматически. Я знаю, что могу сделать это в форме:

$this->addElementPrefixPath('My_Validate', 'My/Validate/', 'validate');

или установите их для таких элементов, как

$input->addValidatorPrefixPath('Other_Namespace', 'Other/Namespace');
$input->addFilterPrefixPath('Foo_Namespace', 'Foo/Namespace');

но есть ли для них способ автоматически просмотреть то, что уже установлено в автозагрузчике и / или быть установлено в загрузчике (или в другом месте), без необходимости устанавливать его когда-либо снова?

Вот мой автозагрузчик:

// Autoload libraries
$autoloader = Zend_Loader_Autoloader::getInstance();    
$autoloader->registerNamespace('Lib1_')
   ->registerNamespace('Lib2_')
   ->registerNamespace('Lib3_');

Теперь, когда я добавляю валидатор, используя

->addValidator('CustomValidator', false, 1)

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

Спасибо!

1 Ответ

2 голосов
/ 11 февраля 2012

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

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

Важно отметить, что вы должны вызывать parent::__construct() в качестве самой последней строки, если ваша базовая форма __construct метод. Причина этого в том, что метод Zend_Form::init() вызывается Zend_Form::__construct() и после этого ничего из конструктора не запускается.

Вот пример:

<?php

class Application_Form_Base extends Zend_Form
{
    // decorator spec for form elements like text, select etc.
    public $elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false)),
        array('HtmlTag', array('class' => 'form-div')),
        array('Label', array('class' => 'form-label', 'requiredSuffix' => '*'))
    );

    // decorator spec for checkboxes
    public $checkboxDecorators = array(
        'ViewHelper',
        'Errors',
        array('Label', array('class' => 'form-label', 'style' => 'display: inline', 'requiredSuffix' => '*', 'placement' => 'APPEND')),
        array('HtmlTag', array('class' => 'form-div')),
        array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false, 'placement' => 'APPEND')),
    );

    // decorator spec for submits and buttons
    public $buttonDecorators = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'div', 'class' => 'form-button'))
    );

    public function __construct()
    {
        // set the <form> decorators
        $this->setDecorators(array(
                             'FormElements',
                             array('HtmlTag', array('tag' => 'div', 'class' => 'form')),
                             'Form'));

        // set this as the default decorator for all elements added to the form
        $this->setElementDecorators($this->elementDecorators, array('submit', 'button'), true);

        // add prefix paths for decorators and validators
        $this->addElementPrefixPath('My_Decorator', 'My/Decorator', 'decorator');
        $this->addElementPrefixPath('My_Validator', 'My/Validator', 'validate');

        parent::__construct();
        // parent::__construct must be called last because it calls $form->init()
        // and anything after it is not executed
    }
}
...