Как правильно на страницы с пагинацией сообщить клиенту об изменении?
В таблице изменилась одна запись, как мне сообщить клиенту об этом изменении ?
Как я понимаю текущую страницу и количество отображаемых на ней записей я не знаю,
так как это информация хранится на клиенте. То есть в случае изменения какой то записи,
мне нужно отправить клиенту событие об этом. В соответствии с которым он отправить запрос
с выбранной страницей и пагинацией снова, но как сделать это только с том случае, если пользователь
находится на странице с записью ? Если в этот момент была добавлена,новая запись и пагинация съехала ?
Ничего не отправляйте это оверинженеринг. При следующей пэйджинации просто перестроите паджинатор.
Или если совсем не терпится выведите в иконку уведомлений бэдж с количеством новых тем.
У меня есть возможность редактирования записи и нужно при открытии одним, запретить редактирование другим. Как быть в таком случае ? Как изменить конкретную запись ? Отправлять пользователю id открытой для редактирования записи, а на клиенте пробегать массив открытых в данный момент и если запись с таким id есть, то блокировать. Верно ?
И адаптируйте под себя. Если кратко то добавляется поле в которое записывается маркер если маркер при обновлении изменился, то выбираете стратегию перезаписать или сбросить данные.
Сразу предупреждаю это не готовое решение, это просто алгоритм который нужно адаптировать для вашего случая.
Впрочем можно сделать версионность для поля и не отслеживать блокировки.
Владимир Коротенко, мне наверное больше подойдут сокеты. В вашем варианты могут быть ошибки. Так как нужно перед сохранение показывать пользователю сохраненную версию и спрашивать нужно ли сохранять его.
Владимир Голубь, Транспортный уровень тут совершенно ни при чем. По какому каналу вы гоняете данные серверной логике безразлично.
При начале редактирования выставляете идентификатор конкуренции, обычно timestamp.
После редактирования делаете запрос и сравниваете ваш тайм стамп и новый если совпадают то обновляете
Если нет то выводите сообщение и возможно мержите.
Или можно просто возвращать ошибку если уже идет редактирование
Ничего не обновлять автоматически. Как перейдет на новую страницу - так и перерисуете всё. Если окажется на несуществующей странице - сделаете редирект на существующую. Просто.
По таймауту из браузера делать ajax-запросы на сервер с указанием текущей страницы. Если что-то изменилось - перерисовать, при необходимости сделать редирект. Криво.
Через сокеты сервер всем клиентам шлет все изменения (вернее, не все, а только те, к которым конкретный клиент имеет доступ). Если что-то изменилось - перерисовать, при необходимости сделать редирект. Красиво.
Владимир Голубь, когда юзер логинится - сервер выдает ему токен (хотя бы SESSION_ID), который используется при всех последующих запросах к серверу (как обычный http, так и сокет)