juanmf/tag-bundle

FPN 标签包

安装: 19

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 50

类型:symfony-bundle

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

This package is not auto-updated.

Last update: 2024-09-24 06:46:45 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);
}