在ZF2中为帖子添加标签

时间:2014-03-05 20:42:46

标签: doctrine-orm zend-framework2

我正在尝试为我的帖子实施标签。用户将在逗号分隔的文本框中输入标签。

        public function addAction() {
    $entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    $article = new Article;

    $form = new ArticleForm(); 
    $form->setHydrator(new DoctrineHydrator($entityManager,'CsnCms\Entity\Article'));
    $form->bind($article);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $post = $request->getPost();
        $form->setData($post);
        if ($form->isValid()) {
            $this->createTags($article, $post["Tags"]);
            $this->prepareData($article);
            $entityManager->persist($article);
            $entityManager->flush();

            return $this->redirect()->toRoute('csn-cms/default', array('controller' => 'article', 'action' => 'index'));
        }
    }

    return new ViewModel(array('form' => $form));
}

在上面的代码中,我添加了一个名为createTags的类,我计划将输入的标签拆分为一个数组,并为每个创建一个新的标签实体,然后将新的标签实体存储在文章对象的数组中。这是我应该这样做的正确方法吗?

2 个答案:

答案 0 :(得分:1)

不,如果将它们存储在数组中,您将无法根据标记搜索页面。你需要一个单独的数据库表,其中包含id,tag,pageId等列,这样你就可以正确地搜索带有标记名称的页面。

答案 1 :(得分:0)

对不起,如果问题想要详细只是想知道我是否应该使用过滤器(我认为这样可行但不知道这是不是很好的做法)

最后我只使用processData函数

   public function prepareData($article, $post) {

    $separator = ",";

    if($post['tagsString'] != "")
    {
        //Link Tags
        $array = array_unique(explode($separator, $post['tagsString']));
        foreach ($array as $tagString) {

            $tag = $this->getEntityManager()->getRepository('Cms\Entity\Tag')->findOneBy(array('tag' => $tagString));

            $link = new \Cms\Entity\LinkTagToArticle($article, $tagString, $tag); 
            $this->getEntityManager()->persist($link);
        }
    }
}