Ошибка встроенных форм Symfony 2 ArrayCollection - PullRequest
2 голосов
/ 01 ноября 2011

Мне нужно создать многоязычную таблицу, поэтому я выбираю эту схему:

Article ( id, name_translation_fk)

Translation ( id )

Translation_Text (id, language, translation_fk, text)

Теперь мне нужно добавить имена на разных языках для статьи, которая уже существует.Doctrine выдает мне такую ​​ошибку:


Catchable Fatal Error: Аргумент 1 передается в Doctrine \ Common \ Collections \ ArrayCollection :: __ construct () должен быть массивом, заданный объект должен вызываться в * / vendor / doctrine/lib/Doctrine/ORM/UnitOfWork.php в строке 416 и определено в * / vendor / doctrine-common / lib / Doctrine / Common / Collections / ArrayCollection.php строка 46


Понятия не имеюв чем может быть проблема, поскольку все сущности хорошо объявлены. Я думаю, что проблема находится где-то в классе форм.

Я разместил ниже свои сущности, формы и представления.

Статья

 class Article
 {

  /**
   * @ORM\ManyToOne(targetEntity="Translation", inversedBy="article_name", cascade=  {"persist"})
   * @ORM\JoinColumn(name ="name", referencedColumnName="id")
   */
  protected $name;
 }

Перевод

class Translation
{

    /**
     * @ORM\OneToMany(targetEntity="Translation_Text", mappedBy="translation", cascade={"persist"})
     */
     public $translation_text;

    /**
    * @ORM\OneToMany(targetEntity="Article", mappedBy="name", cascade={"persist"})
    */
    protected $article_name;      

    public function __construct()
    {
        $this->translation_text = new ArrayCollection();
        $this->article_name = new ArrayCollection();
    }
 }

Translation_Text

class Translation_Text
{

/**
 * @ORM\ManyToOne(targetEntity="Language", inversedBy="translation_text")
 * @ORM\JoinColumn(name ="language_id", referencedColumnName="id")
 */
protected $language;

/**
 * @ORM\ManyToOne(targetEntity="Translation", inversedBy="translation_text")
 * @ORM\JoinColumn(name ="translation_id", referencedColumnName="id")
 */
protected $translation;
 }

TheФорма

class TranslationTextType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('text','text');                    
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Udo\WebserviceBundle\Entity\Translation_Text',
        );
    }

    public function getName()
    {
        return 'translation_text';
    }

}

class TranslationType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {            
        $builder->add('translation_text',new TranslationTextType());
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Udo\WebserviceBundle\Entity\Translation',
        );
    }

    public function getName()
    {
        return 'translation';
    }

}

class ArticleTranslationForm extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name',new TranslationType());
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Udo\WebserviceBundle\Entity\Article',
        );
    }

    public function getName()
    {
        return 'article';
    }
}

Контроллер

 $article = $em->getRepository('Udo\WebserviceBundle\Entity\Article')->find($id);
 $form = $this->createForm(new ArticleTranslationForm(),$article);

Вид формы

<form action="{{path('article_translate', { 'id': entity.id }) }}" method="post" {{        form_enctype(form) }}>
{{form_row(form.name.translation_text.text)}}
{{form_rest(form)}}
<input type="submit" />
</form>

1 Ответ

3 голосов
/ 04 января 2012

Поскольку это отношение один ко многим, вы должны использовать collection :

$builder->add('translation_text', 'collection', array('type' => new TranslationTextType()));

вместо:

$builder->add('translation_text',new TranslationTextType());
...