2015-12-16 24 views
13

Hiện tại, tôi có bảng bài viết và thẻ. Tôi đang cố gắng tự động điền phần tử biểu mẫu "Thẻ" làm hộp chọn trên biểu mẫu bài viết. Cách tốt nhất để đi về việc thiết lập các tùy chọn giá trị của các thẻ chọn hộp từ một bảng cơ sở dữ liệu và sau đó cũng có bài viết ràng buộc các dữ liệu thẻ tự động trong cuộc gọi phương thức "ràng buộc" là gì?Nhập dữ liệu quan hệ trong Biểu mẫu Zend 2 qua Trình tạo chú thích

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

gì tôi đã làm

Trong ArticleController::editAction(), tôi đã tự động thêm vào các tùy chọn giá trị vào các thẻ yếu tố trên biểu mẫu.

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

Điều này có vẻ như quá nhiều mã trong bộ điều khiển của tôi, tôi biết điều đó không đúng, nhưng tôi không biết cách làm tốt hơn. Có thể sử dụng FormBuilder để đặt các tùy chọn giá trị cho các phần tử Thẻ?

Cảm ơn.

+0

Tôi không nghĩ điều này là có thể. –

Trả lời

2

Kiểm tra hướng dẫn này: https://samsonasik.wordpress.com/2014/05/22/zend-framework-2-using-doctrinemoduleformelementobjectselect-and-custom-repository/

Về cơ bản bạn cần phải xác định một lớp kho tại của bạn Tag-Đối tượng Entity Chú như thế này:

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

Sau đó, bạn có thể sử dụng Giáo Lý DoctrineModule \ Mẫu \ Yếu tố \ Loại đối tượng chọn sẽ có thể cung cấp tính năng mà bạn yêu cầu:

Article.php (Lưu ý @Form \ Type Chú thích và bổ sung @Form \ Options mục)

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

Ngoài ra kiểm tra https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md để biết thêm thông tin về ObjectSelect

Cuối cùng bạn sẽ cần phải xây dựng hình thức của bạn sử dụng

DoctrineORMModule\Form\Annotation\AnnotationBuilder 

thay vì Zends AnnotationBuilder để giải quyết object_manager phụ thuộc.

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

Điều này cần thực hiện thủ thuật.

+0

Cảm ơn rất nhiều! Điều này làm việc như một say mê. –

Các vấn đề liên quan