Symfony 2相关实体以1种形式出现

时间:2014-05-27 13:51:03

标签: forms symfony entities

我有2个实体,topicposttopic包含主题的名称。 post包含文本和主题ID。 我想在我的项目中实现一个函数,允许用户创建一个新主题并为他们的主题撰写帖子。

表单应如下所示:

  1. 主题名称[输入类型=文本](主题实体的属性)
  2. text [textarea](邮政实体的财产)
  3. 现在我需要帮助构建表单。只使用TopicType给我我想要的结果,只是没有输入字段来写一篇文章。我尝试添加

    $builder->add('post', 'entity', array('class' => 'MyTestBundle:Post', 'property' => 'text'));
    

    到我的PostType但是会创建以前帖子的下拉菜单。

    如何创建包含2个相关entites的所有输入字段的表单?

    编辑:

    Topic.orm.yml

    My\TestBundle\Entity\Topic:
    type: entity
    table: topics
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    
    
    oneToMany:
        posts:
            targetEntity: Post
            mappedBy: topic
    
    fields:
        name:
            type: string
            length: 50
    

    Post.orm.yml

    My\TestBundle\Entity\Post:
    type: entity
    table: posts
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    
    manyToOne:
        topic:
            targetEntity: Topic
            inversedBy: posts
            joinColumn:
                name: topic_id
                referencedColumnName: id
    
    
    fields:
        text:
             type: text
        datetime:
             type: datetime
    

    渲染表单适用于$builder->add('posts', new PostType());,但是当我提交表单时,我收到此错误:

    Warning: spl_object_hash() expects parameter 1 to be object, string given in C:\projects\symtests\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1375
    

    我究竟如何处理表单并将提交的数据保存到我的数据库?

    不幸的是我删除了应该将数据保存到数据库的代码,但它看起来像这样,并返回相同的错误。

    public function persistAction()
    {
        $topic= new Topic();
        $post = new Post();
    
        $topic->setCreateDate(new \Datetime('now'));
        // set all properties for $topic that you can't set in the form
    
        $post->setTopic($thread);
        $post->setDatetime(new \Datetime('now'));
        // set all properties for $psot that you can't set in the form
    
        $request = $this->getRequest();
    
        $form = $this->createForm(new ThreadType(), $thread);
        $form->bind($request);
    
        if($form->isValid())
        {
            $em = $this->getDoctrine()->getEntityManager();
    
            $em->persist($topic);
            $em->persist($post);
            $em->flush();
    
            return new Response('success');
        }
        else
        {
            throw new \Exception('form invalid');
        }
    

    也许我应该试试这个:How to Embed a Collection of Forms

1 个答案:

答案 0 :(得分:3)

TopicType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('posts', new PostType())
    ;
}

EDIT1 text 应该是Topic类中链接到Post类的属性的名称。

PostType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('text', 'textarea')        
    ;
}

EDIT2 :在您提供映射文件时,在text中将posts更改为TopicType.php;)