2012-07-02 10 views
5

Tengo un espacio difícil ( ) dentro de algunas de mis opciones de elección. De alguna manera, en algún lugar, se están escapando. He tratado:Symfony2 Formbuilder auto escaping?

{% autoescape false %} 
    {{ form_widget(foobar) }} 
{% endautoescape %}  

Así como

{{ form_widget(foobar)|raw }} 

Y lo siguiente bajo la ramita en config.yml

autoescape: false 

Sin embargo, los campos de selección todavía se representan como  Choice Text Here en lugar de Choice Text Here, y en la fuente que están codificando como  Choice Text Here

En el controlador que tengo:

$form ->add('foo', 'choice', array(
      'label' => 'Foo Label', 
      'choices' => $fooChoices, 
      'required' => true)); 
$form = $form->getForm(); 
$foobar = $form->createView(); 

Si print_r$fooChoices me sale:

Array ([1] => 60# FooBar [5] => 60# BatBar [11] => 60# DooWop) 

Lo que me muestra el buen   (nótese el doble de espacio delante de la década de los 60). En algún lugar entre FormBuilder y el renderizado, se está escapando.

¿Hay escapes integrados dentro del Creador de formularios?

Lo que he deducido es que a través del punto que la vista de formulario se procesa a través de $form->createView(), los datos aún no están guardados. Pero, cuando llega a Twig a través de form_widget, se ha escapado. Hacer form_widget(foobar)|raw muestra esto.

Editar: He agregado una solución como respuesta, pero todavía estoy interesado en aceptar una respuesta que explique cómo evitar que se produzca el escape inicial por completo.

+0

¿Puedo ver el código de su widget de formulario? No hay tal característica. – Lusitanian

+0

@David No estoy seguro de seguir. Estoy usando la forma más simple de renderizar un formulario de acuerdo con los documentos: http://symfony.com/doc/current/book/forms.html#rendering-the-form – Nick

+0

Me refiero a la clase donde generas tu forma, perdón por la ambigüedad. – Lusitanian

Respuesta

8

Me encontré con el mismo problema con las etiquetas de radio. Esto lo resuelve.

{% for child in form %} 

    {% autoescape false %} 
    {{ child.vars.label }} 
    {% endautoescape %} 

    {{ form_widget(child) }} 

{% endfor %} 
1

Probablemente no sea la mejor solución, pero lo que trata de hacer que en su forma constructor (forzamos   ser un char espacio):

public function __construct() { 

    foreach ($this->fooChoices as $key => $fooChoice) { 

     $this->fooChoices[$key] = html_entity_decode($fooChoice, ENT_NOQUOTES, 'UTF-8'); 
    } 
} 
+0

Y si necesita descodificar comillas (por ejemplo, '), puede usar 'htmlspecialchars_decode ($ string, ENT_QUOTES)' – geoB

3

he terminado la creación de una extensión de la ramita que decodifica codificada HTML y ha añadido como un servicio:

La extensión de Vendedor/Bundle/Extensiones/Ramita

namespace Vendor\Bundle\Extensions\Twig; 

class HTMLDecodeTwigExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array(
      'htmldecode' => new \Twig_Filter_Method($this, 'htmldecode', array(
       'is_safe' => array('html')) 
      ), 
     ); 
    } 

    // your custom function 
    public function htmldecode($string) 
    { 
     return html_entity_decode($string); 
    } 

    // Name for Service 
    public function getName() 
    { 
     return 'html_decode_twig_extension'; 
    } 
} 

Registro del servicio de proveedor/Bundle/Resources/config/services.yml

vendor_bundle.htmldecode: 
    class: Vendor\Bundle\Extensions\Twig\HTMLDecodeTwigExtension 
    tags: 
     - { name: twig.extension } 

El uso:

{{ form_widget(foobar)|htmldecode }} 

todavía no saben dónde se realiza el escape , ya que solo se realiza en los datos en sí (y traté de crear un evento de datos para modificar los datos del formulario), pero al menos esto me da el resultado final que estoy buscando.

+0

Probé este código y registré la extensión twig, pero no resuelve el problema cuando se aplica únicamente a ' form_label'. Tienes que aplicarlo al 'form_widget' – Dean

3

Lo que realmente debería estar haciendo es sobre-montar la plantilla form_label

{% block form_label %} 
{% spaceless %} 
    {% if label is not sameas(false) %} 
     {% if not compound %} 
      {% set label_attr = label_attr|merge({'for': id}) %} 
     {% endif %} 
     {% if required %} 
      {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %} 
     {% endif %} 
     {% if label is empty %} 
      {% set label = name|humanize %} 
     {% endif %} 
     {% autoescape false %}<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}</label>{% endautoescape %} 
    {% endif %} 
{% endspaceless %} 
{% endblock form_label %} 

Nota la adición de las secciones autoescape.

Cuestiones relacionadas