嵌套形式:传递值

时间:2015-08-12 09:17:36

标签: symfony symfony-forms

我在Symfony嵌套表格中有点不知所措..

我有事件和角色条目,即人或组织可以对事件发挥的作用......

所以我有一个EventType表单,带有嵌套的RoleEntryType:

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


                    $form->add('roleEntries', 'collection', array(
                        'type'         => new RoleEntryType($data),
                        'allow_add'    => true,
                        'allow_delete' => true
                        ));
                }
            )

$ Data变量由RoleEntryType构造函数捕获:

$this->data=$data;

我尝试添加一个隐藏字段(因为用户不应该在字段中修改它):

 ->add($this->targetScope, 'hidden',  array('data'=>$this->data))

此时,Symfony不满意,因为它无法将$ data转换为字符串

在第13行的form_div_layout.html.twig中呈现模板期间抛出异常(“Catchable Fatal Error:类IH \ EventManagerBundle \ Entity \ Event的对象无法转换为字符串”) 。

所以我试着给它一个Id

 ->add($this->targetScope, 'hidden',  array('data'=>$this->data->getId()))

但它不起作用,因为字符串不够,它想要一个完全成熟的事件:

可捕获的致命错误:传递给IH \ EventManagerBundle \ Entity \ RoleEntry :: setEvent()的参数1必须是IH \ EventManagerBundle \ Entity \ Event的实例,在/ Users / MTP / Documents中调用给定的字符串第410行的/dev/MTP/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php并定义了

所以我猜我做错了......

帮助!

3 个答案:

答案 0 :(得分:0)

$ data包含表单数据,因此您需要提取字段值并将其作为隐藏字段的值传递:

$form->add('targetScope', 'hidden',  array('data' => $data['field_name']));

答案 1 :(得分:0)

如果不更改初始植入,只需向Event实体添加__to string()魔术方法,所有方法都应按预期工作

这样的东西
Class Event
{
    [...]
    public function __toString() 
    {
        return $this->name;
    }
}

当然$this->name;应根据您的对象属性进行更改。

如果您在发布表单时需要重新创建(或从db获取)实体对象,请查看DataTransformers

答案 2 :(得分:0)

感谢您的所有回复,

所以使用DataTransformer或创建一个新的字段类型(EntityHidden)都可以...但是,我的问题来自于我在代码中忘记的东西,这迫使我在FormType而不是实体中处理这个... < / p>

简单地说,没有必要将对应于嵌套表单(Event)的实体的主键传递给嵌套表单(RoleEntryType)...如果我告诉我的Event实体setter它应该写一个引用新RoleEntry中的事件:

public function addRoleEntry(
{
    $this->roleEntries[] = $roleEntry;

    $roleEntry->setEvent($this);

    return $this;
}

很抱歉,如果我的问题不清楚,感谢您花时间回答!