2012-07-13 84 views
4

我想知道是否有人可以指导我设置标记/通知系统的正确方向。我会说与标签系统非常相似。如果有人知道任何教程或示例设置,那就太好了。如何设置标记系统

目的

基本上,该标志是附加到数据项,包括客户,性质,承包商,应用等与通知信息的关于该项目的一个重要部分的用户的角色。这些标志应该来自用户可以添加或删除的预定项目列表。

数据库

我想用3台设置去。

  • flags表:可用标志列表,以及确定这些标志适用于哪些(客户,属性等)的设置的列表。
  • 指示给定项目的链接表具有附加的给定标志。
  • 适当的实体表

用户界面

我想一些功能的是类似的堆栈溢出的,如添加和移除标签。也许使用jQuery的标签 - 它呢?主要是,我希望用户能够在选择一个或多个标志时从下拉列表和标志图标显示中选择标志。将鼠标悬停在标志上应显示一个工具提示,其中列出了附加到该项目的标志。不知道这个设置的一个标志显示是否适合查询,而不是显示多个标志。 样品视觉:http://i232.photobucket.com/albums/ee2/nismomatic97/flag.png

回答

6

您的主要问题是,您有任何数量的可能不同实体的标志记录,而不是一个单一的实体(如“客户”)。

过去,我通过在每个表(“FlagID”)中提供一个在整个数据库中唯一的Foreign Key字段来解决此问题。一个GUID是适合的。然后,您可以简单地将适用于您的特定上下文的表JOIN添加到Flags表中的FlagID,并且您将只获得适用于该特定实体的标志。

例如,当您将Flags表中的FlagID设置为您的Customers表中的FlagID时,您只会获得与Customers相关的标志。

请注意堆栈溢出没有“多个实体”问题;所有标志都被转换为帖子。

+0

用它来设计表格。 – sammich 2012-07-15 01:27:13

3

基本上,你需要一个带有标志和一张表的客户/用户表。 这些表应该是这样的:

标志表

  • 标志的唯一ID(最简单的方法是将“ID”字段设置为AUTO_INCREMENT)。
  • 标志名称
  • 标志说明
  • 更多的东西你想

用户表

  • 存储标志(我建议存放国旗的序列化阵列)场
  • 您需要其他信息的其他数据

除了存储序列化数组之外,还可以创建另一个表来存储用户的唯一ID和标识ID。每个标志一行。但是,我认为第一种方法更好,更高效。

选择和显示国旗:

  • 选择包含标志
  • 阵列解序列化,并使用JOIN选择的名称和标志的描述的序列化的阵列的场。

例子

存储标志,以用户的个人资料
让我们假设你想存储ID为1,3,5和7的标志:

$flags = serialize(array(1, 3, 5, 7)); 
mysql_query("UPDATE `users` SET `flags` = '$flags'") or die(mysql_error()); 

如果您想编辑标志,选择字段,反序列化数组并使用Array functions进行编辑。

选择和显示:
所以,你有1,3,5和7
这里值的数组是创建一个SELECT查询的例子:

$flags = array(1, 3, 5, 7); // selected from 'users' table and unserialized 
$query = "SELECT u.name, f.name, f.description FROM users u INNER JOIN flags f ON "; 
$conditions = null; 
for($i = 0; $i < count($flags); $i++) 
{ 
    $conditions .= "f.id = $flags[$i] OR "; 
} 
$conditions = substr($conditions , 0, -4); // removing the last " OR " 

$query = $query . $conditions . " WHERE u.name = 'Nikola'"; 

这是我们从代码中获得的查询:

SELECT u.name, f.name, f.description 
    FROM users u 
    INNER JOIN flags f 
    ON f.id = 1 OR f.id = 3 OR f.id = 5 OR f.id = 7 
    WHERE u.name = 'Nikola' 

它将返回所有标志及其名称,描述和用户的nam即

您所要做的就是现在显示结果。


编辑1用户界面
我不知道如果我明白你到底想要什么,但如果你要允许每个用户多个标志,我建议你做一个checkbox每个国旗或select menu with multiple choices而不是下拉。我认为下拉并不是一个好主意,因为您只能选择一个项目。

编辑2
可以使用jQuery Autocomplete这是非常相似的堆栈溢出的标签,可能是最好的选择。

另一个想法是,你实际上可以使用下拉菜单,仍然允许多个标志。
这是事情:当用户从下拉菜单中选择一个标志,通过AJAX在PHP数组中存储标志,并将数组存储在$_SESSION中。

示例:通过AJAX向PHP文件发送请求,在PHP文件中读取您的$_SESSION变量,其中应存储标志。如果它是空的(没有标志) - 添加1个数组。如果它不为空,则读取其值(整个数组),向数组中添加新标志并将其返回到会话变量。

session_start(); 

if(isset($_POST['id'])) $flagid = $_POST['id']; // previously sent request via AJAX that contains this ID. 
if(empty($_SESSION['flags'])) $_SESSION['flags'] = array($flagid); // this is the first selected flag 
else 
{ 
    // other tags was selected earlier 
    $flags = $_SESSION['flags']; 
    $flags[] = $flagid; 
    $_SESSION['flags'] = $flags; 
} 
die("ok"); 

现在回到你的JS文件中,检查返回的结果。如果“确定”,则继续,如果与“确定”不同,则显示错误。
要防止多次选择相同的标记,可以在用户选择jQuery时使用jQuery(请参阅this问题)从下拉菜单中将其删除。在页面上的其他位置,您可以显示选定的标志。

编辑3:
你也可以使用一个<select> with "multiple" attribute

+1

迄今为止非常有帮助的答案。我现在正在努力让桌子设计失败!将更新结果然后将考虑用户界面。 – sammich 2012-07-13 21:24:00

+0

@sammich我用UI建议更新了我的答案。 – 2012-07-13 22:30:35

+0

@ Nikola K.谢谢,看到你的编辑。是的,我同意这个问题与下拉。我担心的是,如果最终出现一个给定实体的标志很多,复选框或具有多个选项的菜单可能会使用户界面变得混乱。仍在研究这一点。 – sammich 2012-07-15 01:26:30