Symfony 2.7.7 - 表单集"注意:未定义的索引:pageId"

时间:2015-12-08 23:22:42

标签: php symfony doctrine-orm symfony-forms

尝试生成一个表单,其中它将是一个内容的集合,但遗憾的是遗忘了她的错误,不知道我们如何恢复。

给我错误

  

注意:未定义的索引:pageId

     

500内部服务器错误 - ContextErrorException

页面实体:

class Page
{
    private $id;
    private $name;
    /**
     * @ORM\OneToMany(targetEntity = "PageContent", mappedBy = "pageId")
     */
    private $content;
}

PageContent实体:

class PageContent
{
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity = "Page", inversedBy = "page_content")
     * @ORM\JoinColumn(name = "page_id", referencedColumnName = "id", onDelete = "SET NULL")
     */
    private $page;
    private $name;
}

EditPageContentsType:

<?php
namespace Eteam\SettingsBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EditPageContentsType extends AbstractType
{
    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'EditPageContents';
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('pageContentMap')
            ->add('content', 'collection', array(
                'type' => new PageContentType(),
                'options'  => array(
                    'required'  => false
                ),
                'allow_add' => true
            ));

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Eteam\PageBundle\Entity\Page',
        ));
    }
}

PageContentType:

<?php
namespace Eteam\SettingsBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PageContentType extends AbstractType
{

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'pageContent';
    }

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

        $builder
            ->add('name', 'text', array(
                'label' => 'Test'
            ))
            ->add('content')
            ->add('type')
            ->add('pageId');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Eteam\PageBundle\Entity\PageContent',
        ));
    }
}

我将非常感谢你的帮助。

因此,我是Synfony 2的初学者,请不要点击否定。感谢。

P.S。

如果您需要更多信息,请告诉我们。

1 个答案:

答案 0 :(得分:1)

首先,您的注释是错误的。

页面应该是:

 * @ORM\OneToMany(targetEntity = "PageContent", mappedBy = "page")

PageContent应该是:

 * @ORM\ManyToOne(targetEntity = "Page", inversedBy = "content")

mappedBy和inversedBy by与关系对象的属性名称直接相关,必须相同。

其次,由于PageContent是Page的孩子,因此您在PageContentType中不需要pageId。这是一种更好的做事方式。

在EditPageContentsType中,添加选项'by_reference' => false see here for why

然后在Page

中更改addContent()方法
public function addContent(PageContent $pageContent)
{
    $pageContent->setPage($this);

    $this->content->add($pageContent);
}

与addTag示例类似,向下in this document

这使您可以轻松地将Page与PageContent实体关联。我建议您仔细阅读forms documentation,因为您会看到很多这样的事情。