2012-02-06 7 views
2

У меня есть коллекция скрытых полей в моей форме.Как настроить прототип данных в коллекциях форм symfony2?

<ul id="user_roles"> 
    <li><hidden field value="role1"></li> 
    <li><hidden field value="role2"></li> 
    (...) 
</ul> 

Я использую jQuery (и данные-прототип) для добавления новых ролей.

Проблема заключается в том, что я хотел бы, чтобы сделать что-то вроде этого:

<ul id="user_roles"> 
    <li>role1 <hidden field value="role1"></li> 
    <li>role2 <hidden field value="role2"></li> 
    (...) 
</ul> 

Нет проблем с начальным рендеринга: я просто положить:

{% for role in roles %} 
<li> {{ role }} {{ form_row(role) }} </li> 
{% endfor %} 

Но данные по умолчанию -prototype будет отображать только {{form_row (role)}} (скрытое поле).

Где я должен изменить прототип данных по умолчанию?

Там нет {% блок прототипа%} в form_div_layout.html, что я мог бы настроить ....

ответ

8

Коллекция виджетов определяется следующим образом:

{% block collection_widget %} 
{% spaceless %} 
    {% if prototype is defined %} 
     {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %} 
    {% endif %} 
    {{ block('form_widget') }} 
{% endspaceless %} 
{% endblock collection_widget %} 

Таким образом, вы можете изменить это получить контроль над тем, как вы хотите создать прототип.

1

Вы также можете получить доступ к прототипу из внутреннего шаблона, вызвав role.vars.prototype и использовать его позже в своем JS. Если вы хотите, чтобы поместить его в атрибут данных прототипа DIV (как это обычно отображается), вы должны помнить, чтобы избежать его:

<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}"> 
    {% for role in roles %} 
    <li> {{ role }} {{ form_row(role) }} </li> 
    {% endfor %} 
</div> 
0

Метод, рекомендуемый в docs позволяет легко настроить каждую коллекцию самостоятельно внутри ваше приложение, все в одном файле.

  • Создайте файл prototype_layout.html.twig:

    {% block _myform_mycollection_entry_row %} 
        <div class="row"> 
         <div class="col-sm-6">{{ form_row(form.title) }}</div> 
         <div class="col-sm-6">{{ form_row(form.author) }}</div> 
        </div> 
    {% endblock %} 
    

Название блока имеет важное значение. Первая часть будет _myform, если ваша родительская форма называется MyformType, а вторая часть _mycollection, если ваше поле формы, владеющее коллекцией, называется так. Для того, чтобы это работало, третья часть всегда должна быть _entry_row.

Например, если у вас есть UserType формы с коллекцией 'books' имя блока может быть _user_books_entry_row

Чтобы убедиться, что вы получили право имя, добавьте подчиненной (нажав на кнопку добавить, добавив субформ с javascript) и проверьте идентификатор соответствующего элемента select html с помощью инструмента-инспектора вашего браузера.

Если это выглядит как user_books_0_title, то имя блока будет _user_books_entry_row

  • Declare этот файл в качестве глобальной формы темы в разделе веточки config.yml:

    twig: 
        form_themes: 
         - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere 
    
  • Вы можете также используйте файл непосредственно в форме:

{% use "AppBundle:Form:prototype_layout.html.twig" %}

+0

Этот вопрос 5 лет ... – loostro