Symfony 2, доктрина 2.1. У меня есть две сущности и одна промежуточная сущность (объединяемая таблица). Пользователь, Pref и UsersPrefs. Таблица Pref — это таблица словаря, поэтому я могу изменить имя pref только в одном месте. Хорошо, давайте посмотрим картинку:
инфографика http://dl.dropbox.com/u/22495762/infographic.png
Как видите, я хочу иметь группу флажков со всеми возможными вариантами (предпочтениями) и предпочтительными вариантами. Итак, если есть 3 настройки и только 2 выбраны пользователем, должно быть 3 флажка, 2 выбраны.
Это просто, если сделать простой PHP-запрос к базе данных. дважды, чтобы получить список всех настроек и пользовательских настроек, отобразить флажки в зависимости от значений, добавить некоторые действия для обработки отправки формы, готово.
Но ради бога, я могу не заставить это работать, используя симфония и доктрина. Мне удалось дойти до того, что я могу обновлять отношения в доктрине и далее в базе данных, но для этого я использую необработанные значения запроса:
Код: Выделить всё
$data = $request->request->get('some_form');
Более того, я совсем застрял относительно того, как мне отображать список флажков. Я либо получаю список всех параметров, ни один из которых не выбран, либо только параметры пользователя, все проверены. Или набор результатов «объединенный слева» с флажками для всех случаев, в любом случае бесполезно.
Я дошел до того, что попытался перегрузить шаблон флажка ветки, но не смог не передал переменные в шаблон формы, и это было последней каплей...
РЕДАКТИРОВАТЬ:
Таким образом я получаю группу флажков, не связанных с пользователем выбор:
Код: Выделить всё
->add('prefs', 'entity', array(
'class' => 'Some\TestBundle\Entity\Pref',
'expanded' => 'true',
'multiple' => 'true',
'property' => 'name'
))
Код: Выделить всё
->add('prefs', 'entity', array(
'class' => 'Some\TestBundle\Entity\UserPrefs',
'multiple' => 'false',
'expanded' => 'false',
'property' => 'pref.name',
'query_builder' => function(EntityRepository $er) use ($id) {
return $er->createQueryBuilder('u')
->where("u.user = :id")
->setParameter('id', $id)
;
},
))
РЕДАКТИРОВАТЬ (ВОЗМОЖНОЕ РЕШЕНИЕ):
Я показываю группу флажков:
Код: Выделить всё
->add('pref_ids', 'choice', array(
'choices' => array(
'1' => 'pref one',
'2' => 'pref two',
'3' => 'pref three',
),
'expanded' => 'true',
'multiple' => 'true'
))
Код: Выделить всё
public function setPrefIds()
{
$prefs = $this->getPrefs();
$this->pref_ids = array();
foreach($prefs as $pref){
array_push($this->pref_ids, $pref->getPref()->getId());
}
return $this;
}
Запись значений в базу данных — это обратный процесс. Я получаю входные значения по запросу:
Код: Выделить всё
$data = $request->request->get('edit_form');
var_dump($data['pref_ids']);
Код: Выделить всё
foreach ($userPrefs as $pref){
$em->remove($pref);
}
Код: Выделить всё
$entity->setPrefsById($em, $data['pref_ids']);
Затем $em->flush(); и всё.
Это лучшее, что я смог придумать. Вероятно, это слишком сложно и нужно делать совершенно по-другому. К сожалению, не удалось найти этот «другой путь».
Подробнее здесь: https://stackoverflow.com/questions/941 ... e-entities
Мобильная версия