我正在尝试在我的帖子中实现标签。 用户将在以逗号分隔的文本框中输入标签。
public function addAction() {
$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
$article = new Article;
$form = new ArticleForm();
$form->setHydrator(new DoctrineHydrator($entityManager,'CsnCmsEntityArticle'));
$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的类,我计划将输入的标签拆分为一个数组,并为每个标签实体创建一个新的标签实体,然后将新的标签实体存储在文章对象的数组中。 这是我应该这样做的正确方法吗?
不可以,如果您将页面存储在数组中,您将无法根据标签搜索页面。 您需要有一个单独的数据库表,其中包含 id、tag、pageId 等列,以便您可以正确搜索带有标签名称的页面。
抱歉,
如果问题想要如此详细,只是想知道我是否应该使用过滤器(我认为这会起作用,但不知道这是否是好的做法)
最后我只使用进程数据函数
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('CmsEntityTag')->findOneBy(array('tag' => $tagString));
$link = new CmsEntityLinkTagToArticle($article, $tagString, $tag);
$this->getEntityManager()->persist($link);
}
}
}