我正在尝试为我的帖子实施标签。用户将在逗号分隔的文本框中输入标签。
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 :(得分: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);
}
}
}