嵌套的Symfony2表单:$ options ['data'] =嵌套形式的null?

时间:2012-07-17 14:48:52

标签: php symfony symfony-forms

由于围绕这个主题的文档有点薄,我走到了尽头。

我有两个模型:Job和JobAttribute。 Job有许多JobAttributes,JobAttribute有一个Job:

class Job {
    /**
     * @ORM\OneToMany(targetEntity="JobAttribute", mappedBy="job_attributes")
     *
     * @var ArrayCollection
     */
    private $attributes;
}

class JobAttribute {
    /**
    * @ORM\Column(name="type", type="string", length=50)
    * 
    * @var string
    */
    private $type;

    /**
    * @ORM\ManyToOne(targetEntity="Job", inversedBy="jobs")
    */
    private $job;

现在,我有以下FormClass:

class JobType extends AbstractType {
    public function buildForm(FormBuilder $f, array $options) {
        $f->add('name', 'text');
        $f->add('attributes', 'collection', array('type' => new JobAttributeType()));
    }

    public function getName() {
        return 'job';
    }
}

class JobAttributeType extends AbstractType {
    public function buildForm(FormBuilder $f, array $options) {
        $attribute = $options['data'];
        $f->add('value', $attribute->getType());
    }

    public function getDefaultOptions(array $options) {
        return array('data_class' => 'JWF\WorkflowBundle\Entity\JobAttribute');
    }

    public function getName() {
        return 'job_attribute';
    }
}

是的,确实,JobAttribute的type属性包含Form字段类型,例如。文本。

因此,当我在Controller中调用JobType上的FormBuilder时,$ options ['data']正确填充了JobType中的Job-Object。 但是嵌套的JobAttributeType的$ options ['data']并不指向JobAttribute对象。它是NULL。

有什么问题?协会失去了哪里?为什么嵌套表单中的$ options ['data'] = NULL? 是否存在一种解决方法,以便以嵌套的形式获取动态字段类型(从Doctrine中获取)?

提前致谢!

1 个答案:

答案 0 :(得分:3)

构建表单时不能依赖$options['data'],因为数据可以(并且将会)在构建后随时更改。您应该使用事件侦听器。

$formFactory = $builder->getFormFactory();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) {
    $form = $event->getForm();
    $data = $event->getData();

    if ($data instanceof JobAttribute) {
        $form->add($formFactory->createNamed('value', $data->getType());
    }
});

can be found in the cookbook的文档。