Как работать с MODX Api
Регулярно встречаю в сети разные велосипеды про то, как подключиться к MODX снаружи для работы с его Api. Даже на официальном сайте это описано сложновато.
Так вот, все гораздо проще:
Так вот, все гораздо проще:
// Подключаем
define('MODX_API_MODE', true);
require 'index.php';
// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
Проверяем простую работу с Api:if ($res = $modx->getObject('modResource', 1)) {
print_r($res->toArray());
}
А теперь интереснее:$response = $modx->runProcessor('resource/get', array('id' => 1));
if (!$response->isError()) {
print_r($response->response['object']);
}
else {
$modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
Таким образом вам доступны все методы, словари, процессоры и прочее. Это нужно, например, для импорта/экспорта больших объемов данных из консоли сервера, чтобы не зависить от таймаута web-сервера. Комментарии: 25
Создал в корне файл ajax.php, добавил в него строки для подключения MODX API, добавил функции чисто для теста, те через которые раньше делал запросы AJAX'ом по вашей статье про AJAX.
И получается что так запрос выполняется быстрее.
В среднем 100-120 мс, а через сниппет вызванный в ресурсе 150-200
Интересно почему, и какие могут быть печальные последствия использования такого метода?
И получается что так запрос выполняется быстрее.
В среднем 100-120 мс, а через сниппет вызванный в ресурсе 150-200
Интересно почему, и какие могут быть печальные последствия использования такого метода?
Быстрее, думаю, оттого, что не запускается парсер для вывода страницы и обработки плейсхолдеров.
Последствий никаких. Но лично мне удобнее с Ajax работать при вызове страницы.
Снаружи я подключаюсь, когда надо серьезно поработать с БД (ипорт-экспорт и все такое)
Последствий никаких. Но лично мне удобнее с Ajax работать при вызове страницы.
Снаружи я подключаюсь, когда надо серьезно поработать с БД (ипорт-экспорт и все такое)
Спасибо. Экспериментировал. Раздумываю как удобнее лично для меня будет
Василий, Добрый день.
Подскажите пожалуйста, импорт из CSV позволяет создать более 1000 страниц с заданными параметрами (Имя, описание, алиас и номер шаблона)???
Подскажите пожалуйста, импорт из CSV позволяет создать более 1000 страниц с заданными параметрами (Имя, описание, алиас и номер шаблона)???
Ограничений нет.
Именно страниц, не товаров?
Для MODX это одно и то же.
Делаю вот так
// Подключаем
define('MODX_API_MODE', true);
require 'index.php';
// Включаем обработку ошибок
$modx->getService('error','error.modError';);
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE? 'ECHO': 'HTML');
if (!isset($modx->miniShop) || !is_object($modx->miniShop)) {
$modx->getService('minishopext','miniShopExt', $modx->getOption('core_path').'components/minishop/model/minishop/', $scriptProperties);
if (!($modx->miniShop instanceof miniShopExt)) return '';
}
И ничего не происходит (
// Подключаем
define('MODX_API_MODE', true);
require 'index.php';
// Включаем обработку ошибок
$modx->getService('error','error.modError';);
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE? 'ECHO': 'HTML');
if (!isset($modx->miniShop) || !is_object($modx->miniShop)) {
$modx->getService('minishopext','miniShopExt', $modx->getOption('core_path').'components/minishop/model/minishop/', $scriptProperties);
if (!($modx->miniShop instanceof miniShopExt)) return '';
}
И ничего не происходит (
И что тут должно произойти? Где вызов хоть какого то метода из miniShop?
Вы просто запустили класс и он ничего не делает. Если команда getService выполнена с ошибкой — она будет в системном журнале. Если нет — везде пусто.
Вы просто запустили класс и он ничего не делает. Если команда getService выполнена с ошибкой — она будет в системном журнале. Если нет — везде пусто.
У меня там много методов я просто их опустил, решил что вы это поймете.
Если код инициализации Службы вставить в сниппет то все заводится.
Если код инициализации Службы вставить в сниппет то все заводится.
Вы просто забыли про $scriptProperties.
https://gist.github.com/3026530
https://gist.github.com/3026530
Точно) Спасибо огромное ))
Да что-то я лоханулся, он же из сниппета настройки тянет
var_dump($modx->miniShop->getCart()); // в сниппете выводит string(34) «Ваша корзина пуста»
Если просто во внешнем файле лежащем в корне сайта, то ничего не выводит
Если просто во внешнем файле лежащем в корне сайта, то ничего не выводит
гы… нужно было подключить API к файлу, не в корне сайта?..
Сделал так
require str_replace($_SERVER[«REQUEST_URI»],'',(__FILE__)).'/index.php';
пока работает… на сколько верное такое решение — посмотрим.
К стате $_SERVER['DOCUMENT_ROOT'] — у меня не захватывает потдомен, т.е. путь до основного домена.
Под проект конечно можно всё жостко прописать и не париться, но у меня небольшое расширение — а там у всех по разному.
Сделал так
require str_replace($_SERVER[«REQUEST_URI»],'',(__FILE__)).'/index.php';
пока работает… на сколько верное такое решение — посмотрим.
К стате $_SERVER['DOCUMENT_ROOT'] — у меня не захватывает потдомен, т.е. путь до основного домена.
Под проект конечно можно всё жостко прописать и не париться, но у меня небольшое расширение — а там у всех по разному.
очень полезная инфа, но что с с оф. документацией, что с этой в последней версии движка (2.2.10) вылетает ошибка (причем результат api выдается) Fatal error: Undefined class constant 'LOG_LEVEL_ERROR' in /путь к корню/core/model/modx/error/moderrorhandler.class.php on line 111, чтобы с ней сделать, я думаю не стоит затирать вызовы в этом файле…
Это бывает на хостах с установленным php-apc.
Попробуй добавить
У тебя же там наверняка есть die() или exit()? Вот перед ним и нужно закрыть сессию.
Попробуй добавить
session_write_close();
перед выходом из скрипта.У тебя же там наверняка есть die() или exit()? Вот перед ним и нужно закрыть сессию.
сработало, спасибо, даешь статику!)
Дополню. Чтобы можно было подключать такие файлы друг к другу, а также подключать их в сниппеты и плагины с помощью
// Подключение внешнего файла
require $modx->getOption('base_path')."путь/от/корнядомена.php";
можно сделать так:// Подключаем, если еще не подключено
if (!defined('MODX_API_MODE')) {
define('MODX_API_MODE', true);
require 'index.php';
}
Не совсем понятное
Таким образом вам доступны все методы, словари, процессоры и прочее. Это нужно, например, для импорта/экспорта больших объемов данных из консоли сервера, чтобы не зависить от таймаута web-сервера.Таймаут он как был так и есть от него не куда не денешься!
Да ты что?
И какой же веб сервер мне выдаст timeout, если я запускаю скрипт вот так?
И какой же веб сервер мне выдаст timeout, если я запускаю скрипт вот так?
php myfile.php
Ошибку 500 выдаст!
Кто?
При запуске из консоли нет веб-сервера, есть php-cli — (command line interpretator).
При запуске из консоли нет веб-сервера, есть php-cli — (command line interpretator).
php myfile.phpЕсли так запускать то есть разница?
между wget myfile.php?
wget запрашивает файл с веб-сервера, через порт 80. php-cli запускает его в консоли сервера.
Если разница не понятна — то я не знаю о чем тут говорить.
Если разница не понятна — то я не знаю о чем тут говорить.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.