捆绑文档解释了如何加载简单对象的标记:
$this->tagManager->loadTagging($article);
但我需要加载带有标签的可标记资源列表(来自学说查询的 ArrayCollection)。然后遍历 twig 中的集合并打印: Object: tag1, tag2, tag..n
捆绑文档解释了如何加载简单对象的标记:
$this->tagManager->loadTagging($article);
但我需要加载带有标签的可标记资源列表(来自学说查询的 ArrayCollection)。然后遍历 twig 中的集合并打印: Object: tag1, tag2, tag..n
旧帖子,但希望这个答案会对某人有所帮助,因为我在尝试实现标记包时遇到了同样的问题。问题是您的实体将具有标签的私有或受保护属性,但是文档在包上读取的方式,该属性没有关联映射,并且它不是实际字段(列)。因此,无论是在控制器中还是在 Twig 中,尝试访问 tags 属性或在实体上使用 getTags 方法都行不通。我觉得捆绑包上的文档可能缺少 tags 属性上的一些映射注释,但我无法准确缩小它应该是什么。
我最终采用了其他几个人推荐的方法,通过在控制器中循环我的实体,并使用标签管理器为每个实体加载标签。我还做的结果证明是有帮助的是将 setTags 方法添加到接受 ArrayCollection 的实体中,这样当循环通过控制器中的实体时,您可以在每个实体上设置标签,然后在树枝中访问它们你想做。例如:
将此 setTags 方法添加到您的实体:
/**
* @param ArrayCollection $tags
* @return $this
*/
public function setTags(ArrayCollection $tags)
{
$this->tags = $tags;
return $this;
}
这将允许您从控制器设置 tags 属性。
然后在你的控制器中:
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$posts = $em->getRepository('ContentBundle:Post')->findAll();
// here's the goods... loop thru each entity and set the tags
foreach ($posts as $post) {
$post->setTags($this->getTags($post));
}
// replace this example code with whatever you need
return $this->render('AppBundle::index.html.twig',array(
'posts' => $posts
));
}
/**
* @param Post $post
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getTags(Post $post) {
$tagManager = $this->get('fpn_tag.tag_manager');
$tagManager->loadTagging($post);
return $post->getTags();
}
此控制器中的 getTags 方法只是获取您的实体并使用 tagmanager 查找并返回它的标签。您将在 index 方法中看到将标签添加到每个实体的循环。
然后在 Twig 中,您可以在循环中的每个帖子上访问您的标签:
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% for tag in post.tags %}
<a href="{{ url('tag_detail',{'slug':tag.slug}) }}">{{ tag.name }}</a>
{% endfor %}
{% endfor %}
您可以遍历控制器中的集合,如下所示:
foreach($articles as $article){
$this->tagManager->loadTagging($article);
}