Following the example as documented in the following http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html
I need to populate subcategory field according to the category selection. I don't understand why this error at /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 don't understand what is the AddNameFieldSubscriber() function in the cookbook
The 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 don't understand what I have to put in customizeForm function. Please help me !! =)