Symfony2 - 为博客设置标签

时间:2014-05-09 05:37:46

标签: symfony tags blogs

Symfony2新手,有人可以就如何为博客网站设置标签给我一些建议吗?我将标签设置为它自己的实体,并通过ManyToMany关系将标签与博客实体相关联。

我的问题是如何在树枝上设置它?

换句话说,我有一个表格可以进入新博客,我是否只为输入标签设置了新表格?或者有没有办法将输入标签与博客创建表单结合起来?

1 个答案:

答案 0 :(得分:2)

标签只是一个唯一字符串列表。

前面:我使用Select2,有一个非常好的标记功能:http://ivaynberg.github.io/select2/。它会将一个字符串/返回给服务器,每个“标记”用逗号分隔:tag1,tag2,tag3。您还可以配置Web服务以研究现有标记。

返回:我创建一个DataTransformer(http://symfony.com/doc/current/cookbook/form/data_transformers.html)作为服务,然后在其中注入实体管理器:

class TagsTransformer implements DataTransformerInterface
{
    private $em;

    /**
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function transform($value)
    {
        if (null === $value) {
            return '';
        }

        if ($value instanceof Collection) {
            return implode(',', array_map(function (Tag $tag) {
                return (string)$tag;
            }, $value->toArray()));
        }

        return $value;
    }

    public function reverseTransform($value)
    {
        if (empty($value)) {
            return null;
        }

        if (is_string($value)) {
            $values = explode(',', $value);
            foreach ($values as &$value) {
                // Find or create it (create the method)
                $value = $this->em->getRepository('MySuperBundle:Tag')->findOrCreate(trim($value));
            }
            unset($value);

            return $values;
        }

        return $value;
    }
}

这个变压器的目标是:

  • 转换:从Doctrine获取Tags实体的ArrayCollection,并将其转换为简单的逗号分隔字符串
  • 反向:取一个简单的逗号分隔字符串并将其转换为唯一标记实体的数组

然后我们为标签创建一个Form(同样,作为服务,其中包含数据转换器):

class TagsType extends AbstractType
{
    private $tagsTransformer;

    /**
     * @param TagsTransformer $tagsTransformer
     */
    public function __construct(TagsTransformer $tagsTransformer)
    {
        $this->tagsTransformer = $tagsTransformer;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addModelTransformer($this->tagsTransformer);
    }

    public function getParent()
    {
        return 'text';
    }
}

最后,在您的表单(例如博客文章表单)中,您必须使用TagsType新“字段”。