Más con Symfony

14.3. Filtrando las variables de la plantilla

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.