Skip to content
This repository was archived by the owner on Mar 17, 2023. It is now read-only.

Repository files navigation

FPNTagBundle

This bundle adds tagging to your Symfony project, with the ability to associate tags with any number of different entities. This bundle integrates the DoctrineExtensions-Taggable library, which handles most of the hard work.

Navigation

  1. Installation
  2. Making an entity taggable
  3. Using Tags

Installation

Use Composer

You can use composer to add the bundle :

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

Or you can edit your composer.json, and add :

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

Register the bundle

To start using the bundle, register it in your Kernel. This file is usually located at app/AppKernel:

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

Create your Tag and Tagging entities

To use this bundle, you'll need to create two new entities: Tag and Tagging. You place these in any bundle, but each should look like this:

<?phpnamespaceAcme\TagBundle\Entity;
useFPN\TagBundle\Entity\TagasBaseTag;
class Tag extends BaseTag
{
}
<?phpnamespaceAcme\TagBundle\Entity;
use \FPN\TagBundle\Entity\TaggingasBaseTagging;
class Tagging extends BaseTagging
{
}

Next, you'll need to add a little bit of mapping information. One way to do this is to create the following two XML files and place them in the Resources/config/doctrine directory of your bundle:

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

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mappingxmlns="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">
<entityname="Acme\TagBundle\Entity\Tag"table="acme_tag">
<idname="id"column="id"type="integer">
<generatorstrategy="AUTO" />
</id>
<one-to-manyfield="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-mappingxmlns="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">
<entityname="Acme\TagBundle\Entity\Tagging"table="acme_tagging">
<idname="id"column="id"type="integer">
<generatorstrategy="AUTO" />
</id>
<many-to-onefield="tag"target-entity="Acme\TagBundle\Entity\Tag">
<join-columns>
<join-columnname="tag_id"referenced-column-name="id" />
</join-columns>
</many-to-one>
<unique-constraints>
<unique-constraintcolumns="tag_id,resource_type,resource_id"name="tagging_idx" />
</unique-constraints>
</entity>
</doctrine-mapping>

You can also use Annotations :

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

namespaceAcme\TagBundle\Entity;
use \FPN\TagBundle\Entity\TagasBaseTag;
useDoctrine\ORM\MappingasORM;
/** * 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:

namespaceAcme\TagBundle\Entity;
use \FPN\TagBundle\Entity\TaggingasBaseTagging;
useDoctrine\ORM\MappingasORM;
useDoctrine\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;
}

Define classes on configuration

On your configuration you have to define tag and tagging classes.

Example on yaml:

fpn_tag:
model:
tag_class: Acme\TagBundle\Entity\Tagtagging_class: Acme\TagBundle\Entity\Tagging

Making an Entity Taggable

Suppose we have a Post entity, and we want to make it "taggable". The setup is simple: just add the Taggable interface and add the necessary 3 methods:

<?phpnamespaceAcme\BlogBundle\Entity;
useDoctrineExtensions\Taggable\Taggable;
useDoctrine\Common\Collections\ArrayCollection;
useDoctrine\ORM\MappingasORM;
/** * @ORM\Entity * @ORM\Table(name="acme_post") */class Post implements Taggable
{
private$tags;
publicfunctiongetTags()
{
$this->tags = $this->tags ?: newArrayCollection();
return$this->tags;
}
publicfunctiongetTaggableType()
{
return'acme_tag';
}
publicfunctiongetTaggableId()
{
return$this->getId();
}
}

That's it! As you'll see in the next section, the tag manager can now manage the tags that are associated with your entity.

Using Tags

The bundle works by using a "tag manager", which is responsible for creating tags and adding them to your entities. For some really good usage instructions, see Using TagManager.

Basically, the idea is this. Instead of setting tags directly on your entity (e.g. Post), you'll use the tag manager to set the tags for you. Let's see how this looks from inside a controller. The tag manager is available as the fpn_tag.tag_manager service:

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);
}

About

This bundle allows to tag your Doctrine entities easily

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages