Как стать автором
Обновить

Комментарии 23

Статья действительно сделала мне чуточку легче. Спасибо!
А зачем мы отключаем кеширование?
А способ действительно зачётный. Главное чтобы не появился… Кто-нибудь, кто будет говорить, что плагины не нужны. :)
Кеширование отключаем, чтобы при открытии ресурса посредством обычного запроса, он отображался с установленным шаблоном, в некоторых случаях может понадобиться.
Просто выходит получается серьёзное ограничение на этот метод — без кеширования он уже не столь хорош…
Кхм, я просто давно с MODX-ом не работал (кстати, X у него большая, раньше маленькая была, а теперь большая в названии), а нельзя ли тот же флаг темплейта возвращать обратно после выполнения парсинга? У него же эвентов для плагинов куча… Чтобы кеширование не отключать.
Не очень понял вопрос, но суть в том, что в случае с не отключённым кешированием при ajax запросе, ресурс закешируется без шаблона, и при просмотре такого ресурса в браузере, пользователь увидит его кешированную версию, то есть без шаблона и наоборот.
Данный способ особенно удобен например для ajax пагинации по каталогу товаров, при переходе на следующую страницу возвращает только следующие n товаров, но при открытии страницы в браузере пользователь увидит её полную версию.
Да ещё кое что, может это не очень логично, но ресурс мы не сохраняем, при просмотре из браузера он закешируется, а вот в случае ajax запроса, пользователь получит некешированную версию и только контент.
То есть дефакто при доступе через AJAX вы даёте некешируемые данные? Как-то это не очень хорошо…
Да, данные отдаются некешируемые, с другой стороны если речь идёт о доступе к каким-то динамическим данным (например в случае с постраничной разбивкой) или обработке форм, то кешировать там особенно нечего.
С другой стороны, всегда можно подключить кеширование непосредственно в плагине, если это необходимо.
Может, я что-то не понимаю, но разве параметр «HTTP_X_REQUESTED_WITH» веб-сервер гарантировано предоставляет?
Он предоставляется скорее клиентом. И да, его может не быть. Правда, в данном случае о его наличии заботится jQuery, насколько я это понимаю.
Приведённый сниппет возможно использовать в случае необходимости сделать ajax форму обратной связи или авторизации?
Для этого лучше использовать AjaxForm, насколько я могу судить, он работает примерно так же, как описано у вас в посте, только без получения контента ресурса.

А вот AjaxSnippet нужен для запуска произвольных сниппетов после загрузки страницы. Это позволяет ускорить открытие страницы за счет того, что всё не особо важное (последние комментарии, новости, твиты и т.п.) грузится позже.

Вместе эти 2 компонента позволяют сделать очень многое.
В примере показана только работа с формами, этот же способ можно использовать для получения результата работы отдельного сниппета или чанка, для этого достаточно добавить в приведённый в начале поста плагин пару условий.
Например, можно сделать ajax пагинатор, модифицируя код плагин следующим образом:
<?php
if ($modx->event->name == 'OnLoadWebDocument') {
    if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        if (isset($_GET['page'])) {
            $items = $modx->runSnippet('getPage', array(
                'element' => 'getResources',
                'tpl' => 'rowTpl'
            ));
            $modx->resource->set('content', $modx->toJSON(array(
                'items' => $items,
                'pages' => $modx->getPlaceholder('pageNavVar')
            )));
        }
        $modx->resource->set('cacheable', 0);
        $modx->resource->set('template', 0);
    }
}

При этом один и тот же плагин позволяет как работать с формами, так и получать отдельные элементы.
И в AjaxSnippet, и в AjaxForm можно указать любой сниппет для работы, с произвольным кодом и функциональностью.

Но это неважно, потому что собственный велосипед всегда лучше и удобнее. Удачи!
>>Создадим новый ресурс с любыми данными, в поле контент введём стандартный вызов сниппета FormIt…

Негоже в поле контент делать такие сложные вызовы снипетов. Вот ещё вариант: modx.com/extras/package/ajaxsubmit (в описании есть ссылка на документацию). Там нет ни сниппета, ни плагина, только запрос нужно отправлять на определенный адрес. Чем хуже ваших с Безумкиным велосипедов?
Извиняюсь не туда отписал, ответ ниже.
В чём сложность приведённого сниппета и чем плох вариант с помещением вызова сниппета или чанка в поле контент ресурса?
Ваш способ ничем не хуже, просто я решил поделиться с сообществом своим опытом.
В моём примере используется всего один небольшой плагин, что по моему мнению гораздо проще в реализации, да и процесс обработки запроса более прозрачен, запрашиваешь ресурс через ajax, а в ответ получаешь только контент, всё просто и понятно и не нужно разбираться как работают сторонние модули.
>> В чём сложность приведённого сниппета и чем плох вариант с помещением вызова сниппета или чанка в поле контент ресурса?

Плох тем, что контент-менеджер сайта может там что-то испортить, вызовы сниппетов ему видеть не надо. Нужно стараться их делать только в шаблонах и чанках. Хотя можно вызов сниппета убрать в чанк. Но если захочется всё-таки сделать вызов сниппета в шаблоне, то ваш способ не подходит.

>>да и процесс обработки запроса более прозрачен

Тут согласен, ваше решение самое простое и прозрачное, хоть и имеет ограничение, о котором сказал выше.
Подходит и для шаблонов, только в этом случае придётся создать отдельный шаблон и в плагин прописать условие, по которому шаблон ресурса изменится не на 0, а на нужный
Такой вопрос, а что мешает обработать запрос прямо в плагине?
Ничего не мешает — это вопрос удобства использования и поддержки, никаких особенных ограничений нет.
Мне удобнее размещать логику в плагине если нужно запустить какой-то код с разными условиями для многих ресурсов.
С другой стороны, если это уникальное действие для которого можно выделить отельный ресурс (например форма обратной связи или регистрации), то удобнее размещать в ресурсе.
Да, это логично, просто тогда не ясно зачем ставить еще какие то решения если сам ajax запрос обрабатывает один плагин, спасибо за статью
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории