Кэширование документа при его update с фронтэнда.

День добрый всем!

Коллеги, подскажите, пожалуйста, насколько корректно поведение revo в след. случае:
— есть некий документ в дереве, который может быть отредактирован как через админку — так и через фронтэнд;
— при редактировании через админку — все ок, все везде отображается правильно;
— при редактировании через фронтэнд — новая инфа видна в админке, но не обновляется во фронтэнде.

Выяснил причину: если документ редактируется через фронтэнд — то кэш не обновляется при записи документа в БД. То есть чекбокс «Очистить кэш», что есть у документа в админке, работает только для админки, а для внешнего обновления документа — не срабатывает. Это доказывается, как минимум, тем, что при снятии этого чекбокса документ корректно записывается и правильно видится отовсюду (но код, конкретно, не смотрел).

Как вы считаете, насколько корректно то, что при изменении документа с фронтэнда, нужно управлять кэшем самостоятельно вручную? Или, может, я что-то неверно понимаю в принципах записи документа в revo? До этого момента считал, что с фронтэндом особенностей никаких быть не должно.

Upd: причем это относится как к ресурсам с TV-полями (при обновлении только TV-полей) — так и к ресурсам, у которых обновляются основные поля самогО ресурса.
Serge Kosykh
14 октября 2013, 10:31
modx.pro
945
0

Комментарии: 10

Василий Наумкин
14 октября 2013, 17:48
0
Абсолютно корректно.
Если у тебя юзеры будут чистить кэш сайта когда им вздумается, сайт может очень тормозить.

Этот вопрос (и многие другие) решен в Tickets индивидуальным обновление кэша редактируемой страницы, а не всего сайта.
    Serge Kosykh
    14 октября 2013, 18:11
    0
    Наверное, я немного не так сформулировал. Я не имел ввиду, что «обновлять кэш всего сайта — это хорошо», вовсе нет. Перефразирую; вопрос звучит так: «Насколько правильно то, что в движке не предусмотрена единая реакция на одно и то же действие, конкретно — изменение документа, откуда бы оно ни было произведено?» По идее, если документ кэшируемый, то откуда бы ни производилось его изменение, кэш должен быть обновлен. Причем именно и только для одного изменяемого документа. Ведь ты, например, в Tickets, такую индивидуальную очистку реализовал. А вот в core движка этого, судя по всему, нету. Что удивительно.

    К чему я все это? К тому, что в core, судя по всему, недоработка. И ее нужно иметь ввиду.
      Воеводский Михаил
      14 октября 2013, 23:54
      0
      Расскажи, как ты обновляешь ресурс с фронтенда.
        Serge Kosykh
        15 октября 2013, 00:54
        0
        Если кратко — прямым обновлением записи и/или ее TV, не через процессоры.
        Подробнее — так: форма — 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? Может, опять же, я чего-то не понимаю? Меня сама идеология интересует; если это не баг, а фича — то как это можно объяснить?
          Воеводский Михаил
          15 октября 2013, 01:03
          0
          Суть проста — если ты работаешь напрямую через апи, то должен знать, что делаешь и для чего. В том числе, обновлять кэш и многое другое. Если хочешь, чтобы при выполнении каких-либо действий система сама за тебя выполняла все сопутствующее, то используй процессоры.

          АПИ, в общем-то, лишь набор методов, из которых разработчик собирает конструктор. Это относится не только к MODX.
      Serge Kosykh
      15 октября 2013, 00:53
      0
      В общем — для меня это вопрос идеологии, скажем так. Считаю, что чтобы эффективно работать с инструментом, нужно понять, по каким принципам он устроен. Вот и заморачиваюсь.
        Василий Наумкин
        15 октября 2013, 06:39
        0
        Тогда прочитай про процессоры, что ли?

        Если хочешь единого поведения — используй их, вся логика там.
          Serge Kosykh
          16 октября 2013, 11:37
          0
          ОК, спасибо!
          Буду иметь ввиду.
            Это сообщение было удалено
          Serge Kosykh
          16 октября 2013, 11:37
          0
          Спасибо за помощь! Вопросов не осталось.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10