Как работать с 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
modx.pro
22 960

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

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

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

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

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

    // Подключаем
    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
      И что тут должно произойти? Где вызов хоть какого то метода из miniShop?

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

        Если код инициализации Службы вставить в сниппет то все заводится.
        Иван Брежнев
        01 июля 2012, 06:03
        var_dump($modx->miniShop->getCart()); // в сниппете выводит string(34) «Ваша корзина пуста»

        Если просто во внешнем файле лежащем в корне сайта, то ничего не выводит
      Valentin Raulov
      11 августа 2012, 05:09
      гы… нужно было подключить API к файлу, не в корне сайта?..
      Сделал так
      require str_replace($_SERVER[«REQUEST_URI»],'',(__FILE__)).'/index.php';
      пока работает… на сколько верное такое решение — посмотрим.
      К стате $_SERVER['DOCUMENT_ROOT'] — у меня не захватывает потдомен, т.е. путь до основного домена.
      Под проект конечно можно всё жостко прописать и не париться, но у меня небольшое расширение — а там у всех по разному.
        Константин Баранов
        12 декабря 2013, 13:07
        очень полезная инфа, но что с с оф. документацией, что с этой в последней версии движка (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
          Это бывает на хостах с установленным php-apc.

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

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

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

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

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