Zend_Framework: передача параметров массива в пользовательский фильтр - PullRequest
2 голосов
/ 11 августа 2009

Я не понимаю, как я могу отправить массив с опциями в мой пользовательский фильтр. Можете ли вы помочь мне?

class Core_Filter_MyFilter implements Zend_Filter_Interface

{   
    public function __construct($options = null)
    ...
}
class Blog_Form_Comment extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');
        $this->addElementPrefixPath('Core_Filter', 'Core/Filter/', 'filter');
        $this->addElement('textarea', 'entry', array(
            'filters' => array(MyFilter)));

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

Ответы [ 2 ]

4 голосов
/ 11 августа 2009

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

    $this->addElement('textarea', 'entry', array(
            'filters' => array(new Core_Filter_MyFilter($filterOptions))
    ));

Это работает и с методом addFilter().

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

    $this->addElement('textarea', 'entry', array(
            'filters' => array(
               array('MyFilter', array($filterOptions)
             )
    ));

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

1 голос
/ 12 августа 2009

Функция Zend_Form_Element::addFilters() может помочь вам немного понять этот процесс.

Переданный массив содержит один фильтр на элемент. Если этот элемент является строкой или экземпляром Zend_Filter_Interface, он передает его в addFilter () без 'options'

Если элемент является массивом, первый элемент которого становится именем фильтра, второй элемент становится параметрами. Массив опций используется в _loadFilter (), который передает массив опций в конструктор фильтра. Пример использования фильтра PregReplace:

//  Zend_Filter_PregReplace::__construct($matchPattern = null, $replacement = null)
$this->addElement('textarea', 'entry', array(
  'filters' => array(
     array('PregReplace', array('/test/', 'passed'))
   ),
);
// equivalent to:
$this->addElement('textarea', 'entry', array(
  'filters' => array(
     new Zend_Filter_PregReplace('/test', 'passed');
   ),
);

Если вы хотите передать массив в качестве первого аргумента, вам нужно заключить его в другой массив:

$this->addElement('textarea', 'entry', array(
   'filters'=>array(
       array('MyFilter', array(array(
          'option1'=>'test',
          'option2'=>'test',
       ))),
   ),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...