使用FPNTagBundle在查询中加载标记

时间:2012-10-23 12:31:37

标签: symfony tags symfony-2.1

Bundle docs解释了如何加载一个简单对象的标记:

$this->tagManager->loadTagging($article);

但是我需要加载一个可标记资源的列表(来自doctrine查询的ArrayCollection)和它们的标签。然后在树枝上打印一个集合并打印:    对象:tag1,tag2,tag..n

2 个答案:

答案 0 :(得分:2)

旧帖子,但希望这个答案可以帮助某人,因为我遇到了同样的问题,试图实现标记包。问题是您的实体将具有标签的私有或受保护属性,但文档在捆绑包上读取的方式,此属性没有关联映射,并且它不是实际字段(列)。因此,尝试访问tags属性或在实体上使用getTags方法将无法在您的控制器或Twig中工作。我觉得bundle上的文档可能会遗漏在tags属性上的一些映射注释,但我无法准确缩小它应该是什么。

我最终通过在控制器中循环我的实体并使用tagmanager为每个实体加载标记来推荐其他几个推荐的方法。我也做了哪些有用的是将setTags方法添加到接受ArrayCollection的实体,这样当循环通过控制器中的实体时,你可以在每个上设置Tags,然后像twig一样访问它们你想做什么。例如:

将此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 %}

答案 1 :(得分:0)

您可以在控制器中迭代集合,如下所示:

foreach($articles as $article){
    $this->tagManager->loadTagging($article);
}