2011-11-01 21 views
2

我要創建一個多語種的表,所以我選擇了這個模式:Symfony的2個嵌入表單的ArrayCollection錯誤

Article (id, name_translation_fk) 

Translation (id) 

Translation_Text (id, language, translation_fk, text) 

現在我需要添加不同語言的名稱爲媒體鏈接存在的文章。 學說給我此錯誤:


捕致命錯誤:傳遞給學說\共同\類別\ ArrayCollection的:: __構建體(參數1)必須給定一個數組,對象,稱爲* /供應商/教義/ LIB /教義/ ORM /上線416 UnitOfWork.php和* /供應商/學說-common/lib目錄/教義/通用/收藏/ ArrayCollection.php線定義的46


我不知道是什麼問題可能是因爲所有的實體都被很好地聲明瞭。我認爲這個問題是在Form類中的某個地方。

我在下面發佈了我的實體,表單和視圖。

文章

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; 
} 

形式

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

好吧,我不都拿到實體。你想要做的是文章m:n Translation_Text,這是正確的嗎?你想通過翻譯課程來完成嗎?那麼,Translation_Text中與語言的關係是什麼意思呢? – Sgoettschkes

回答

3

既然是ONT一對多的關係,你應該使用collection

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

代替:

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