Я создал 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 меню в менеджере и сделав что-то там
или по-другому (может быть, с помощью разъемов, процессоров, контроллеров …)?
Что ж, спасибо @ 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’. Вы обнаружите, что есть много других классов процессоров, предназначенных для экономии вашего времени.
Да, вам нужно загрузить 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
Я знаю, что это старый пост, но, ища решение той же проблемы, я попал сюда, поэтому я делюсь своим ответом.
Я нашел учебник ниже действительно полезным