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.
Ich glaube nicht, dass das möglich ist. –