Symfony2从一个帖子中的表单,标签启动功能

时间:2015-01-20 08:25:05

标签: php forms symfony service tags

我已将Tag实体(索引,创建,编辑等)的一系列功能定义为服务。当我在表单中创建帖子时,我添加字段"标签"包括与该帖子相关的标签。

我的问题是,如何实现我在TagManager中定义的功能?我想要使​​用的功能称为' newOrLoadTag'。如果在PostController或PostForm中,我不知道应该如何使用它。

我的第二个问题是,如何限制输入标签?我想要一个帖子最多有5个标签。我想我应该定义字段"标签"将Post实体作为大小为5的数组。这是最好的方法吗?如果是这样,我该如何实施呢?

1 个答案:

答案 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++;
                }   
            }
            //...