Ajax в MODx Revolution


Много людей спрашивают на форумах как использовать ajax в modx с процессорами, коннекторами и остальным. Как советуют разработчики: не используйте коннекторы для фронтэндовой ajax функциональности, вместо этого используйте плоский документ для ajax вызовов. Позвольте мне рассказать вам, как это сделать.

Используйте коннекторы для фронтэнд ajax функциональности вместо обращения к чистому документу для ajax вызовов. Давайте я расскажу вам как это сделать. Создайте сниппет в бекенде и назовите его ajax. Скопируйте в сниппет представленный ниже код, работа которого объясняется в комментариях. В данных момент не беспокойтесь о переменных $_REQUEST

<?php
$output='';
//это название файла-обработчика
$procname=$_REQUEST['action'];
 
//это обращение к компоненту component
$comp=$_REQUEST['component'];
 
//файл обработчик с путём
$f= $modx->getOption('core_path').'components/'.$comp.'/processors/'.$procname.'.php';
if (file_exists($f)) {
//влючение этого файла, таким образом здесь назначается вывод процессора
            $output= include $f;
        } else {
            $output= 'Action not found: '.$f;
        }
//преобразовать вывод процессора в json формат
return $modx->toJSON($output);

теперь создайте документ с именем Ajax и псевдонимом – ajax. Назначьте пустой шаблон, определите «Скрыть от меню» чекбокс и опубликуйте его.

В поле контент сделайте вызов некешированного ajax сниппета [[!ajax]]

Ajax ресурс

Всё, на этом мы закончили с ajax функциональностью. Всё, что вам нужно – это передать действие, переменные компонента в вашем javascript для любого ajax запроса в вашем сайте url для вашего ajax запроса – это vashsite/ajax, если у вас включены ЧПУ (SEF) иначе ваш url будет vashsite/index.php?id=ajaxdocumentid

Например, ваша форма отправки ajaxsubmit, если ваш обработчик addpoll.php в components/vxpolls/processors/web/addpoll.php, тогда ваше действие web/addpoll, компонент – vxpolls в форме добавляет эти переменные как скрытые

<form id="myForm" action="ajax">
<input type="hidden" name="action" value="web/addpoll" />
<input type="hidden" name="component" value="vxpolls" />
<-!какие-либо другие элементы формы!->
</form>

В моём случае я использую mootools javascript, поэтому мне нужно сделать вызов $(‘myForm’).send(); теперь моя форма отослана к ajax документу (посмотрите на action формы). Аjax страница просто отошлёт форму к core/components/vxpolls/web/addpoll.php.

Давайте разберём другой пример, где вы бы хотели получить данные о голосовании от backend/php с помощью ajax. Я подразумеваю, что вы возвращаете json данные

var jsonRequest = new Request.JSON({url: 'ajax', onSuccess: function(responce){
    alert(responce.pollname)
}}).get({'action': 'web/getpoll', 'component': 'vxpolls'});

все js фреймворки поддерживают этот тип ajax функционала, посылая переменные в ajax url поэтому не волнуйтесь, если вы не используете mootools или если вы неуверены о том, как посылать данные от php файла в ответ на ajax запрос, смотрите сюда:

//фильтрация входящих данных 
$poll=$modx->getObject('pollData',$_REQUEST['pid']);
if(!$poll){
   return $modx->error->failure('no poll found with given id');
}
return $modx->error->success($poll->toArray());

Помните, что коннекторы лучше подходят для бекэнда, а не фронтэнда.

Оригинал статьи