2

バンドルのドキュメントでは、単純なオブジェクトのタグ付けをロードする方法について説明しています:

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

しかし、タグ付け可能なリソースのリスト (Doctrine クエリからの ArrayCollection) をタグ付きでロードする必要があります。その後、小枝と印刷でコレクションを反復処理します: Object: tag1, tag2, tag..n

4

2 に答える 2

2

古い投稿ですが、タグ付けバンドルを実装しようとして同じ問題に遭遇したため、この回答が誰かの役に立てば幸いです。問題は、エンティティにタグの非公開または保護されたプロパティがあることですが、ドキュメントがバンドルで読み取る方法では、このプロパティの関連付けマッピングがなく、実際のフィールド (列) ではありません。したがって、tags プロパティにアクセスしようとしたり、エンティティで getTags メソッドを使用しようとしても、コントローラーでも Twig でも機能しません。バンドルのドキュメントには、tags プロパティのマッピング アノテーションがいくつか欠けているように感じますが、それがどうあるべきかを正確に絞り込むことはできませんでした。

最終的に、コントローラーでエンティティをループし、各エンティティのタグマネージャーを使用してタグ付けをロードすることで、他の人が推奨するアプローチをいくつか採用しました。私が行ったのは、ArrayCollection を受け入れるエンティティに setTags メソッドを追加することでした。これにより、コントローラー内のエンティティをループするときに、それぞれにタグを設定し、小枝のようにアクセスできます。あなたがしたい。例えば:

この setTags メソッドをエンティティに追加します。

/**
 * @param ArrayCollection $tags
 * @return $this
 */
public function setTags(ArrayCollection $tags)
{
    $this->tags = $tags;

    return $this;
}

これにより、コントローラからタグ プロパティを設定できるようになります。

次に、コントローラーで:

/**
 * @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 %}
于 2016-08-26T01:50:59.480 に答える
0

次のように、コントローラーのコレクションを反復処理できます。

foreach($articles as $article){
    $this->tagManager->loadTagging($article);
} 
于 2012-10-23T12:56:49.733 に答える