我已将Tag实体(索引,创建,编辑等)的一系列功能定义为服务。当我在表单中创建帖子时,我添加字段"标签"包括与该帖子相关的标签。
我的问题是,如何实现我在TagManager中定义的功能?我想要使用的功能称为' newOrLoadTag'。如果在PostController或PostForm中,我不知道应该如何使用它。
我的第二个问题是,如何限制输入标签?我想要一个帖子最多有5个标签。我想我应该定义字段"标签"将Post实体作为大小为5的数组。这是最好的方法吗?如果是这样,我该如何实施呢?
答案 0 :(得分:0)
你应该禁止在客户端(js)-frontend端添加5个以上的标签,我个人会使用selected.js multiple select,或者tagsinput.js
你的函数newOrLoad在tagservice里面看起来像:
public function newOrLoadTag($tagName){
$foundTag=$tagRepo->findOneByName($tagName);
if($foundTag){
return $foundTag;
}else{
//should return instance of Tag
return $this->createTag($tagName)
}
}
在你的PostController中,你可以从请求中获取标签,让我们假设它是一个字符串,所选的标记名由“;”分隔。
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
$post=$form->getData();
// get tags from request
$tags=$request->get('tags') ? urldecode($request->get('tags')) : false;
// persist the post and remove all tags
$em->persist($post);
foreach ($entity->getTags() as $tag) {
$post->removeTag($tag);
}
// add all tags
if($tags){
$tags=explode(';', $tags);
$c=1;
foreach ($tags as $tag) {
if($c<=5){
$tag = $tagService->newOrLoadTag($tag);
$post->addTag($tag);
}
$c++;
}
}
//...