2013-03-07 4 views
3

Я рассматривал различные похожие вопросы и ответы, но ни одна из них не подходит или не решает мою проблему. Я чувствую, что мне не хватает чего-то очевидного, потому что это кажется сумасшедшим простым и общим. Anyways:табличный вид объектов в symfony2 с веточкой

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

«сущность» формы типа, кажется естественным выбором, поэтому я определил тип формы, включая следующее:

$builder->add('items', 'entity', array(
     'multiple'=>true, 
     'expanded'=>true, 
     'class'=>'MySiteBundle:Item', 'property'=>'name', 'query_builder'=>function(EntityRepository $er) use ($catagory) { 
      return $er->createQueryBuilder('s')->where('s.category = :cat')->andWhere('s.available=true')->orderBy('s.name')->setParameters(array('cat'=>$category)); 
    })); 

Думая это будет каким-то образом дать мне доступ к сущности в веточке. Но независимо от того, что я пытаюсь, с помощью form.items.vars или .get («value») или двух десятков других вещей, предложенных для подобных вопросов, ничего не работает.

Все, что я хочу, это таблица с данными о позиции (имя, цена и т. Д. И т. Д.), И я не могу поверить, что это так сложно. Какую легкую, очевидную вещь мне не хватает?

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

ответ

3

Вы не можете получить доступ к объектам, расположенным за типом entity, из формы. Из-за этого вам нужно получить элементы в отдельном запросе. Чтобы сделать это легко, сделайте ключи массива элементов соответствуют их идентификаторам. Если вы отправляете массив items в шаблон, вы можете вывести его следующим образом:

<table> 
    {% for item in form.items %} 
     {% set id = item.get('value') %} 
     <tr> 
      <td>{{ form_widget(item) }}</td> 
      <td>{{ items[id].name }}</td> 
      <td>{{ items[id].category.name }}</td> 
      <td>{{ items[id].available ? 'Yes' : 'No' }}</td> 
      {# and so on ... #} 
     </tr> 
    {% endfor %} 
</table> 
+0

Спасибо, это правильный подход. Я хотел бы добавить, что использование индексированных ассоциаций (http://docs.doctrine-project.org/en/latest/tutorials/working-with-indexed-associations.html) делает это очень простым в реализации. – Tom

+0

Хм. Не знал об этом. Хорошо знать! :) –

+0

Было бы хорошо, если бы вы могли предоставить пример для 'make ключей массива элементов соответствуют их идентификаторам ' –

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