php zend-framework zend-form zend-filter

php - Usar mĂșltiples filtros PregReplace en un elemento Zend Form



zend-framework zend-form (4)

Quiero poder agregar varios filtros PregReplace en un solo elemento Zend Form. Puedo agregar un filtro PregReplace usando el siguiente código:

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

He intentado

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

pero esto solo significaba que solo funcionaba el segundo filtro.

¿Cómo agrego varios filtros PregReplace?


Como PregReplace usa la función preg_replace de php, creo que algo así sería posible (preg_replace puede aceptar matrices de patrones y una matriz de cadenas de reemplazo correspondientes):

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

Aunque no lo he probado. Espero que funcione


El problema al que se enfrenta es que el segundo filtro anulará el primero en la pila de filtros ( $this->_filters ) definido en Zend_Form_Element.

Como David mencionó en los comentarios de la pregunta, la pila de filtros usa nombres de filtro como índice ( $this->_filters[$name] = $filter; ) esta es la razón por la que el segundo filtro reemplaza al primero.

Para resolver este problema, puede usar un filtro personalizado de la siguiente manera:

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

Esto se hace usando una función en línea () , en caso de que no esté utilizando PHP versión 5.3 o superior, puede configurar su devolución de llamada de la siguiente manera para que funcione:

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

Y agregue bajo su método init() en su forma:

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

Por último, si desea utilizar solo el filtro PregReplace, a diferencia de la respuesta de Marcin (la sintaxis es incorrecta), puede hacerlo de esta manera:

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

Eso debería hacer el truco ;)


Estaba buscando same-response no tiene una versión utilizable

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


No pude obtener el ejemplo anterior para trabajar con ''PregReplace''. En su lugar, cambié a llamarlo con el nuevo Zend_Filter_PregReplace (). Ahora funciona para mí.

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