Два пользователя редактируют одну и ту же таблицу / ресурс
У меня есть инструмент, написанный на CakePHP, который среди других функций, учитывая список продуктов, позволяет мне создавать заказы, заказы на покупку, каталоги продуктов и т. д. Для моих клиентов. Однако у меня есть несколько пользователей, создающих и редактирующих эти заказы, что подводит меня к вопросу.
Как я могу показать предупреждение или каким-то образом запретить нескольким пользователям работать с одним и тем же объектом? Прямо сейчас каждый должен спросить устно, прежде чем что-то редактировать.
Заранее благодарю.
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"); }