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