Правильный способ выполнения AJAX-запроса от MODx CMP (Страница Custom Manager)

Я создал CMP после этого официального урока:
http://rtfm.modx.com/revolution/2.x/developing-in-modx/advanced-development/custom-manager-pages

На этом CMP у меня есть кнопка, которую я хочу выполнить AJAX-запросы (по нажатию).

Как правильно создать php-файл, который будет обрабатывать запросы AJAX?

Либо путем создания php-файла в / assets / components //
и заполняя его этим кодом вверху:

require_once '/absolute/path/to/modx/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
// My code is here

или создав еще одно действие в System-> Actions меню в менеджере и сделав что-то там
или по-другому (может быть, с помощью разъемов, процессоров, контроллеров …)?

0

Решение

Что ж, спасибо @ ride_85027 за его ответ. После некоторого открытия и поиска в Google, я пришел к другому решению с использованием коннектора и моего собственного процессора. Не знаю, какой вариант «лучше». Итак, вот мое решение:

Все мои AJAX-запросы отправляются (через POST) в файл connector.php, который находится в / assets / components / my_component_name / с обязательным параметром ‘action’ (который определяет процессор, который будет обрабатывать этот запрос) и другими пользовательскими параметрами, которые мне нужны ,
Вот код моего соединителя.php:

<?php
require_once dirname(dirname(dirname(dirname(__FILE__)))).'/config.core.php';
require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
require_once MODX_CONNECTORS_PATH.'index.php';

$corePath = $modx->getOption('my_component_name.core_path',null,$modx->getOption('core_path').'components/my_component_name/');
require_once $corePath.'model/my_component_name.class.php'; // My custom class
$modx->my_component_className= new my_component_className($modx);

/* handle request */
$path = $modx->getOption('processorsPath',$modx->my_component_className->config,$corePath.'processors/'); // Path to directory with my custom processors
$modx->request->handleRequest(array(
'processors_path' => $path,
'location' => ''
));

Параметр действия — это путь к процессору относительно пути, который задается в ‘processors_path’ в $ modx-> request-> handleRequest.
Я установил для параметра ‘action’ значение ‘mgr / saveorder’, поскольку мой файл пользовательского процессора находится в /core/components/my_component_name/processors/mgr/saveorder.class.php
(обратите внимание, что вам нужно пропустить расширение файла class.php в параметре ‘action’.

Кстати, как я обнаружил, имя нестандартного процессора ДОЛЖНО быть строчным.

Вот код моего собственного процессора — saveorder.class.php:

<?php
class SortArticlesSaveOrderProcessor extends modProcessor {
public function initialize() {
return parent::initialize();
}
public function process() {
$sortOrder = json_decode($this->getProperty('order'));

foreach($sortOrder as $order => $id) {
$page = $this->modx->getObject('modResource', $id);
if (!$page->setTVValue('sort_id', $order)) {
$this->modx->log(xPDO::LOG_LEVEL_ERROR, 'There was a problem saving sort_id in saveorder.class.php');
return 'Ошибка.';
}
}

return 'Изменения успешно сохранены.';
}
}
return 'SortArticlesSaveOrderProcessor';

Как видите, я создаю свой класс, который расширяет класс modProcessor, и переписываю метод ‘process’. В моем случае это вносит некоторые изменения в телевизоры. AJAX-запрос на успех получит строку, которую возвращает метод процесса.

Для более подробной информации, пожалуйста, Google ‘ModProcessor’. Вы обнаружите, что есть много других классов процессоров, предназначенных для экономии вашего времени.

1

Другие решения

Да, вам нужно загрузить MODx, прежде чем пытаться использовать его вне CMP. Я не рекомендую привязывать каждый ajax-файл к действию system->, это излишне. Вы близки к вышесказанному, вот что я часто использую:

if (!defined('MODX_CORE_PATH')) {
if(strpos($_SERVER['SERVER_NAME'],'localhost') !== false){
define('MODX_CORE_PATH', 'C:/xampp/htdocs/yoursitename/core/');
}else{
define('MODX_CORE_PATH', '/home2/yoursitename/public_html/core/');
}
}
if (!defined('MODX_CONFIG_KEY')) {
define('MODX_CONFIG_KEY', 'config');
}
require_once( MODX_CORE_PATH . 'model/modx/modx.class.php');
$modx = new modx();
$modx->initialize('mgr');

Обратите внимание, что вложенный if/else Заявление — это то, что я добавил, чтобы справиться с перемещением между тестовыми сайтами и жить легко. Вы можете просто удалить его и просто сохранить фактический /home2/yoursite..etc если хотел.

Как только вы инициализируете / загрузите MODx в своем PHP-файле, просто используйте $.GET или что-то подобное для обработки запроса.

ПРИМЕЧАНИЕ. Если вы используете пользовательские таблицы базы данных, не забудьте добавить свой пакет, чтобы вы могли общаться с таблицами! Вот ссылка на addPackage запрос: http://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage

0

Я знаю, что это старый пост, но, ища решение той же проблемы, я попал сюда, поэтому я делюсь своим ответом.

Я нашел учебник ниже действительно полезным

http://ridcully.dunnock.modxcloud.com/records/2014/07/08/using-custom-processors-in-modx-revolution-over-ajax-request/?quip_approved=0#quip-success-qcom

0
По вопросам рекламы [email protected]