对于我使用CakePHP构建的应用程序,我希望用户能够从一组特定的可能性中输入任意数量的标记(有点像stackoverflow的类别标记)。
我实际上有一个工作代码,但对我来说似乎很难看。我将概述我的方法,以及改进我想用粗体字表示。我抱歉没有具体的问题,但作为一个自学者,我可以真正使用反馈。任何建议都会非常感激!
我让用户使用Html从列表中选择他们的选项 - >选择():
$options = array(
//...
);
echo $this->Form->select(
'Tag.tag_name',
$options,
array('multiple' => true)
);
我宁愿让用户输入他们的选择,然后选择即将出现的选项。理想情况下,标签会在此之后出现,并带有可点击的十字架以再次将其删除(例如在Evernote Webtagger中)。有没有人知道任何可用于此任务的 javascripts ?
然后是服务器端。基于我在stackoverflow上读到的其他帖子,我决定创建一个单独的表来存储标签(我希望它们易于搜索)。数据存储在另一个控制器中,该控制器与标签表具有hasMany关联。第一次存储内容的代码似乎很好,但用户应该可以稍后编辑它。我现在的处理方法是简单地销毁与当前帖子关联的标记表中的所有数据库对象,然后再添加从表单返回的所有标记。以下是我的代码的相关部分:
$profile = $this -> select(); // select() is a private function that returns the current profile, based on Auth id
//destroy old ones
foreach($profile['Tag'] as $tag):
$this -> Profile -> Tag -> delete($tag['id']);
endforeach;
//create new ones
foreach ($this -> request -> data['Tag']['tag_name'] as $tag):
$this -> Profile -> Tag -> create();
$entry['tag_name'] = $tag;
$entry['profile_id'] = $this -> Profile -> id;
$this -> Profile -> Tag -> save($entry);
endforeach;
我对这些事情的经验是有限的,但删除所有内容然后再次保存似乎很粗糙。 是否有一种只触摸已删除条目的好方法?
最后,为了确保用户在进入编辑菜单时看到他之前的标签,我将数据存储到$ this-> request-> data:
$count = 0;
foreach($profile['Tag'] as $tag):
$this -> request -> data['Tag']['tag_name'][$count] = $tag['tag_name'];
$count++;
endforeach;
感谢您的任何评论:)