Как работать с 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-сервера.
Василий Наумкин
26 июня 2012, 13:55
23
11 725
0
Поблагодарить автора Отправить деньги

Комментарии: 25

Иван Брежнев
28 июня 2012, 04:45
0
Создал в корне файл ajax.php, добавил в него строки для подключения MODX API, добавил функции чисто для теста, те через которые раньше делал запросы AJAX'ом по вашей статье про AJAX.

И получается что так запрос выполняется быстрее.
В среднем 100-120 мс, а через сниппет вызванный в ресурсе 150-200

Интересно почему, и какие могут быть печальные последствия использования такого метода?
    Василий Наумкин
    28 июня 2012, 05:17
    0
    Быстрее, думаю, оттого, что не запускается парсер для вывода страницы и обработки плейсхолдеров.

    Последствий никаких. Но лично мне удобнее с Ajax работать при вызове страницы.
    Снаружи я подключаюсь, когда надо серьезно поработать с БД (ипорт-экспорт и все такое)
      Иван Брежнев
      28 июня 2012, 06:34
      0
      Спасибо. Экспериментировал. Раздумываю как удобнее лично для меня будет
      Александр
      11 июня 2015, 13:22
      0
      Василий, Добрый день.
      Подскажите пожалуйста, импорт из CSV позволяет создать более 1000 страниц с заданными параметрами (Имя, описание, алиас и номер шаблона)???
Иван Брежнев
01 июля 2012, 00:09
0
Делаю вот так

// Подключаем
define('MODX_API_MODE', true);
require 'index.php';

// Включаем обработку ​ошибок
$modx->getService('error','error.modError'​;);
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTa​rget(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 '';
}

И ​ничего не происходит (
    Василий Наумкин
    01 июля 2012, 03:42
    0
    И что тут должно произойти? Где вызов хоть какого то метода из miniShop?

    Вы просто запустили класс и он ничего не делает. Если команда getService выполнена с ошибкой — она будет в системном журнале. Если нет — везде пусто.
      Иван Брежнев
      01 июля 2012, 05:56
      0
      У меня там много методов я просто их опустил, решил что вы это поймете.

      Если код инициализации Службы вставить в сниппет то все заводится.
        Василий Наумкин
        01 июля 2012, 06:26
        0
        Вы просто забыли про $scriptProperties.

        https://gist.github.com/3026530
          Иван Брежнев
          01 июля 2012, 06:30
          0
          Точно) Спасибо огромное ))
          Иван Брежнев
          01 июля 2012, 06:31
          0
          Да что-то я лоханулся, он же из сниппета настройки тянет
      Иван Брежнев
      01 июля 2012, 06:03
      0
      var_dump($modx->miniShop->getCart()); // в сниппете выводит string(34) «Ваша корзина пуста»

      Если просто во внешнем файле лежащем в корне сайта, то ничего не выводит
Valentin Raulov
11 августа 2012, 05:09
0
гы… нужно было подключить API к файлу, не в корне сайта?..
Сделал так
require str_replace($_SERVER[«REQUEST_URI»],'',(__FILE__)).'/index.php';
пока работает… на сколько верное такое решение — посмотрим.
К стате $_SERVER['DOCUMENT_ROOT'] — у меня не захватывает потдомен, т.е. путь до основного домена.
Под проект конечно можно всё жостко прописать и не париться, но у меня небольшое расширение — а там у всех по разному.
Константин Баранов
12 декабря 2013, 13:07
1
0
очень полезная инфа, но что с с оф. документацией, что с этой в последней версии движка (2.2.10) вылетает ошибка (причем результат api выдается) Fatal error: Undefined class constant 'LOG_LEVEL_ERROR' in /путь к корню/core/model/modx/error/moderrorhandler.class.php on line 111, чтобы с ней сделать, я думаю не стоит затирать вызовы в этом файле…
    Василий Наумкин
    12 декабря 2013, 13:20
    1
    0
    Это бывает на хостах с установленным php-apc.

    Попробуй добавить
    session_write_close();
    перед выходом из скрипта.

    У тебя же там наверняка есть die() или exit()? Вот перед ним и нужно закрыть сессию.
Roman Smile
21 января 2014, 19:48
0
Дополню. Чтобы можно было подключать такие файлы друг к другу, а также подключать их в сниппеты и плагины с помощью
// Подключение внешнего файла
require $modx->getOption('base_path')."путь/от/корнядомена.php";
можно сделать так:
// Подключаем, если еще не подключено
if (!defined('MODX_API_MODE')) {
	define('MODX_API_MODE', true);
	require 'index.php';
}
Андрей Степаненко
29 октября 2014, 10:33
0
Не совсем понятное
Таким образом вам доступны все методы, словари, процессоры и прочее. Это нужно, например, для импорта/экспорта больших объемов данных из консоли сервера, чтобы не зависить от таймаута web-сервера.
Таймаут он как был так и есть от него не куда не денешься!
    Василий Наумкин
    29 октября 2014, 10:37
    0
    Да ты что?

    И какой же веб сервер мне выдаст timeout, если я запускаю скрипт вот так?
    php myfile.php
      Андрей Степаненко
      29 октября 2014, 10:40
      0
      Ошибку 500 выдаст!
        Василий Наумкин
        29 октября 2014, 11:26
        0
        Кто?

        При запуске из консоли нет веб-сервера, есть php-cli — (command line interpretator).
      Андрей Степаненко
      29 октября 2014, 10:52
      0
      php myfile.php
      Если так запускать то есть разница?
      между wget myfile.php?
        Василий Наумкин
        29 октября 2014, 11:30
        0
        wget запрашивает файл с веб-сервера, через порт 80. php-cli запускает его в консоли сервера.

        Если разница не понятна — то я не знаю о чем тут говорить.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.