Это такая банальная проблема, что я не могу поверить, что не смог найти ответ.
Symfony 2, учение 2.1. У меня есть две сущности и одна промежуточная сущность (таблица соединений). User, Pref и UsersPrefs. Pref table - это словарная таблица, так что я могу изменить имя pref только в одном месте. Хорошо, давайте посмотрим на картинку:
инфографика http://dl.dropbox.com/u/22495762/infographic.png
Как видите, я хочу иметь группу флажков, со всеми возможными вариантами (префсами) и предпочтительными вариантами. Таким образом, если пользователь выбрал 3 префа и только 2 выбрал, то должно быть 3 флажка, 2 выбраны.
Это просто, если сделать простой PHP - дважды запросить базу данных, чтобы получить список всех преферсов и пользовательских преференций, отобразить флажки в зависимости от значений, добавить некоторые действия для обработки отправки формы, готово.
Но ради жизни Бога я не могу заставить это работать, используя symfony & доктрину. Мне удалось добраться до точки, где я могу обновить отношения в доктрине и далее в базе данных, но для этого я использую необработанные значения запроса:
$data = $request->request->get('some_form');
а это якобы не так, как должно быть?
Morevoer, я полностью застрял в том, как я должен отображать список флажков. Я либо получаю список всех опций, ни один не отмеченный, или только пользовательские опции, все проверенные. Или набор результатов 'left join' с флажками для всех случаев, в любом случае бесполезный.
Я дошел до того, что попытался перегрузить шаблон флажка ветки, но не смог передать переменные в шаблон формы, и это было последней каплей ...
EDIT:
Таким образом, я получаю группу флажков, не связанных с выбором пользователя:
->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'
))
Я добавил массив $pref_ids
в сущности User. Теперь мне просто нужно установить значения в массиве в соответствии с предпочтениями, выбранными пользователем:
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();
и все.
Это лучшее, что я мог придумать. Вероятно, это слишком сложно и должно быть сделано совершенно по-другому. К сожалению, не смог понять этот «другой путь».