Mam pewien problem z oprogramowaniem formularza w SF 3.1 z uwagi na to, że trochę wyszedłem poza relacyjność bazy danych.
Idea jest taka, że użytkownik ma możliwość dodawania wybranych produktów, zestawów produktów oraz harmonogramów dnia do "Ulubionych / Schowka".
W związku z tym zostały utworzone 4 tabele:
- product (przechowująca produkty)
- kit (zestawy produktów)
- workday (harmonogramy dnia)
- clipboard (ulubione "elementy" użytkownika).
Nie tworzyłem odrębnych tabel dla ulubionych produktów, ulubionych zestawów produktów, czy ulubionych harmonogramów dnia użytkownika.
Tabela clipboard ma m.in. następujące pola:
item_id (id produktu lub id zestawu produktów lub id harmonogramu dnia - w zależności od typu "elementu"; nie ma tu relacji z innymi tabelami)
type (typ "elementu" dodanego do "Ulubionych" - product lub kit lub workday)
user_id (id użytkownika)
Teraz w "symfoniastym" formularzu chcę wyświetlić pole typu select (przechowujące typy elementów) i w zależności od wybranej opcji wyświetlać dodatkowe pole, które będzie pobierało z bazy listę produktów lub listę zestawów produktów lub harmonogramy dnia, a następnie wyświetlało opcje do wyboru (do bazy danych ma "lecieć" tylko id elementu). W templatce z widokiem formularza do pracy zostanie poproszony Ajax, aby w zależności od dokonanego wyboru generować dynamicznie nowe pole select.
Dotychczas w ClipboardType.php mam coś takiego:
class ClipboardType extends AbstractType { { $builder ->add('user') ; $builder->addEventListener( FormEvents::PRE_SET_DATA, function (FormEvent $event) { $form = $event->getForm(); $data = $event->getData(); $type = $data->getType(); if ($type == 'product') { 'class' => 'DietBackendBundle:Product', 'choice_label' => 'name', 'multiple' => false, 'expanded' => false, 'group_by' => 'name', 'query_builder' => function (EntityRepository $er) { $queryBuilder = $er->createQueryBuilder('p'); $query = $queryBuilder ->where($queryBuilder->expr()->isNotNULL('p.name')) ; return $query; } )); } ); } public function configureOptions(OptionsResolver $resolver) { 'data_class' => 'Diet\BackendBundle\Entity\Clipboard' )); }
Czy ktoś bardziej doświadczony, podpowie czy to jest optymalne rozwiązanie i w jaki sposób zapisać id przykładowo wybranego produktu?
Będę wdzięczny za wskazówki.