2013-05-06 3 views
1

Мне очень нужна ваша помощь в создании формы. У меня есть предприятие с $id, $name и $items Недвижимость. $items - многоToMany отношение. Тогда у меня есть два других объекта: группа и позиция. Оба имеют $id и $name. группа и субъект есть отношение к товар. Что-то вроде этого:Symfony2 сгруппированные элементы формы

 
Group 1     Entity 1 
|- Item 1    |- Item 1 
'- Item 2    |- Item 2 
         '- Item 3 

Group 2     Entity 2 
|- Item 3    |- Item 2 
'- Item 4    |- Item 3 
         '- Item 4 

Какой самый лучший способ создать форму для лица с сгруппированных элементов? Как это:

 
---------------------------------------------------- 
Group 1 
☑ Item 1    ☑ Item 2 
---------------------------------------------------- 
Group 2 
☑ Item 3    ☑ Item 4 

Пробовал Google, но, честно говоря, я понятия не имею, с чего начать:/

ответ

2

Хорошо ... Так я узнал, что group_by используется для получения OPTGROUP «S в <select>. Мои EntityType имеет:

$builder->add('item', 'entity' array(
    'class' => 'MyBundle:Item', 
    'property' => 'name', 
    'multiple' => true, 
    'expanded' => true, 
    'group_by' => 'group.name', 
); 

В моем шаблоне:

{% form_theme form 'MyBundle::form_theme.html.twig' %} 
{{ form_widget(form.item) }} 
{{ form_rest(form) }} 

В моей форме теме я просто пытался повторить choice_widget_collapsed, но есть некоторые различия (например .: проверка, если значение проверяется). Я не знаю, если это лучший способ сделать это, но это работает для меня. Может быть, потому, что я использую только item выбор сущности и никаких других полей ввода. Моя форма Тема:

{% block choice_widget_expanded %} 
{% spaceless %} 
    <div {{ block('widget_container_attributes') }}> 
     {% set options = choices %} 
     {{ block('choice_widget_expanded_options') }} 
    </div> 
{% endspaceless %} 
{% endblock choice_widget_expanded %} 

{% block choice_widget_expanded_options %} 
{% spaceless %} 
    {% for group_label, choice in options %} 
     {% if choice is iterable %} 
      <fieldset> 
       <legend>{{ group_label|trans({}, translation_domain) }}</legend> 
       {% set options = choice %} 
       {{ block('choice_widget_expanded_options') }} 
      </fieldset> 
     {% else %} 
      <input type="checkbox" name="{{ full_name }}[]" value="{{ choice.value }}"{% if value[choice.value] %} checked="checked"{% endif %}/> {{ choice.label|trans({}, translation_domain) }} 
     {% endif %} 
    {% endfor %} 
{% endspaceless %} 
{% endblock choice_widget_expanded_options %} 

Любые улучшения приветствуются.

0

В файле EntityType.php (это может быть auto-generated на основе ваших лиц), вы будете хотите entity field type как следующее:

$builder->add('item', 'entity' array(
    'class' => 'YourNameSpace:Item', 
    'property' => 'name', 
    'multiple' => true, 
    'expanded' => true, 
    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) { 
     return $er->createQueryBuilder('i') 
      ->where('i.group = 1'); 
    } 
); 

Очевидно, что вы должны будете сделать некоторые настройки, основываясь на вашей конкретной схемы и имена переменных. Это также требует двунаправленной связи между группой и предметом. Это также добавляет селектор для группы 1. Вам нужно будет добавить еще одну подобную вещь для вашей второй группы.

+0

Итак, сначала в моем «EntityType» мне нужно получить все группы, а затем вызвать '$ builder-> add()' для каждого из них? Тогда еще один вопрос - как отображать такие группы в ветке, потому что, если я правильно понимаю, у меня будет только _items_ в форме? – CRONUS

+0

OK. Я попробовал '$ builder-> add ('item', 'entity', array())' для каждой группы, просто изменяющей идентификатор группы, но в форме я просто получаю последние элементы группы. Угадайте, что это из-за того же имени '' item''. Пробовал '$ er-> createQueryBuilder ('i') -> где ('i.group = 1') -> orWhere ('i.group = 2')', но тогда я просто получаю все элементы этих групп. Невозможно определить, как группировать элементы в именах форм и групп выходных групп. – CRONUS

+0

Также попробовал '' group_by '=>' item.group'', но не успел. – CRONUS

Смежные вопросы