2015-12-16 13 views
13

現在、記事とタグテーブルがあります。私は自動的に記事フォーム上の選択ボックスとして "タグ"フォーム要素を設定しようとしています。タグ選択セレクトボックスの値オプションをデータベーステーブルから設定し、「バインド」メソッドコール中にアーティクルを自動的にタグデータにバインドさせる最良の方法は何ですか?Zend Framework 2での関係データの読み込み注釈ビルダによるフォーム

Article.php

<?php 
// Article class 
class Article { 
    /** 
    * 
    * @var \Doctrine\Common\Collections\Collection|Tag[] 
    * 
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles") 
    * @Orm\JoinTable(name="rel_article_tag", joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="article_id")}, inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="tag_id")}) 
    * 
    * @Form\Required(false) 
    * @Form\Type("Zend\Form\Element\Select") 
    * @Form\Options({"label":"Tags: ") 
    * @Form\Attributes({"id":"tags", "data-placeholder":"Choose tags...", "multiple" : "multiple", "class" : "chosen-select"}) 
    */ 
    private $tags; 

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

    public function getTags() 
    { 
     return $this->tags; 
    } 

    public function addTags($tags) 
    { 
     $this->tags = $tags; 
    } 

    public function removeTags() 
    { 
     $this->tags = new ArrayCollection(); 
    } 
} 

ArticleController.php

私は ArticleController::editAction()

をやった

class ArticleController{ 
    public function editAction() 
    { 
     $builder = new AnnotationBuilder(); 
     $form = $builder->createForm(new TblArticle()); 

     $id = 1; 
     $article = $em->find('Admin\Entity\TblArticle', $id); 
     $form->bind($article); 
    } 
} 

は、私は、動的に値オプションを追加しましたタグに要素をフォームに追加します。

class ArticleController 
{ 
    public function editAction() 
    { 
     $builder = new AnnotationBuilder(); 
     $form = $builder->createForm(new TblArticle()); 

     // add tag options to form 
     $sm = $this->getServiceLocator(); 
     $em = $sm->get('Doctrine\ORM\EntityManager'); 
     $tags = $em->getRepository('Admin\Entity\LuTag')->findAll(); 
     $tagOptions = [null => '']; 
     foreach ($tags as $tag) { 
      $tagOptions[$tag->getTagId()] = $tag->getName(); 
     } 
     $form->get('tags')->setValueOptions($tagOptions); 
     // end add tag options to form 


     $id = 1; 
     $article = $em->find('Admin\Entity\TblArticle', $id); 
     $form->bind($article); 

     if ($article->getTags()) { 
      $tagIds = array(); 
      foreach ($article->getTags() as $tag) { 
       $tagIds[] = $tag->getTagId(); 
      } 
      $form->get('tags')->setValue($tagIds); 
     } 
    } 
} 

これは私のコントローラ内のコードの過剰のように思える、私はそれが正しくありません知っているが、私はより良いこれを行うするかどうかはわかりません。おそらく、Tag要素の値オプションを設定するFormBuilderを使用していますか?

ありがとうございました。

+0

私はこれが可能ではないと思います。 –

答えて

2

このチュートリアルをチェックアウト:https://samsonasik.wordpress.com/2014/05/22/zend-framework-2-using-doctrinemoduleformelementobjectselect-and-custom-repository/

基本的にはこのような自分のタグ・エンティティのエンティティ注釈リポジトリクラスを指定する必要があります。

@ORM\Entity(repositoryClass="Admin\Entity\LuTag") 

次に、あなたが教義DoctrineModule \フォーム\要素を使用することができます\要求された機能を提供できるObjectSelect Type:

Article.php(@Form \ Type Annotationと追加の@Form \ Optionsに注意してください。エントリー)

... 
/** 
* 
* @var \Doctrine\Common\Collections\Collection|Tag[] 
* 
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles") 
* @Orm\JoinTable(name="rel_article_tag", joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="article_id")}, inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="tag_id")}) 
* 
* @Form\Required(false) 
* @Form\Type("DoctrineModule\Form\Element\ObjectSelect")* 
* @Form\Options({"label":"Tags: ", "target_class": "Admin\Entity\LuTag", "property": "name"}) 
* @Form\Attributes({"id":"tags", "data-placeholder":"Choose tags...", "multiple" : "multiple", "class" : "chosen-select"}) 
*/ 
private $tags; 

また、あなたがobject_managerを解決するために、代わりにZends AnnotationBuilderの

DoctrineORMModule\Form\Annotation\AnnotationBuilder 

を使用して、フォームを構築する必要があります最後に

ObjectSelectの詳細については、 https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md をチェックアウト依存関係。

/* using the service manager like this within a controller method is 
bad practice. Inject the EntityManager using a Controller Factory! */ 
$sm = $this->getServiceLocator(); 
$em = $sm->get('Doctrine\ORM\EntityManager'); 

$builder = new DoctrineORMModule\Form\Annotation\AnnotationBuilder($em); 
$form = $builder->createForm(TblArticle::class); 

これはトリックを行う必要があります。

+0

ありがとう!これは魅力的に機能しました。 –