Два пользователя редактируют одну и ту же таблицу / ресурс


У меня есть инструмент, написанный на CakePHP, который среди других функций, учитывая список продуктов, позволяет мне создавать заказы, заказы на покупку, каталоги продуктов и т. д. Для моих клиентов. Однако у меня есть несколько пользователей, создающих и редактирующих эти заказы, что подводит меня к вопросу.

Как я могу показать предупреждение или каким-то образом запретить нескольким пользователям работать с одним и тем же объектом? Прямо сейчас каждый должен спросить устно, прежде чем что-то редактировать.

Заранее благодарю.

3 3

3 ответа:

Вы можете установить флаг в таблице, когда пользователь запрашивает продукт, и удалить флаг при сохранении.. но есть несколько дополнительных проблем:

  • Что делать, если пользователь закроет браузер,
  • Что делать, если пользователь случайно обновит страницу
  • Что делать, если батарея умирает в ноутбуке пользователя?
  • Что делать, если пользователь случайно умирает? :) ...

Мое предложение таково:

  • Добавьте в таблицу столбец "datetime", назовем его "lock_date":

  • Добавьте столбец lock_user_id в свой Таблица,

  • Когда пользователь открывает продукт-установите lock_date в текущее время datetime, а lock_user_id из сеанса

  • На стороне клиента: каждую минуту отправлять ajax-запрос другому методу для обновления поля "lock_date" с текущим datetime

  • Когда любой пользователь пытается открыть один и тот же продукт:

1) проверьте, если lock_date

2) Если false: проверьте, если lock_user_id = = сессия.идентификатор пользователя. Если true-разрешить edit (это условие полезно, если пользователь случайно обновляет страницу, или пытается открыть тот же продукт при случайном нажатии кнопки" Назад", или пытается отредактировать продукт в другом браузере)

Вы можете добавить столбец user_id в свои таблицы, как только пользователь запрашивает работу с сущностью, вы устанавливаете этот столбец user_id в сущность и сохраняете его в базе данных. Он может быть определен в функции контроллера initialize(), Если запрошенное действие соответствует вашему условию.

И в функции beforeSave(), вы можете установить user_id в null.

Затем, прежде чем отрисовывать шаблон, вы проверяете, является ли user_id null отрисовкой или нет.

Вы можете установить флаг на объекте, чтобы получить значение 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");
}