Использование нескольких фильтров PregReplace в элементе Zend Form - PullRequest
9 голосов
/ 15 июля 2011

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

$word = new Zend_Form_Element_Text('word');
$word->addFilter('PregReplace', array(
        'match' => '/bob/', 
        'replace' => 'john'
    ));
$this->addElement($word);

Я пробовал

$word = new Zend_Form_Element_Text('word');
$word->addFilter('PregReplace', array(
        'match' => '/bob/', 
        'replace' => 'john'
    ));
$word->addFilter('PregReplace', array(
        'match' => '/sam/', 
        'replace' => 'dave'
    ));
$this->addElement($word);    

, но это означало, что работал только второй фильтр.добавить несколько фильтров PregReplace?

Ответы [ 4 ]

6 голосов
/ 03 апреля 2012

Проблема, с которой вы сталкиваетесь, заключается в том, что второй фильтр переопределит первый в стеке фильтров ($this->_filters), определенных в Zend_Form_Element.

Как отметил Дэвид в комментариях к вопросу, в стеке фильтров в качестве индекса используются имена фильтров ($this->_filters[$name] = $filter;), поэтому второй фильтр переопределяет первый.

Для решения этой проблемы вы можете использовать пользовательский фильтр следующим образом:

$element->addFilter('callback', function($v) { return preg_replace(array('/bob/', '/sam/'),array('john', 'dave'), $v); });

Это делается с помощью встроенной функции () , если вы не используете PHP версии 5.3 или выше, вы можете настроить свой обратный вызов, чтобы он работал:

$element->addFilter('callback', array('callback' => array($this, 'funcName')));

И добавьте под вашей init() метод в вашей форме:

function funcName($v) {
    return preg_replace(array('/bob/', '/sam/'), array('john', 'dave'), $v);
}

Наконец, если вы хотите использовать только фильтр PregReplace, в отличие от ответа Марцина (синтаксис неверен), вы все равно можете сделать это следующим образом:

$element->addFilter('pregReplace', array(
          array('match' => array('/bob/', '/sam/'),
                'replace' => array('john', 'dave')
)));

Это должно сработать;)

1 голос
/ 15 июля 2011

Так как PregReplace использует функцию php preg_replace , я думаю, что это возможно (preg_replace может принимать массивы шаблонов и массив соответствующих строк замены):

$word = new Zend_Form_Element_Text('word');
$word->addFilter('PregReplace', array(
        'match'   => array('/bob/', '/sam/'), 
        'replace' => array('john' ,  dave)
    ));
$this->addElement($word);

Я не проверял это все же.Надеюсь, это сработает.

0 голосов
/ 13 августа 2013

Я искал тот же ответ не имеет пригодной для использования версии

$word->addFilter(new Zend_Filter_PregReplace(new Zend_Config(array(
 'match'=>array('/bob/', '/sam/'),
 'replace'=>array('john', 'dave')
))));
0 голосов
/ 31 января 2012

Мне не удалось заставить предыдущий пример работать с PregReplace.Вместо этого я переключился на его вызов с новым Zend_Filter_PregReplace ().Теперь это работает для меня.

$word->addFilter(new Zend_Filter_PregReplace(array(
                'match' => array('/bob/', '/sam/'), 
                'replace'=> array('john', 'dave'))
));
...