2015-12-16 4 views
13

Obecnie mam tabele artykułów i tagów. Próbuję automatycznie wypełnić element formularza "Tag" jako pole wyboru w formularzu artykułu. Jaki jest najlepszy sposób na ustawienie opcji wartości pola wyboru znaczników z tabeli bazy danych, a następnie artykuł będzie automatycznie wiązał dane znacznika podczas wywołania metody "bind"?Wypełnianie danych dotyczących relacji w Zend Framework 2 Forms za pomocą konstruktora adnotacji

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

co zrobiłem

ciągu ArticleController::editAction(), mam dynamicznie dodawane opcje wartości do tagów element w formularzu.

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

Wydaje mi się to nadmierną ilością kodu w moim kontrolerze, wiem, że to nie w porządku, ale nie jestem pewien, jak to zrobić lepiej. Być może przy użyciu FormBuilder, który ustawia opcje wartości dla elementów Tag?

Dzięki.

+0

Nie sądzę, że to możliwe. –

Odpowiedz

2

Sprawdź ten poradnik: https://samsonasik.wordpress.com/2014/05/22/zend-framework-2-using-doctrinemoduleformelementobjectselect-and-custom-repository/

Zasadniczo trzeba określić repozytorium klasy w tagu-Podmiotów Podmiot adnotacji tak:

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

Następnie można użyć Doktryny DoctrineModule \ Form \ Element \ ObjectSelect Typ, który będzie w stanie dostarczyć żądaną funkcję:

Article.php (Uwaga na @Form \ Adnotacje typu i dodatkowy @Form \ Opcje Wpisy)

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

Również sprawdzić https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md więcej informacji o ObjectSelect

W końcu trzeba będzie budować swoją postać za pomocą

DoctrineORMModule\Form\Annotation\AnnotationBuilder 

zamiast Zends AnnotationBuilder w celu rozwiązania object_manager zależności.

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

To powinno wystarczyć.

+0

Dziękuję bardzo! To działało jak czar. –

Powiązane problemy