使用时间戳保存对于contenteditable的更改

时间:2013-04-06 10:00:59

标签: php mysql diff contenteditable

我有一个用户可以写的<div contenteditable="true" />,其长度几乎是无限的 div中的数据将在更改时保存,并在MySQL数据库中显示时间戳。

现在我的目标是在左侧有一个小注释,告诉用户何时创建文档的每个部分(分辨率应该是几天)。

现在,问题是:如何最好地保存信息(什么时候更改的部分)?

到目前为止,我考虑了以下两个看似可以改进的选项:

  1. 每次用户访问文档末尾的网站时,我都会插入一个标记(例如,带有类的emtpy span和存储编辑开始的数据属性)。调用保存脚本时,此标志将保存到数据库中。这个选项可以很容易地显示侧面的日期 - 我只是将它们放在与空跨度相同的高度上,并且跨度告诉我日期。缺点是:用户可能会意外删除时间戳范围,如果用户长时间没有关闭窗口,则不会插入新的时间跨度(这可能是通过每隔X分钟插入新的时间戳跨度来避免,因此删除部分是更相关)
  2. 每次将数据传递给保存脚本时,尝试进行字符串差异比较,并仅使用时间戳保存差异。然后当页面加载时,按正确的顺序将所有部分放在一起,并在Javascript中将日期注释放在正确的位置。这对我来说听起来像是一个很大的开销,但是当旧的部件被更换时,两个部件可能会成为一个,等等。总而言之,这些选项听起来非常复杂。
  3. 高度赞赏任何意见/建议/建议!

3 个答案:

答案 0 :(得分:12)

您要实现的是源代码控制领域中称为“注释”或“责备”的功能(尽管您只需要更新日期而不是日期+作者或仅仅是作者)。

要做到这一点,你需要一种方法来制作差异(php-diff可以完成工作)并获得文本的版本。 有几种策略:

  • 存储最新版本并仅保留增量(例如统一差异,我的偏好)

  • 即时存储所有版本和计算增量

一旦你拥有了当前版本和增量列表(如果超过三十几个delta,你肯定可以缩短列表,让用户询问更多,如果非常重要)。您可以将增量组合在一起,这是注释阶段发生的位置,因为您可以记住每行的哪个版本。实际上编写非常简单(从最新版本开始,补丁中添加的所有行都是最新的,另一行需要解释,所以再次使用下一个补丁,直到你找到你想要处理的最古老的补丁,其余的行来自该版本或最早的行,因此可以使用一些标记“在...之前或之前”。

Google has a diff library for Javascript所以可以在用户机器上做所有艰苦的工作。他们也在这个库中有补丁部分。我没有找到注释/责备库。

答案 1 :(得分:4)

您可以采用的一种方法是使用表格来修改div。您经常可以在此表中添加一个新条目,其中包含内容和时间戳,因此可以跟踪编辑的所有修订。然后,要找出更改的内容,您可以简单地比较两个条目,以找出已添加的内容,保持不变并删除。

答案 2 :(得分:4)

您应该在用户提交信息时保存此信息。用户想要查看信息的那一刻,几乎没有任何计算。

在后端中创建两个表。在一个表中,我们称之为'currentdocs',您始终存储最新版本的数据。当用户加载文档时,所有信息都来自此表'currentdocs'。 在另一个表中,我们称之为'docsintime',您保存每个新的保存。它具有表'currentdocs'的外键,您可以通过选择具有该外键的最大ID来查找此表'docsintime'中的最后一行。 select语句可以是:

select id from docsintime where cur_key = x order desc limit 1;

在两个表中,您是否为每个相关部分存储了已更改的最新时间戳。

保存新文档后,您将在表'docsintime'中获得最后保存的版本。您将所有相关部分与该记录中的数据进行比较。如果没有差异,则复制要保存的新记录中相关部分的时间戳。如果它确实不同,那么您是否为该相关部分创建新的时间戳。 比较之后,您将新记录保存在表'currentdocs'和'docsintime'中。您更新表'currentdocs'并在表'docsintime'中插入新记录。只有使用新文档才能在表'currentdocs'中插入。 对于该文档的下一个请求,您只需要从表'currentdocs'中收集信息。这个过程又重新开始。