Кэширование документа при его update с фронтэнда.
День добрый всем!
Коллеги, подскажите, пожалуйста, насколько корректно поведение revo в след. случае:
— есть некий документ в дереве, который может быть отредактирован как через админку — так и через фронтэнд;
— при редактировании через админку — все ок, все везде отображается правильно;
— при редактировании через фронтэнд — новая инфа видна в админке, но не обновляется во фронтэнде.
Выяснил причину: если документ редактируется через фронтэнд — то кэш не обновляется при записи документа в БД. То есть чекбокс «Очистить кэш», что есть у документа в админке, работает только для админки, а для внешнего обновления документа — не срабатывает. Это доказывается, как минимум, тем, что при снятии этого чекбокса документ корректно записывается и правильно видится отовсюду (но код, конкретно, не смотрел).
Как вы считаете, насколько корректно то, что при изменении документа с фронтэнда, нужно управлять кэшем самостоятельно вручную? Или, может, я что-то неверно понимаю в принципах записи документа в revo? До этого момента считал, что с фронтэндом особенностей никаких быть не должно.
Upd: причем это относится как к ресурсам с TV-полями (при обновлении только TV-полей) — так и к ресурсам, у которых обновляются основные поля самогО ресурса.
Коллеги, подскажите, пожалуйста, насколько корректно поведение revo в след. случае:
— есть некий документ в дереве, который может быть отредактирован как через админку — так и через фронтэнд;
— при редактировании через админку — все ок, все везде отображается правильно;
— при редактировании через фронтэнд — новая инфа видна в админке, но не обновляется во фронтэнде.
Выяснил причину: если документ редактируется через фронтэнд — то кэш не обновляется при записи документа в БД. То есть чекбокс «Очистить кэш», что есть у документа в админке, работает только для админки, а для внешнего обновления документа — не срабатывает. Это доказывается, как минимум, тем, что при снятии этого чекбокса документ корректно записывается и правильно видится отовсюду (но код, конкретно, не смотрел).
Как вы считаете, насколько корректно то, что при изменении документа с фронтэнда, нужно управлять кэшем самостоятельно вручную? Или, может, я что-то неверно понимаю в принципах записи документа в revo? До этого момента считал, что с фронтэндом особенностей никаких быть не должно.
Upd: причем это относится как к ресурсам с TV-полями (при обновлении только TV-полей) — так и к ресурсам, у которых обновляются основные поля самогО ресурса.
Комментарии: 10
Абсолютно корректно.
Если у тебя юзеры будут чистить кэш сайта когда им вздумается, сайт может очень тормозить.
Этот вопрос (и многие другие) решен в Tickets индивидуальным обновление кэша редактируемой страницы, а не всего сайта.
Если у тебя юзеры будут чистить кэш сайта когда им вздумается, сайт может очень тормозить.
Этот вопрос (и многие другие) решен в Tickets индивидуальным обновление кэша редактируемой страницы, а не всего сайта.
Наверное, я немного не так сформулировал. Я не имел ввиду, что «обновлять кэш всего сайта — это хорошо», вовсе нет. Перефразирую; вопрос звучит так: «Насколько правильно то, что в движке не предусмотрена единая реакция на одно и то же действие, конкретно — изменение документа, откуда бы оно ни было произведено?» По идее, если документ кэшируемый, то откуда бы ни производилось его изменение, кэш должен быть обновлен. Причем именно и только для одного изменяемого документа. Ведь ты, например, в Tickets, такую индивидуальную очистку реализовал. А вот в core движка этого, судя по всему, нету. Что удивительно.
К чему я все это? К тому, что в core, судя по всему, недоработка. И ее нужно иметь ввиду.
К чему я все это? К тому, что в core, судя по всему, недоработка. И ее нужно иметь ввиду.
Расскажи, как ты обновляешь ресурс с фронтенда.
Если кратко — прямым обновлением записи и/или ее TV, не через процессоры.
Подробнее — так: форма — ajax submit (через iQuery) — дергаю документ, в котором сниппет пишет инфу в БД в таком стиле:
Подробнее — так: форма — ajax submit (через iQuery) — дергаю документ, в котором сниппет пишет инфу в БД в таком стиле:
if( $doc = $modx->getObject('modResource', 'id=' . $doc_id) ){
//родные поля документа не обновляются, только TV
$doc->setTVValue('sity_name', strip_tags($_POST['sity_name']));
//$doc->save() не делаю, т.к. не обновляю основные поля документа;
//но даже когда его делал - все равно кэш не обновлялся;
//более того, когда обновляю и "родные" поля дока, и его TV - все равно кэш остается прежним
//и это - при отсутствии акселераторов и кэшеров на уровне сервера http
};
Да, понимаю, что TV — не «родные» поля, и хранятся они отдельно и обрабатываются отдельно. Но коли они логически к документу привязаны (ведь мы вызываем метод setTVValue() у конкретного объекта, а значит обработать кэш этого дока, теоретически, можем), почему бы и при их обновлении не генерить соотв. эвент и не обрабатывать его уже внутри core? Может, опять же, я чего-то не понимаю? Меня сама идеология интересует; если это не баг, а фича — то как это можно объяснить?
Суть проста — если ты работаешь напрямую через апи, то должен знать, что делаешь и для чего. В том числе, обновлять кэш и многое другое. Если хочешь, чтобы при выполнении каких-либо действий система сама за тебя выполняла все сопутствующее, то используй процессоры.
АПИ, в общем-то, лишь набор методов, из которых разработчик собирает конструктор. Это относится не только к MODX.
АПИ, в общем-то, лишь набор методов, из которых разработчик собирает конструктор. Это относится не только к MODX.
В общем — для меня это вопрос идеологии, скажем так. Считаю, что чтобы эффективно работать с инструментом, нужно понять, по каким принципам он устроен. Вот и заморачиваюсь.
Тогда прочитай про процессоры, что ли?
Если хочешь единого поведения — используй их, вся логика там.
Если хочешь единого поведения — используй их, вся логика там.
ОК, спасибо!
Буду иметь ввиду.
Буду иметь ввиду.
Это сообщение было удалено
Спасибо за помощь! Вопросов не осталось.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.