2017-05-25 47 views
3

我有一个用CakePHP编写的工具,在给定产品列表的其他功能中,我可以为我的客户创建订单,采购订单,产品目录等。但是,我有多个用户创建和编辑这些命令,这使我想到了这个问题。编辑同一张表格/资源的两个用户

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

在此先感谢。

+0

请始终提及您的确切CakePHP版本(vendor/cakephp/cakephp/VERSION.txt或lib/Cake/VERSION.txt中的最后一行) –

+0

是忘记了,它是v 0.2.9。 – Chrishow

回答

1

可以在表中设置标志,当产品用户请求和保存删除标志..但那里有一些额外的问题:

  • 什么,如果用户关闭浏览器,
  • 如果用户不小心刷新页面什么
  • 如果电池在用户笔记本电脑中死亡会怎么样?
  • 如果用户意外死亡,该怎么办? :) ...

我的命题是:

  • 添加 '日期时间' 列到你的餐桌,让称它为 “lock_date”:

  • 添加lock_user_id列到表,

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

  • 在客户端:

1)检查是否:当任何用户试图打开相同的产品每分钟更新“lock_date”字段发送AJAX请求到其他方法与当前的日期时间

  • lock_date <当前日期时间减去1分钟。如果为true:允许编辑

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

  • +0

    这是天才......!我曾经想过这样的事情,但你给了我解决方案!非常感谢你! – Chrishow

    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"); 
    } 
    
    +0

    这两个最后的方法是我喜欢当时使用的事情,但不适合由Rayann Nayran在上面陈述,用date_lock我解决了这个问题。 – Chrishow

    1

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

    并且在beforeSave()函数中,您可以将user_id设置为null

    然后,在渲染模板之前,您检查是否user_idnull以进行渲染或不渲染。