2017-05-25 28 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以進行渲染或不渲染。