Symfony2新手,有人可以就如何为博客网站设置标签给我一些建议吗?我将标签设置为它自己的实体,并通过ManyToMany关系将标签与博客实体相关联。
我的问题是如何在树枝上设置它?
换句话说,我有一个表格可以进入新博客,我是否只为输入标签设置了新表格?或者有没有办法将输入标签与博客创建表单结合起来?
答案 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;
}
}
这个变压器的目标是:
然后我们为标签创建一个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
新“字段”。