2012-07-02 6 views
5

Ho uno spazio difficile ( ) all'interno di alcune delle mie opzioni di scelta. In qualche modo, da qualche parte, stanno scappando. Ho provato:Symfony2 Lo scappamento automatico del Formbuilder?

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

Così come

{{ form_widget(foobar)|raw }} 

E il seguente sotto Twig in config.yml

autoescape: false 

Eppure i campi di scelta sono ancora resi come  Choice Text Here invece di Choice Text Here, e in la fonte che stanno codificando come  Choice Text Here

Nel controllore ho:

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

Se print_r$fooChoices ottengo:

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

Il che mi mostra la corretta   (notare il doppio spazio davanti degli anni '60). Da qualche parte tra il FormBuilder e il rendering, viene scappato.

Esiste l'escaping incorporato nel Form Builder?

Ciò che ho dedotto è che, attraverso il punto in cui la vista del modulo viene resa tramite $form->createView(), i dati non vengono ancora sottoposti a escape. Ma, quando raggiunge Twig tramite form_widget, è sfuggito. Fare form_widget(foobar)|raw mostra questo.

Modifica: ho aggiunto una soluzione alternativa come risposta, ma sono comunque interessato ad accettare una risposta che spiega come impedire che l'escape iniziale si verifichi del tutto.

+0

Posso vedere il codice del widget del modulo? Non c'è questa caratteristica. – Lusitanian

+0

@David Non sono sicuro di seguirlo. Sto usando il modo più semplice di eseguire il rendering di un modulo secondo i documenti: http://symfony.com/doc/current/book/forms.html#rendering-the-form – Nick

+0

Intendo all'interno della classe in cui generi il tuo forma, mi dispiace per l'ambiguità. – Lusitanian

risposta

8

Ho incontrato lo stesso problema con le etichette radio. Questo lo risolve.

{% for child in form %} 

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

    {{ form_widget(child) }} 

{% endfor %} 
1

Probabilmente non è la soluzione migliore, ma per quanto riguarda farlo nel costruttore del form (Forziamo   essere un char spazio):

public function __construct() { 

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

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

E se è necessario decodificare le virgolette (ad esempio, '), è possibile utilizzare 'htmlspecialchars_decode ($ string, ENT_QUOTES)' – geoB

3

ho finito per creare un'estensione Twig che decodifica codificato HTML e ha aggiunto come servizio:

L'estensione in Venditore/Bundle/Extensions/Twig

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

Registrazione del servizio nel Venditore/Bundle/Resources/config/services.yml

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

L'utilizzo:

{{ form_widget(foobar)|htmldecode }} 

io ancora non so dove è in corso la fuga , poiché viene eseguito solo sui dati stessi (e ho provato a creare un evento di dati per modificare i dati del modulo), ma questo almeno mi dà il risultato finale che sto cercando.

+0

Ho provato questo codice e registrato l'estensione di ramoscello, ma non risolve il problema quando si applica esclusivamente a ' form_label'. Devi applicarlo a 'form_widget' – Dean

3

cosa si ha realmente dovrebbe fare è finita a cavallo del modello 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 l'aggiunta delle sezioni autoescape.

Problemi correlati