fpn/tag-bundle

FPN 标签包

安装数: 391,672

依赖项: 5

建议者: 0

安全性: 0

星标: 76

关注者: 7

分支: 50

开放问题: 12

类型:symfony-bundle

v0.9.0 2014-05-07 06:49 UTC

This package is not auto-updated.

Last update: 2024-09-14 12:13:59 UTC


README

此包为您的 Symfony 项目添加了标签功能,可以与任意数量的不同实体关联标签。此包集成了 DoctrineExtensions-Taggable 库,该库处理了大部分复杂的工作。

导航

  1. 安装
  2. 使实体可标记
  3. 使用标签

安装

使用 Composer

您可以使用 composer 添加此包

``` sh
$ php composer.phar require fpn/tag-bundle
```

或者您可以直接编辑 composer.json 文件,并添加

"require": {
    "fpn/tag-bundle":"dev-master",
}

注册包

要开始使用此包,请在 Kernel 中注册它。此文件通常位于 app/AppKernel

public function registerBundles()
{
    $bundles = array(
        // ...
        new FPN\TagBundle\FPNTagBundle(),
    );
)

创建您的 TagTagging 实体

要使用此包,您需要创建两个新的实体:TagTagging。您可以将它们放置在任何包中,但每个都应如下所示

<?php

namespace Acme\TagBundle\Entity;

use FPN\TagBundle\Entity\Tag as BaseTag;

class Tag extends BaseTag
{
}
<?php

namespace Acme\TagBundle\Entity;

use \FPN\TagBundle\Entity\Tagging as BaseTagging;

class Tagging extends BaseTagging
{
}

接下来,您需要添加一些映射信息。一种方法是创建以下两个 XML 文件,并将它们放置在您的包的 Resources/config/doctrine 目录中

src/Acme/TagBundle/Resources/config/doctrine/Tag.orm.xml:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                  http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

    <entity name="Acme\TagBundle\Entity\Tag" table="acme_tag">

        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>

        <one-to-many field="tagging" target-entity="Acme\TagBundle\Entity\Tagging" mapped-by="tag" fetch="EAGER" />

    </entity>

</doctrine-mapping>

src/Acme/TagBundle/Resources/config/doctrine/Tagging.orm.xml:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                  http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

    <entity name="Acme\TagBundle\Entity\Tagging" table="acme_tagging">

        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>

        <many-to-one field="tag" target-entity="Acme\TagBundle\Entity\Tag">
            <join-columns>
                <join-column name="tag_id" referenced-column-name="id" />
            </join-columns>
        </many-to-one>

        <unique-constraints>
            <unique-constraint columns="tag_id,resource_type,resource_id" name="tagging_idx" />
        </unique-constraints>

    </entity>

</doctrine-mapping>

您还可以使用注解

src/Acme/TagBundle/Entity/Tag.php:

namespace Acme\TagBundle\Entity;

use \FPN\TagBundle\Entity\Tag as BaseTag;
use Doctrine\ORM\Mapping as ORM;

/**
 * Acme\TagBundle\Entity\Tag
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Tag extends BaseTag
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="Tagging", mappedBy="tag", fetch="EAGER")
     **/
    protected $tagging;
}

src/Acme/TagBundle/Entity/Tagging.php:

namespace Acme\TagBundle\Entity;

use \FPN\TagBundle\Entity\Tagging as BaseTagging;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * Acme\TagBundle\Entity\Tagging
 *
 * @ORM\Table(uniqueConstraints={@UniqueConstraint(name="tagging_idx", columns={"tag_id", "resource_type", "resource_id"})})
 * @ORM\Entity
 */
class Tagging extends BaseTagging
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Tag")
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
     **/
    protected $tag;
}

在配置中定义类

在您的配置中,您需要定义标签和标记类。

yaml 示例

fpn_tag:
    model:
        tag_class:     Acme\TagBundle\Entity\Tag
        tagging_class: Acme\TagBundle\Entity\Tagging

使实体可标记

假设我们有一个 Post 实体,并希望使其“可标记”。设置很简单:只需添加 Taggable 接口并添加必要的 3 个方法

<?php

namespace Acme\BlogBundle\Entity;

use DoctrineExtensions\Taggable\Taggable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="acme_post")
 */
class Post implements Taggable
{
    private $tags;
    
    public function getTags()
    {
        $this->tags = $this->tags ?: new ArrayCollection();

        return $this->tags;
    }

    public function getTaggableType()
    {
        return 'acme_tag';
    }

    public function getTaggableId()
    {
        return $this->getId();
    }
}

就这样!正如您将在下一节中看到的,标签管理器现在可以管理与您的实体关联的标签。

使用标签

此包通过使用“标签管理器”来工作,负责创建标签并将它们添加到您的实体中。有关一些很好的使用说明,请参阅 使用 TagManager

基本思路是这样的。您不是直接在您的实体(例如 Post)上设置标签,而是使用标签管理器来设置标签。让我们看看从控制器内部看起来是怎样的。标签管理器作为 fpn_tag.tag_manager 服务可用

use Acme\BlogBundle\Entity\Post;

public function createTagsAction()
{
    // create your entity
    $post = new Post();
    $post->setTitle('foo');

    $tagManager = $this->get('fpn_tag.tag_manager');

    // ask the tag manager to create a Tag object
    $fooTag = $tagManager->loadOrCreateTag('foo');

    // assign the foo tag to the post
    $tagManager->addTag($fooTag, $post);

    $em = $this->getDoctrine()->getEntityManager();

    // persist and flush the new post
    $em->persist($post);
    $em->flush();

    // after flushing the post, tell the tag manager to actually save the tags
    $tagManager->saveTagging($post);

    // ...

    // Load tagging ...
    $tagManager->loadTagging($post);
}