Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия Следущая версия Both sides next revision | ||
eaze:samples:одновременное_редактирование_объектов [2012/11/23 17:51] sergeyfast |
eaze:samples:одновременное_редактирование_объектов [2012/11/23 18:18] sergeyfast [ru.xml] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Отслеживание одновременного редактирования объектов в VT ====== | ====== Отслеживание одновременного редактирования объектов в VT ====== | ||
- | По умолчанию в VT при сохранении объектов действует правило - "кто последний нажал сохранить, того и форма :)". Попробуем исправить это, поставив следующую задачу: | + | По умолчанию в VT при сохранении объектов действует правило: "кто последний нажал сохранить, того и форма :)". Попробуем исправить это, поставив следующую задачу: |
>В VT при редактировании объекта давать сохранять именно ту версию объекта, которая была открыта на тот момент. | >В VT при редактировании объекта давать сохранять именно ту версию объекта, которая была открыта на тот момент. | ||
- | >Если редактирование одновременно было открыто два раза, то при нажатии кнопки "сохранить" во второй раз система не должна позволить сделать это, так как в первый раз уже было произведено сохранение. | + | >Если страница редактирования одновременно была открыта два раза, то при нажатии кнопки "сохранить" во второй раз система не должна позволить сохранить изменения, так как в первый раз уже было произведено сохранение. |
Эта схема называется [[https://en.wikipedia.org/wiki/Optimistic_concurrency_control|"Optimistic Concurrency Control"]] | Эта схема называется [[https://en.wikipedia.org/wiki/Optimistic_concurrency_control|"Optimistic Concurrency Control"]] | ||
Строка 9: | Строка 9: | ||
===== Реализация ===== | ===== Реализация ===== | ||
Решение данной задачи можно рассматривать в различных вариантах, но мы, как программисты, определим свои ограничения заранее. | Решение данной задачи можно рассматривать в различных вариантах, но мы, как программисты, определим свои ограничения заранее. | ||
- | У объекта могут быть связанные объекты (листы), обычно они редактируются на одной странице, поэтому нам важен сам факт нажатия кнопки "Сохранить и закрыть" или "Применить". | + | У объекта могут быть связанные объекты (листы), обычно они редактируются на одной странице, поэтому нам важен сам факт нажатия кнопки "Сохранить и закрыть" или "Применить", а не то, что изменилось в объекте. |
Если в объекте ничего не поменялось, мы не учитываем это. По своей сути задача сводится к записи времени последнего редактирования объекта. | Если в объекте ничего не поменялось, мы не учитываем это. По своей сути задача сводится к записи времени последнего редактирования объекта. | ||
Строка 38: | Строка 38: | ||
==== ObjectHistoryUtility.php ==== | ==== ObjectHistoryUtility.php ==== | ||
- | Утилита {{:eaze:samples:objecthistoryutility.phps|}} будет работать только с теми объектами, у которых уже есть Factory. | + | Утилита {{:eaze:samples:objecthistoryutility.phps|ObjectHistoryUtility.phps}} будет работать только с теми объектами, у которых уже есть Factory. |
Переменная ''$InsertsOnly'' отвечает за режим работы. Если значение ''true'', то в ''objectHistory'' будет хронология всех изменений, иначе - только последнее изменение. | Переменная ''$InsertsOnly'' отвечает за режим работы. Если значение ''true'', то в ''objectHistory'' будет хронология всех изменений, иначе - только последнее изменение. | ||
Строка 44: | Строка 44: | ||
==== Save<Class>Action.php ==== | ==== Save<Class>Action.php ==== | ||
+ | === beforeAction() === | ||
<code php> | <code php> | ||
/** | /** | ||
Строка 129: | Строка 129: | ||
==== ru.xml ==== | ==== ru.xml ==== | ||
- | Перед щакрытием тега ''errors'' добавьте: | + | Перед закрытием тега ''errors'' добавьте: |
<code xml> | <code xml> | ||
Строка 143: | Строка 143: | ||
{{ :eaze:samples:objecthistory-tv.png? |}} | {{ :eaze:samples:objecthistory-tv.png? |}} | ||
+ | ==== Плюсы ==== | ||
+ | * Универсальное решение для любого объекта в VT. | ||
+ | * Минимальные правки в код. | ||
+ | * Простая интеграция в существующие проекты. | ||
+ | |||
+ | ==== Минусы ==== | ||
+ | * Если открыть страницу, ничего не менять, и нажать кнопку "сохранить изменения", то дата последнего изменения обновится, хотя по логике вещей не должна - мы же ничего не меняли:). | ||
+ | ==== Дальнейшее развитие ==== | ||
+ | * Можно добавить кнопку на яваскрипте - "Все равно сохранить мою версию" (кнопка меняет значение ohCreatedAt на now() и делает submit формы). | ||
+ | * Можно добавить в таблицу ''objectHistory'' поле ''changes'', в котором в сериализованном виде хранить изменившиеся значения полей у объекта (и его листов). После создания такой функциональности берегитесь своей бурной фантазии :). | ||