Symfony2表单嵌入实体问题

时间:2011-08-12 03:14:43

标签: doctrine-orm symfony symfony-forms

我的表单中有两个对象,Scene及其Background。页面的大部分是新Scene的表单,我有一个角落,其中有缩略图和文件输入字段。每当更改文件字段时,它都会将映像上载到创建Background实体并保持不变的服务器。然后它返回实体的Id,我将其存储在表单中的隐藏字段中。

当我提交此内容时,它告诉我我正在尝试在Scene#setBackground方法中存储字符串。如果我从hidden表单类的background字段中删除SceneType属性,则会呈现<select>框,一切正常。我添加hidden属性,并发布相同的数据,我得到上述错误。

SceneType:

class SceneType extends AbstractType {
    public function getName () {
        return 'scene';
    }

    public function buildForm (FormBuilder $builder, array $options) {
        $builder->add('name');
        $builder->add('description');
        $builder->add('panoramic', null, array('required' => false));
        $builder->add('revealable', null, array('required' => false));
        $builder->add('left', 'hidden');
        $builder->add('right', 'hidden');
        $builder->add('background', 'hidden');
    }
}

Relevant section of Entity\Scene:

class Scene {
    /**
     * @ORM\OneToOne(
     *      targetEntity="Company\ProductBundle\Entity\Scene\Background",
     *      inversedBy="scene"
     * )
     * @ORM\JoinColumn(
     *      name="scene_background_id",
     *      referencedColumnName="id",
     *      nullable=false,
     *      onDelete="cascade",
     *      onUpdate="cascade"
     * )
     */
    protected $background;
    public function getBackground () {
        return $this->background;
    }
    public function setBackground (Background $background) {
        $this->background = $background;
    }
}

Error message:

Catchable Fatal Error: Argument 1 passed to 
Company\ProductBundle\Entity\Scene::setBackground() must be an instance of 
Company\Company\Entity\Scene\Background, string given, called in 
/srv/http/symulator/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php
on line 346 and defined in 
/srv/http/symulator/src/Noinc/SimulatorBundle/Entity/Scene.php line 143

1 个答案:

答案 0 :(得分:2)

  

我的表单中有两个对象,一个场景及其背景。该   页面的大部分是新场景的形式,我有一个   角落里有缩略图和文件输入字段。每当   文件字段被更改,它将图像上传到服务器所在的位置   后台实体已创建并保留。场景然后得到   与该背景相关联。现在,有了背景设置,我只   需要担心通过表单修改我的场景属性。

我不认为在表格中传递隐藏的id是必要的;你应该能够在表格之外坚持这种联想。希望你考虑这种方法。

如果您必须使用自己的方式,则需要制作一个BackgroundType表单,然后将该表单添加到SceneType表单中:

$builder->add('background', new BackgroundType());

我假设BackgroundType()将呈现隐藏的id字段。