ここで、必要に応じてフォームを変更できます。
最初のフォームにはカテゴリが含まれています。ユーザーがカテゴリを選択すると、フォームが送信され (Ajax)、pre_bind のイベントでカテゴリが設定されているかどうかがチェックされ、設定されている場合はサブカテゴリ用の別のフィールドが追加されます
例えば:
class CategoryEventSubscriber implements EventSubscriberInterface
{
protected $factory;
public function __construct(FormFactory $factory)
{
$this->factory = $factory;
}
public function preBind(FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
$levelOne = isset($data['categoryLevelOne']) ? $data['categoryLevelOne'] : null;
if (!empty($levelOne)) {
$form->add($this->factory->createNamed('categoryLevelTwo'));
}
// level n+1 ...
}
public static function getSubscribedEvents()
{
return array(FormEvents::PRE_BIND => 'preBind');
}
}
フォームにイベント サブスクライバーを追加します。
$builder->addEventSubscriber(new CategoryEventSubscriber($builder->getFormFactory()));