2015-12-16 13 views
13

Momentan habe ich Artikel- und Tag-Tabellen. Ich versuche, das Formularelement "Tag" automatisch als Auswahlfeld im Artikelformular zu füllen. Was ist der beste Weg, um die Werteoptionen des Tags-Auswahlfelds aus einer Datenbanktabelle zu setzen und dann den Artikel automatisch an die Tag-Daten während des Methodenaufrufs "bind" zu binden?Daten in Zend Framework 2 Formulare mit Annotation Builder füllen

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

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

was ich getan habe

Innerhalb ArticleController::editAction() habe ich hinzugefügt dynamisch die Wertoptionen zu den Tags Element auf dem Formular.

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

Dies scheint wie eine übermäßige Menge an Code in meinem Controller, ich weiß, es ist nicht richtig, aber ich bin nicht sicher, wie besser, dies zu tun. Möglicherweise einen FormBuilder verwenden, der die Wertoptionen für die Tag-Elemente festlegt?

Danke.

+0

Ich glaube nicht, dass das möglich ist. –

Antwort

2

dieser Anleitung erfahren: https://samsonasik.wordpress.com/2014/05/22/zend-framework-2-using-doctrinemoduleformelementobjectselect-and-custom-repository/

Grundsätzlich müssen Sie eine Repository-Klasse in Ihrer Tag-Entities Entity Annotation wie folgt angeben:

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

Dann können Sie Doctrines verwenden DoctrineModule \ Formular \ Element \ ObjectSelect Typ, der die gewünschte Funktion bereitstellen kann:

Article.php (Beachten Sie die @Form \ Type Annotation und die zusätzlichen @Form \ Options Einträge) überprüfen

... 
/** 
* 
* @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; 

Auch https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md für weitere Informationen über ObjectSelect

DoctrineORMModule\Form\Annotation\AnnotationBuilder 

statt Zends AnnotationBuilder um die object_manager zu lösen mit aus

Endlich müssen Sie Ihre Form bauen Abhängigkeiten.

/* 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); 

Dies sollte den Trick tun.

+0

Vielen Dank! Das hat wie ein Zauber funktioniert. –