2015-06-15 3 views
5

solito modo di visualizzare select campo è quello di chiamareSymfony2/Twig - iterare selezionare le opzioni

{{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }} 

vorrei eseguire due cose:

  1. Verificare se questo campo è in realtà un campo di selezione
  2. Iterate su ogni opzione (valore, nome). So come funziona l'iteratore twig, ma non so come accedere alle opzioni select e assegnarle loro.

risposta

12
<select name="country"data-width="100%"> 
    {% for key,val in form.country.vars.choices %} 
     <option value="{{ val.value }}" {{ form.country.vars.value == '' and key == 0 ? ' selected ' :(val.value == form.country.vars.value ? ' selected ' : '') }}>{{ val.label | trans }}</option> 
    {% endfor %} 
</select> 
2
  1. È possibile utilizzare un'estensione ramoscello di aggiungere un ramoscello 'instanceof' operatore. Se non si ha familiarità con la creazione di estensioni ramoscello, consultare How to Write a Custom Twig Extension nei documenti Symfony. C'è un esempio che dà un esempio di Twig extension that implements an instanceof operator. Poi per verificare se un campo è un selezionare l'uso sul campo:

    {% if value is instanceof('ChoiceType') %} 
    
  2. Questo non è così semplice come si potrebbe pensare, perché i campi di scelta hanno così tante opzioni. Con Symfony è il tema del modulo che determina come i vari tipi di campi sono resi in html. Il tema del modulo predefinito è form_div_layout.html.twig. Ci vogliono circa 50 righe di codice per rendere un campo di scelta tenendo conto di tutte le opzioni, coperte dai blocchi choice_widget, choice_widget_expanded, choice_widget_collapsed and choice_widget_options. Puoi scegliere i bit necessari in base alle opzioni che hai impostato per il campo di scelta e incollarli nel tuo modello di ramoscello, ma l'impostazione delle opzioni di scelta nella classe del modulo non avrebbe alcun effetto. Il modo corretto di rendere personalizzate le opzioni di scelta (* assumendo che la selezione non sia espansa) consiste nel sostituire il blocco choice_widget_options dal tema del modulo. Form Customization è un argomento in sé, ma l'approccio più semplice è quello di ignorare il blocco come una tantum all'interno del modello di ramoscello e quindi modificarlo in base alle proprie esigenze, ad es.

    {% extends '::base.html.twig' %} 
    
    {% form_theme form _self %} 
    
    {%- block choice_widget_options -%} 
        {% for group_label, choice in options %} 
         {%- if choice is iterable -%} 
          <optgroup label="{{ choice_translation_domain is sameas(false) ? group_label : group_label|trans({}, choice_translation_domain) }}"> 
           {% set options = choice %} 
           {{- block('choice_widget_options') -}} 
          </optgroup> 
         {%- else -%} 
          {% set attr = choice.attr %} 
          <option value="{{ choice.value }}" {{ block('attributes') }}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is sameas(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option> 
         {%- endif -%} 
        {% endfor %} 
    {%- endblock choice_widget_options -%} 
    
    {% block content %} 
        {# ... render the form #} 
    
        {{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }} 
    {% endblock %} 
    

Se non è necessario personalizzare la resa del vostro campo scelta, ma desidera solo per ottenere i dati per fare qualcosa di diverso con esso, allora la cosa migliore da fare è passare i dati (cioè mappato al campo di scelta) al modello di ramoscello insieme al modulo e utilizzarlo direttamente. Se questa non è un'opzione, è possibile iterare sulle scelte come nel tema del modulo, anche se potrebbe essere necessario prendere in considerazione le scelte preferite. Il caso più semplice sarebbe ad es.

{% for choice in form.doctor_service_id.vars.choices %} 
    {{ choice.label }} 
    {{ choice.value }} 
{% endfor %}