两个用户编辑相同的表/资源

时间:2017-05-25 21:12:32

标签: php jquery cakephp

我有一个用CakePHP编写的工具,在其他功能中,给定产品列表,允许我为我的客户创建订单,采购订单,产品目录等。但是我有多个用户创建和编辑这些订单,这让我想到了这个问题。

如何显示警告或以某种方式阻止多个用户处理同一个对象?现在每个人都必须在编辑任何内容之前口头询问。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以向您的表添加user_id列,一旦用户请求使用实体,您将此user_id设置为该实体并将其保存在数据库中。如果请求的操作符合您的条件,则可以在控制器initialize()函数中定义。

beforeSave()功能,您可以将user_id设置为null

然后,在渲染模板之前,检查user_id是否null进行渲染。

答案 1 :(得分:1)

您可以在用户请求产品时在表格中设置标记,并在保存时删除标记..但还有一些其他问题:

  • 如果用户关闭浏览器,
  • 如果用户意外刷新页面
  • ,该怎么办?
  • 如果用户笔记本电脑中的电池耗尽怎么办?
  • 如果用户意外死亡怎么办? :) ...

我的主张是:

  • 添加' datetime'在您的表格中,我们可以将其称为" lock_date":

  • 将lock_user_id列添加到您的表中,

  • 当用户打开产品时 - 将lock_date设置为当前日期时间,将lock_user_id设置为会话

  • 在客户端:每分钟向其他方法发送ajax请求以进行更新" lock_date"具有当前日期时间的字段

  • 当任何用户尝试打开同一产品时:

1)检查lock_date是否<当前日期时间减去1分钟。如果为true:允许编辑

2)如果为false:检查lock_user_id == session.user_id。如果为true - 允许编辑(如果用户意外刷新页面,或者在意外按下"返回"按钮或尝试在其他浏览器中编辑产品时尝试打开相同的产品,则此条件非常有用)

答案 2 :(得分:0)

您可以在对象上设置一个标志,当该对象被请求编辑时,该标志设置为true,而当编辑持久保存到对象时,则设置为false。

使用该标志,您可以阻止在

时编辑对象
if(!flag) {
    //code with form to edit the object
    <form action="object.php" method="post">
      .....
    </form>
} else {
   //either disable the form fields or better solution show message to 
   //user that the object is being edited and they should try again later
   $this->flash->set("This record is currently being edited. Please try again later");
}