Как работать с 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
27
21 279
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 запускает его в консоли сервера.

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