【问题标题】:hidden field : DataTransformer : GenemuFormBundle : Select2 : Deep Collection Form in Symfony2隐藏字段:DataTransformer:GenemuFormBundle:Select2:Symfony2 中的深度收集表单
【发布时间】:2014-04-07 18:41:04
【问题描述】:

数据结构:

我的\ExampleBundle\Entity\Parent:

oneToMany:
    children:
        targetEntity: Children
        mappedBy    : parent
        cascade     : ["persist", "remove"]
manyToMany:
    friends:
      targetEntity  : Friend
      inversedBy    : parents
      cascade       : ["persist"]
      joinTable     :
        name        : my_parents_and_friends
        joinColumns :
            joinColum:
                name                : parent_id
                referencedColumnName: id
                onDelete            : CASCADE
        inverseJoinColumns:
            joinColum:
                name                : friend_id
                referencedColumnName: id
                onDelete            : CASCADE

我的\ExampleBundle\Entity\Children:

manyToOne:
    parent:
        targetEntity: Parent
        inversedBy  : children
        joinColumn  :
            name                : parent_id
            referencedColumnName: id
manyToMany:
    friends:
      targetEntity  : Friend
      inversedBy    : children
      cascade       : ["persist"]
      joinTable     :
        name        : my_children_and_friends
        joinColumns :
            joinColum:
                name                : children_id
                referencedColumnName: id
                onDelete            : CASCADE
        inverseJoinColumns:
            joinColum:
                name                : friends_id
                referencedColumnName: id
                onDelete            : CASCADE

我的\ExampleBundle\实体\朋友:

manyToOne:
    school:
        targetEntity: My\SchoolBundle\Entity\School
        inversedBy  : friends
        joinColumn  :
            name                : school
            referencedColumnName: id
manyToMany:
    parents:
        targetEntity: Parent
        mappedBy    : friends
    children:
        targetEntity: Children
        mappedBy    : friends

我的\SchoolBundle\Entity\School:

oneToMany:
    friends:
        targetEntity: My\ExampleBundle\Entity\Friend
        mappedBy    : school
        cascade     : ["persist", "remove"]


我的\ExampleBundle\Controller\ParentController:

/**
 * Edit Action
 */
public function editAction(Request $request, $id)
{
    //...

    $form = $this->createForm(new ParentType($this->getUser()), $parent);

我的\ExampleBundle\Form\Type\ParentType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...

    $builder->add('children', 'collection', array(
        'type' => new ChildrenType($this->user),
        'options' => array(
            'required' => true,
        ),
        'allow_add'    => true,
        'by_reference' => false,
        'allow_delete' => true,
        'prototype'    => true
    ));
}

我的\ExampleBundle\Form\Type\ChildrenType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...

    $builder->add('friends', 'collection', array(
        'type'    => new FriendType($this->user),
        'options' => array(
            'required' => true,
        ),
        'allow_add'    => true,
        'by_reference' => false,
        'allow_delete' => true,
        'prototype'    => true
    ));

My\ExampleBundle\Form\Type\FriendType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...

    $builder->add('school', 'genemu_jqueryselect2_hidden');

ERROR:
    The form's view data is expected to be of type scalar,
    array or an instance of \ArrayAccess, but is an instance of class My\SchoolBundle\Entity\School.
    You can avoid this error by setting the "data_class" option to "My\SchoolBundle\Entity\School"
    or by adding a view transformer that transforms an instance of class My\SchoolBundle\Entity\School to scalar,
    array or an instance of \ArrayAccess. 

然后:
我的\ExampleBundle\Form\Type\FriendType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...

    $builder->add('school', 'genemu_jqueryselect2_hidden', array(
        'data_class' => 'My\SchoolBundle\Entity\School',
    ));

ERROR:
    ContextErrorException: Catchable Fatal Error: Object of class My\SchoolBundle\Entity\School could not be converted to string
    in /path/to/symfony2/app/cache/dev/twig/b5/df/83d3ad1c70181782da8626f8237b177e7063eb64a745f97ba87b9b8b025d.php line 323

    // View of Twig is simple like this:
    {{ form_widget(friend.school) }}

然后:
我不使用 GenemuFormBundle,我尝试创建个人数据转换器。

$transformer = new SchoolTransformer($this->entityManager);
$builder->add(
    $builder->create('school',
        'hidden',
        array(
            'by_reference' => false,
            'required'     => false,
            'attr'         => array(
                'class' => 'select2'
            ),
        )
    )->addModelTransformer($transformer)
);

ERROR: This is same error above.

所以我认为通常方法是实体字段,但我想为大量数据应用 select2。
但是,它未能生成表单的隐藏字段。

任何帮助或想法将不胜感激。

【问题讨论】:

    标签: php forms symfony symfony-2.3


    【解决方案1】:

    FriendType 不知道如何渲染学校实体,所以他尝试在其上调用 __toString() 方法,因为她没有实现你会得到这个错误。

    您可以设置 property_path 属性来定义应呈现的字段。 http://symfony.com/doc/master/reference/forms/types/hidden.html#property-path

    这样的事情应该可以解决你的问题:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //...
    
        $builder->add('school', 'genemu_jqueryselect2_hidden', array(
            'data_class' => 'My\SchoolBundle\Entity\School',
            'property_path' => 'id'
        ));
    }
    

    【讨论】:

    • 嗯...我明白了。谢谢你的建议。这也不错,我找到了一个很好的代码。 https://gist.github.com/bjo3rnf/4061232 这个“entity_hidden”代码很可能会成功。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多