El primer reto consiste en encontrar el evento de Symfony adecuado para aplicar
esta nueva configuración a cualquier variable que se pase a la plantilla. En este
caso se utiliza el evento template.filter_parameters
, que se notifica justo
antes de mostrar una plantilla o un elemento parcial.
// lib/form/sfFormYamlEnhancer.class.php
class sfFormYamlEnhancer
{
public function connect(sfEventDispatcher $dispatcher)
{
$dispatcher->connect('template.filter_parameters',
array($this, 'filterParameters'));
}
public function filterParameters(sfEvent $event, $parameters)
{
foreach ($parameters as $name => $param)
{
if ($param instanceof sfForm && !$param->getOption('is_enhanced'))
{
$this->enhance($param);
$param->setOption('is_enhanced', true);
}
}
return $parameters;
}
public function enhance(sfForm $form)
{
// ...
}
}
Nota Como puedes observar, el código anterior comprueba la existencia de una
opción llamada is_enhanced
antes de aplicar la configuración a cada objeto
de formulario. De esta forma se evita aplicar dos veces la configuración a los
objetos que se pasan de una plantilla a un elemento parcial.
Esta clase encargada de mejorar los formularios debe conectarse a los eventos en la configuración de la aplicación:
// apps/frontend/config/frontendConfiguration.class.php
class frontendConfiguration extends sfApplicationConfiguration
{
public function initialize()
{
$enhancer = new sfFormYamlEnhancer($this->getConfigCache());
$enhancer->connect($this->dispatcher);
}
}
Ahora ya podemos aislar los formularios justo antes de que se pasen a la plantilla o elemento parcial, por lo que tenemos todo listo para hacer funcionar la nueva configuración de formularios. El último paso consiste en aplicar lo que se ha configurado en el archivo YAML.