如何设置标记系统

时间:2012-07-13 20:10:19

标签: php mysql

我想知道是否有人可以指出我在设置标记/通知系统方面的正确方向。我会说非常类似于标记系统。如果有人知道任何教程或示例设置,那将是很好的。

目的

基本上,标志将附加到数据项,包括客户,财产,承包商,应用程序等,其作用是通知用户关于该项目的重要信息。标志应来自用户可以添加或删除的预定项目列表。

数据库

我正在考虑使用3表设置。

  • flags table:可用标志列表,以及确定这些标志的设置 标志适用于(客户,财产等)。
  • 指示给定项目的链接表附加了给定标记。
  • 适当的实体表

用户界面

我希望一些功能类似于堆栈溢出的功能,例如添加和删除标签。也许使用jquery标签 - 它呢?主要是,我希望用户能够在选择了一个或多个标志时从下拉列表和标志图标显示中选择标志。将鼠标悬停在旗帜上应显示工具提示,列出附加到该项目的标志。不确定一个标志的这种设置是否显示所有都有利于查询目的,而不是显示多个标志。 视觉示例:http://i232.photobucket.com/albums/ee2/nismomatic97/flag.png

2 个答案:

答案 0 :(得分:6)

您的主要问题是您拥有任意数量的可能不同实体的旗帜记录,而不是单个实体(例如“客户”)。

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

例如,当您将Flags表中的JOIN FlagID发送到Customers表中的FlagID时,您将只获得与Customers相关的那些标志。

请注意,Stack Overflow没有“多个实体”问题;所有标志都投射到帖子。

答案 1 :(得分: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'

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

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


编辑1 用户界面
我不确定我是否理解你想要的内容,但是如果你想让每个用户拥有多个标记,我建议你为每个标记或checkbox而不是下拉列表select menu with multiple choices 。我认为下拉不是一个好主意,因为你只能选择一个项目。

编辑2
您可以使用与Stack Overflow标记非常相似的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文件中,检查返回的结果。如果它是“ok”,则继续,如果它与“ok”不同,则显示错误 要防止多次选择相同的标记,可以在用户选择时使用jQuery(请参阅this问题)从下拉列表中删除它。在页面上的其他位置,您可以显示选定的标志。

编辑3:
您还可以使用<select> with "multiple" attribute