2013-06-18 17 views
7

Nella documentazione c'è un modo in Symfony per customize a Individual field, basato sul nome/id del widget.Symfony Twig personalizza un campo Individuale per una collezione

{% form_theme form _self %} 

{% block _product_name_widget %} 
    <div class="text_widget"> 
     {{ block('field_widget') }} 
    </div> 
{% endblock %} 

{{ form_widget(form.name) }} 

Qui, il frammento _product_name_widget definisce il modello da utilizzare per il campo cui id è product_name (e nome è prodotto [nome]).

Questo funziona per un normale widget, ma non se un widget si trova all'interno di una raccolta. A causa delle colonne in più. In questo modo:

name="productbundle_product_type[foobar][1][value]" id="productbundle_product_type_foobar_1_value" 

Qual è il modo per far funzionare la personalizzazione Twig all'interno della raccolta?

ho pensato qualcosa di simile, ma questo non funziona:

{% for db in edit_form.list %} 
    {% block _productbundle_product_type_foobar_{{ db.name }}_widget %} 
     <div class="text_widget"> 
      {{ block('field_widget') }} 
     </div> 
    {% endblock %} 
{% endfor %} 

Anche il seguente non funziona:

{% _productbundle_product_type_foobar_1_value_widget %} 

Qual è il modo per farlo funzionare?

+0

E se usi '{% block _productbundle_product_type_foobar_1 _ {{db.name}} _ widget%}' (con '_1_') – cheesemacfly

+0

no, anche il seguente non funziona:' {% _productbundle_product_type_foobar_1_value_widget%} ' – user2382765

+0

Sono sorpreso perché il documento afferma: 'Qui, il frammento _product_name_widget definisce il modello da utilizzare per il campo il cui id è nome_prodotto (e il nome è prodotto [nome]).' Quindi se il nome del widget è 'productbundle_product_type [foobar] [1] [valore] 'dovresti essere in grado di usare' {% block _productbundle_product_type_foobar_1_value_widget%} ' – cheesemacfly

risposta

3

stavo lavorando su un progetto un paio di sere fa e incontrato proprio questo problema - la soluzione che ho trovato è un paio di blocchi che assomigliano a questo (spogliato di codice specifico progetto):

{# Collection markup #} 
{% block my_collection_widget %} 
    {# Customise collection row prototype for allow_add #} 
    {% if prototype is defined %} 
     {% set data_prototype = block('my_collection_item_widget') %} 
     <div id="my_prototype" data-prototype="{{ data_prototype }}" style="display: none"></div> 
    {% endif %} 

    {% for prototype in form %} 
     {{ block('my_collection_item_widget') }} 
    {% endfor %} 
{% endblock my_collection_widget %} 

{# Collection row markup #} 
{% block my_collection_item_widget %} 
    {# Collection contains simple, single type #} 
    {{ form_errors(prototype) }} 
    {{ form_label(prototype) }} 
    {{ form_widget(prototype) }} 

    {# OR #} 

    {# Collection contains a compound type, render child types independantly #} 
    {{ form_errors(prototype.inner_widget) }} 
    {{ form_label(prototype.inner_widget) }} 
    {{ form_widget(prototype.inner_widget) }} 
{% endblock my_collection_item_widget %} 
+0

'Metodo "inner_widget" non esiste'. Metodo "inner_widget". Quale deve essere il nome di My_collection_widget? _productbundle_product_type_foobar_widget non funziona. Suppongo che non soddisfi i requisiti di cui ho bisogno. – user2382765

+0

Sostituisci "my_collection" in entrambi i blocchi con il nome della raccolta nel modulo che stai rendendo. All'interno del blocco * _item_widget viene fornito il markup personalizzato per un singolo elemento nella raccolta; se la tua raccolta è semplice (un singolo tipo), chiama semplicemente {{form _ * (prototype)}} con qualsiasi markup personalizzato che desideri. Se la raccolta è più complessa (ogni elemento della raccolta contiene diversi tipi), l'esempio sopra mostra come personalizzare ciascun tipo incorporato. – ptlis

+0

Dove non nella stessa pagina immagino :-) Sto solo mostrando una collezione, senza la possibilità di aggiungere altro. '$ builder -> add ('foobar', 'collection', array ('type' => new ProductbundleProductType(),));' – user2382765

Problemi correlati