2014-03-05 91 views
0

我正在試圖爲我的帖子實現標籤。用戶將在由逗號分隔的文本框中輸入標籤。在ZF2中添加標籤到帖子

 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是我計劃的輸入標籤分成數組,每個創建一個新的標籤的實體,然後將新標籤的實體存儲在一個陣列中

文章對象。這是我應該這樣做的正確方法嗎?

+0

你做事情的方式當然是你需要的方式。我個人不會使用ZF2的教條,但如果我記得Symfony 2,我會說,沒關係。當我編寫唯一的問題時,我問自己是:我是否在做我想達到的目標,我的代碼是否足夠可測試以確保它是預期的行爲。編寫測試是確保代碼以您想要的方式工作的最佳方式,並且確保整個應用程序不會做奇怪的事情,因爲變量在過程中沒有正確初始化。 – SmasherHell

回答

0

很抱歉,如果這個問題想的是詳細的只是想知道如果我要使用過濾器,而不是(我認爲這會工作,但不知道這是否是一個好習慣)

最後我只使用過程數據功能

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); 
     } 
    } 
} 
1

不,你不能根據標籤搜索你的頁面,如果你將它們存儲在一個數組中。你需要有一個獨立的數據庫表,包括id,tag,pageId等列,這樣你就可以正確搜索帶有標籤名稱的頁面。

+0

他沒有告訴關於doctrine db schema的內容,我假設該模式是正確的,他的'Post'實體包含一個或多個關係的'Tags'。他當然沒有說標籤將會被作爲「數組」使用序列化來持久化 – SmasherHell

相關問題