2014-09-23 4 views
7

Я работаю над той страницей, на которой я хотел бы отобразить экземпляр объекта, например phpMyAdmin.Создание сетки форм в Symfony 2

Более конкретно, я хотел бы получить таблицу, в которой столбцы являются полями объекта, а строки - это все экземпляры этого объекта и делают все значения (кроме id) доступными для редактирования и сохраняют их в базе данных.

Моя проблема заключается в том, что я действительно не знаю, что является хорошей практикой для этого и что возможно с Symfony (я совершенно новый с этой структурой).

  • Моя первая идея состояла в том, чтобы создать единую форму, но это, кажется, трудно объединить несколько экземпляров в одной форме.

  • Я также решил создать форму для каждой строки, но это означает, что каждая строка будет иметь свое собственное поле «отправить», и было бы невозможно сохранить изменения более чем в одной строке одновременно.

  • В документе Symfony я видел тему о коллекциях форм, но я не знаю, могу ли я это использовать, поскольку экземпляры моего объекта полностью независимы.

Ну, я думаю, что я не первый хотел сделать это, но я не смог найти способ сделать это, может быть, я что-то отсутствует?

Любые советы приветствуются, спасибо!

ответ

4

Doing «А ЛЯ Symfony» вы можете создать базовую форму, например AllRowsType, который имеет поле коллекции типа, и каждая из строк имеет тип ROWTYPE:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder    
      ->add('rows', 'collection', array(
       'type' => new RowType(), 
       'allow_add' => false, 
       'allow_delete' => false, 
       'by_reference' => false 
      )); 
    } 

Тогда ваш RowType будет нормальной формой для вашей организации.

class RowType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder    
      ->add('name', 'text'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\Bundle\DemoBundle\Entity\Row', 
     )); 
    } } 

В валидация может быть на вашем ROWTYPE как нормальной форме, но если у вас есть проблемы, вы можете установить cascade_validation => истинна на параметры по умолчанию вашего AllRowsType.

Повторить каждый ROWTYPE в прута вы можете сделать:

{% for row in form.rows%} {{ form_row(row.name) }} {% endfor %} 

На веточке, чтобы получить идентификатор каждой строки объекта вы можете сделать:

{{ row.vars.value.id }} 

на контроллере, вы можете сделать $allrowsForm->get('rows')->getData(), и у вас есть ArrayCollection Строчных объектов и делайте все, что хотите.

Вы можете прочитать http://symfony.com/doc/current/cookbook/form/form_collections.html, как обращаться с коллекцией форм.

+0

Большое спасибо за этот подробный ответ. Я пытаюсь это сделать. – ibi0tux

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