ここで説明するように、フィールドを含めるかどうかを決定するためにフォームタイプによって使用されるSymfony2.0プロジェクトにイベントサブスクライバーを設定しました。
ただし、含めるかどうかを判断するために、エンティティ値をルートパラメータと比較したいと思います。
ここで説明するように、型を介して変数を渡すことは知っていますが、サブスクライバーから直接アクセスしたいと思います。
私のフォームタイプ:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Odst\Bundle\DyfieldBundle\Form\EventListener\DyfieldFilterSubscriber;
class DyStringFieldType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$subscriber = new DyfieldFilterSubscriber($builder->getFormFactory());
$builder->addEventSubscriber($subscriber);
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Odst\Bundle\DyfieldBundle\Entity\DyStringField',
);
}
public function getName()
{
return 'dyStringField';
}
}
私のイベント購読者:
use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;
use Odst\Bundle\DyfieldBundle\Form\Type\DyStringFieldType;
class DyfieldFilterSubscriber implements EventSubscriberInterface
{
private $factory;
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(FormEvents::PRE_SET_DATA => 'preSetData');
}
public function preSetData(DataEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$fieldPageNameId = $data->getModel()->getDyFieldSet()->getDyFieldPage()->getNameId();
// This doesn't work, but this is where I need to get the parameter
$pageNameId = $this->get('request')->get('pageNameId');
if ($pageNameId == $fieldPageNameId) {
$form->add($this->factory->createNamed('text', 'value'));
}
}
}
どうもありがとうございました。