$modx->setOption нужен совет

Добрый день.
В отдельном файле я подключаю класс modx.class.php, создаю новый объект этого класса. Инициализирую контекст.
Могу получить значение системной настройки через getOption(), однако не могу ничего записать в системную настройку через setOption().
информация на офф сайта крайне скудна и говорит, что нужно просто указать имя настройки и значение.
docs.modx.com/xpdo/2.x/class-reference/xpdoobject/configuration-accessors/setoption
Но почему-то у меня не срабатывает и значение в системную настройку не добавляется.
И как-то становиться непонятно, ведь системные настройки располагаются в определенных пространствах имен. По идее может существовать одинаковое название системной настройки, но просто в другом нэймспейсе. Это не должно как-то учитываться при задании значение через setOption? Там я пытаюсь в созданную мной системную настройку USA в моем пространстве имен custom записать значение.
Вот код.
@include(dirname(__FILE__) . '/../../../config.core.php');
//if (!defined('MODX_CORE_PATH')) define('MODX_CORE_PATH', dirname(__FILE__) . '/core/');
/* include the modX class */
if (!@include_once (MODX_CORE_PATH . "model/modx/modx.class.php")) {
    $errorMessage = 'Site temporarily unavailable';
    @include(MODX_CORE_PATH . 'error/unavailable.include.php');
    header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable');
    echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
    exit();
}
/* Create an instance of the modX class */
$modx= new modX();
if (!is_object($modx) || !($modx instanceof modX)) {
    ob_get_level() && @ob_end_flush();
    $errorMessage = '<a href="setup/">MODX not installed. Install now?</a>';
    @include(MODX_CORE_PATH . 'error/unavailable.include.php');
    header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable');
    echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
    exit();
}
$modx->initialize('mgr');
$test = $modx->getOption('emailsender', null, 'i couldt find this');
$modx->setOption('USA','just some text');
echo $test;
Александр Мельник
18 января 2019, 10:42
modx.pro
1 831
0

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

vectorserver
18 января 2019, 11:12
0
Вот:
Запускать из корневой директории сайта
<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 18.01.2019
 * Time: 13:07
 */

define('MODX_API_MODE', true);
require 'index.php';

$modx->getService('error','error.modError');

$modx->setLogLevel(modX::LOG_LEVEL_FATAL);

$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

$modx->switchContext('mgr');

$test = $modx->getOption('emailsender', null, 'i couldt find this');

$modx->setOption('USA', 'Америкосам привет!');

echo $test;
    Александр Мельник
    18 января 2019, 11:20
    0
    Спасибо,
    но в принципе это ничем не отличается от моего кода.
    Просто здесь ваш файл находится в корне, поэтому вы делаете
    require 'index.php';
    А мой файл должен находиться не в корне, поэтому я там отдельно подключаю файл с настройками, потом файл с классом и создаю объект и инициализирую контекст.
    Не могли бы вы пояснить, что именно в вашем коде заставляет его работать, а мой — нет.
      vectorserver
      18 января 2019, 11:51
      0
      Не важно где, почитай про пути относительные тогда
      пример минус 2 директории, к примеру файл лежит в assets/api/
      require './../../index.php';
      А в системных настройках присутствует запись USA?

      ЗЫ: у себя проверил все работает.

      Попробуй еще так
      $USA= $modx->getObject('modSystemSetting', 'USA');
      $USA->set('value', 'Америкосам привет!');
      $USA->save();
      //Чистим кеш
      $modx->cacheManager->refresh(array('system_settings' => array()));
        Александр Мельник
        18 января 2019, 11:59
        0
        Необязательно подключать полностью файл index.php чтобы создать объект modx.
        У меня ведь объект создается без всяких проблем. И контекст инициализируется и getOption() работает.
        Да, такая системная настройка есть.
        Сам пока не пойму, что не так…
        Меня вот лично смущает тот факт, что системные настройки располагаются в пространствах имен, но эти пространства никак не учитываются в методах getOption() и setOption()…
          vectorserver
          18 января 2019, 12:03
          0
          Пробовал на прямую к объекту?
          $USA= $modx->getObject('modSystemSetting', 'USA');
          $USA->set('value', 'Америкосам привет!');
          $USA->save();
          //Чистим кеш
          $modx->cacheManager->refresh(array('system_settings' => array()));
            Александр Мельник
            18 января 2019, 12:09
            0
            Запустил в консоли, да, все записалось корректно.
            А через setOption() не работает.
            Но правда ради чистоты эксперимента нужно попробовать обратиться к объекту напрямую не через консоль в админке а из файла.
              Александр Мельник
              18 января 2019, 12:27
              0
              Да, если работать напрямую с объектом системной настройки, то все ок.
              Если через метод setOption() то не ок.
              Остается только признать, что о том, что этот метод работает не так как ожидается, нам старались намекнуть в документации.
              docs.modx.com/xpdo/2.x/class-reference/xpdoobject/configuration-accessors/setoption
              фразой
              Using setOption does not permanently update an option as xPDO options are not persisted, but loaded on each request.
              Использование setOption не приводит к постоянному обновлению опции?? Но загружаются при каждом запросе… ересь какая-то
        Александр Мельник
        18 января 2019, 11:25
        0
        Кстати тоже не работает ваш код.
        Читать системные настройки читает, а вот ничего не записал в USA.
        Странно.
          vectorserver
          18 января 2019, 11:56
          0
          Не важно где, почитай про пути относительные тогда
          пример минус 2 директории, к примеру файл лежит в assets/api/
          require './../../index.php';
          А в системных настройках присутствует запись USA?

          ЗЫ: у себя проверил все работает.

          Попробуй еще так
          $USA= $modx->getObject('modSystemSetting', 'USA');
          $USA->set('value', 'Америкосам привет!');
          $USA->save();
          //Чистим кеш
          $modx->cacheManager->refresh(array('system_settings' => array()));
        Іван Клімчук
        18 января 2019, 12:58
        0
        И не будет работать, потому что в MODX есть несколько сущностей, где настройки сохраняются. Это просто системные настройки, это системные настройки контекста, системные настройки группы пользователей, системные настройки пользователя. Обычный метод setOption записывает значение в текущий контекст использования, но ему ничего не известно, откуда пришло оригинальное значение настройки. Сейчас правильный и единственный рабочий вариант установить настройку — это работать напрямую с объектом.
        Больше деталей можно почитать тут — github.com/modxcms/revolution/issues/4494
          Александр Мельник
          18 января 2019, 13:31
          0
          Да, спасибо.
          Мы с vectorserver методом проб и ошибок тоже пришли к такому мнению.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11