2013-06-20 2 views
0

У меня есть трудности со строительством формы в Symfony2 (v 2.2). Мне нужно что-то вроде формы листа данных со многими-ко-многим соединениями. Это выглядит сложным.Symfony2: сложный много-ко-многим или спецификация формы

У меня есть такие Сущности в БД:

  • игры
  • Поля
  • Значения
  • Категории

Связи между сущностями (PNG):

Значения содержат FKs для полей и категорий и имеют поле "value" witch Мне нужно сохранить в моей форме (см. Ниже). Поля содержат FK для игр.

Необходимость такой формы: PNG

Game1 
------------------------------------ 
      Field1 Field2 Field3 
Category1 x   x   x 
Category2 x   x   x 
Category3 x   x   x 

Game2 
------------------------------------ 
      Field1 Field2 Field3 
Category1 x   x   x 
Category2 x   x   x 
Category3 x   x   x 

x - <input type='text'> 

Каждая игра (показывать только название игры на странице) имеет изменяемую форму (вид таблицы), где заголовок смещ_по_столбцам содержит поле название (записи из полой таблицы) и строки заголовки содержат заголовок категории (см. таблицу категорий). В ячейках таблицы есть поля ввода, хранящиеся в таблице значений, которые мне нужно сохранить. Если в табличных значениях есть соответствующее значение, мы показываем его значение (и обновляем во время отправки формы). Если нет, тогда мы должны ввести значение и создать такую ​​запись в БД.

Я подумал:

  • игры типа настраиваемой формы, где игры нива типа коллекции
  • Каждая игра содержит значения пользовательской формы типа (или что-то вроде Категории стоимостей-полей)

Но в этом случае я даже не знаю, как построить в formBuilder список «Ценности» в списке «Игры».

Другой вопрос - как показать только значения из категорий и полей и не показывать никаких входов, потому что мне не нужно менять эти таблицы.

Дайте мне несколько советов о том, как построить такую ​​форму.

Спасибо

ответ

0

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

Я бы сначала создать некоторый тип игры, которые следуют, как ваши объекты связаны:

  • тип игры, который содержит коллекцию FieldType
  • FieldType, который содержит коллекцию ValueType
  • ValueType, который имеет два поля: текст для значения, и предприятие для категории

Чтобы подвести итог, в псевдокоде:

GameType : 
    $builder->add('fields', 'collection', array('type' => new FieldType()); 

FieldType : 
    $builder->add('values', 'collection', array('type' => new ValueType());); 

ValueType : 
    $builder->add('value', 'text'); 
    $builder->add('category', 'entity', array('class'=>'YourBundle:Category'); 

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

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

// In the controller 
$game = whateverYouDoToGetTheEntityFromDB(); 
$game->addDummyEmptyValues(); 
$form = $this->createForm(new GameType(), $game); 

Другой способ может быть, чтобы слушать формы событий PRE_SET_DATA и добавить недостающие данные там.

С помощью этого решения вы можете получить объект Value с пустым значением, если пользователь не вводит что-либо в поле. Вы можете удалить их в PRE_SUBMIT (называемом PRE_BIND в v2.0) прослушивателе событий (см. Это discussion).

Для вашего второго вопроса (не редактируемый дисплей) это должно быть проще: попробуйте реализовать вышеописанный цикл, но вместо отображения виджета формы покажите атрибуты сущностей. Вы можете начать с первого взгляда, чтобы заставить таблицу работать, а затем попытаться реализовать форму с этой рабочей основой.

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

  • Нет связанных вопросов^_^