加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 嵌套的Symfony2表单:$options [‘data’] =嵌套形式的nu

发布时间:2020-12-13 16:46:08 所属栏目:PHP教程 来源:网络整理
导读:由于围绕这个主题的文档有点薄,我走到了尽头. 我有两个模型:Job和JobAttribute. Job有许多JobAttributes,JobAttribute有一个Job: class Job { /** * @ORMOneToMany(targetEntity="JobAttribute",mappedBy="job_attributes") * * @var ArrayCollection */
由于围绕这个主题的文档有点薄,我走到了尽头.

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

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

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

    /**
    * @ORMManyToOne(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' => 'JWFWorkflowBundleEntityJobAttribute');
    }

    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)?

提前致谢!

解决方法

在构建表单时,您不能依赖$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的文档.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读