Symfony2 dynamic forms mongodb

Following the example described below, http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

I need to fill in a subcategory field according to the category selection. I do not understand why this error is in / article / create:

FatalErrorException: Error: Call to a member function getSubCategories() on a non-object 

The form:

 namespace Cc\HitoBundle\Form\Type; … class ArticleType extends AbstractType { private $registrationArticleListener; public function __construct(RegistrationArticleListener $registrationArticleListener) { $this->registrationArticleListener = $registrationArticleListener; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder … ->add('category', 'document', array( 'label' => 'Category', 'class' => 'Cc\HitoBundle\Document\Category', 'property' => 'name', )); $builder->addEventSubscriber($this->registrationArticleListener); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Cc\HitoBundle\Document\Article' )); } public function getName() { return 'article'; } } 

I do not understand what the AddNameFieldSubscriber () Function is in the cookbook

Listener:

 namespace Cc\HitoBundle\Form\EventListener; … class RegistrationArticleListener implements EventSubscriberInterface { /** * @var FormFactoryInterface */ private $factory; /** * @var DocumentManager */ private $dm; /** * @param factory FormFactoryInterface */ public function __construct(FormFactoryInterface $factory, $mongo) { $this->factory = $factory; $this->dm = $mongo->getManager(); } public static function getSubscribedEvents() { return array( FormEvents::PRE_BIND => 'preBind', FormEvents::PRE_SET_DATA => 'preSetData', ); } /** * @param event FormEvent */ public function preSetData(FormEvent $event) { $agent = $event->getData(); if (null === $article) { return; } $form = $event->getForm(); $subCategories = $article->getCategory()->getSubCategories(); $this->customizeForm($form, $subCategories); } public function preBind(FormEvent $event) { $data = $event->getData(); $id = $data['event']; $agent = $this->dm ->getRepository('CcHitoBundle:Article') ->find($id); if ($article === null) { $msg = 'The event %s could not be found for you registration'; throw new \Exception(sprintf($msg, $id)); } $form = $event->getForm(); $subCategories = $article->getCategory()->getSubCategories(); $this->customizeForm($form, $subCategories); } protected function customizeForm($form, $subCategories) { } } 

And I do not understand what I need to add to customizeForm. Please help me!! =)

+1
mongodb symfony doctrine-odm
source share
1 answer

You get an error different from the object because you are not actually creating the $ article variable in your preBind or preSetData functions. It looks like you are mixing $agent and $article

 public function preSetData(FormEvent $event) { //here you have $agent $agent = $event->getData(); //here you have $article if (null === $article) { return; } $form = $event->getForm(); //here you have $article $subCategories = $article->getCategory()->getSubCategories(); $this->customizeForm($form, $subCategories); } 

Change to:

 public function preSetData(FormEvent $event) { $article = $event->getData(); // We can only set subcategories if a category is set if (null === $article->getCategory()) { return; } $form = $event->getForm(); //... 

In setting up the form function, you want to add the necessary fields, for example, subcategories:

 //taken from the article OP referenced protected function customizeForm($form, $subCatQueryBuilder) { $formOptions = array( 'class' => 'You\YourBundle\Entity\SubCategory', 'multiple' => true, 'expanded' => false, 'property' => 'THE_FIELD_YOU_WANT_TO_SHOW', // I would create a query builder that selects the correct sub cats rather than pass through a collection of objects 'query_builder' => $subCatQueryBuilder, ); // create the field, this is similar the $builder->add() // field name, field type, data, options $form->add($this->factory->createNamed('subCategories', 'entity', null, $formOptions)); } 

For the query builder:

 /** * @param event FormEvent */ public function preSetData(FormEvent $event) { $agent = $event->getData(); if (null === $article->getCategory()) { return; } $form = $event->getForm(); //Something like $category = $article->getCategory(); $subCatQueryBuilder = $this->dm ->getRepository("YourCatBundle:Subcategory") ->createQueryBuilder("sc") ->join("sc.category", "c") ->where("c.id = :category") ->setParameter("category", $category->getId()); $this->customizeForm($form, $subCatQueryBuilder); } 
+1
source share

All Articles