2009-08-11 2 views
2

Я не понимаю, как я могу отправить массив с параметрами моего настраиваемого фильтра. Не могли бы вы мне помочь?Zend_Framework: передать параметры массива произвольному фильтру

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))); 

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

ответ

4

Вместо того чтобы полагаться на 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) 
      ) 
    )); 

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

+0

Спасибо за большой ответ , – unkownt

1

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

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

Если элемент представляет собой массив, первый элемент которого становится именем фильтра, вторым элементом становятся параметры , Массив параметров используется в _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', 
     ))), 
    ), 
); 
Смежные вопросы