$modx->setOption нужен совет
Добрый день.
В отдельном файле я подключаю класс modx.class.php, создаю новый объект этого класса. Инициализирую контекст.
Могу получить значение системной настройки через getOption(), однако не могу ничего записать в системную настройку через setOption().
информация на офф сайта крайне скудна и говорит, что нужно просто указать имя настройки и значение.
docs.modx.com/xpdo/2.x/class-reference/xpdoobject/configuration-accessors/setoption
Но почему-то у меня не срабатывает и значение в системную настройку не добавляется.
И как-то становиться непонятно, ведь системные настройки располагаются в определенных пространствах имен. По идее может существовать одинаковое название системной настройки, но просто в другом нэймспейсе. Это не должно как-то учитываться при задании значение через setOption? Там я пытаюсь в созданную мной системную настройку USA в моем пространстве имен custom записать значение.
Вот код.
В отдельном файле я подключаю класс 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;
Комментарии: 11
Вот:
Запускать из корневой директории сайта
Запускать из корневой директории сайта
<?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;
Спасибо,
но в принципе это ничем не отличается от моего кода.
Просто здесь ваш файл находится в корне, поэтому вы делаете
Не могли бы вы пояснить, что именно в вашем коде заставляет его работать, а мой — нет.
но в принципе это ничем не отличается от моего кода.
Просто здесь ваш файл находится в корне, поэтому вы делаете
require 'index.php';
А мой файл должен находиться не в корне, поэтому я там отдельно подключаю файл с настройками, потом файл с классом и создаю объект и инициализирую контекст.Не могли бы вы пояснить, что именно в вашем коде заставляет его работать, а мой — нет.
Не важно где, почитай про пути относительные тогда
пример минус 2 директории, к примеру файл лежит в assets/api/
ЗЫ: у себя проверил все работает.
Попробуй еще так
пример минус 2 директории, к примеру файл лежит в assets/api/
require './../../index.php';
А в системных настройках присутствует запись USA?ЗЫ: у себя проверил все работает.
Попробуй еще так
$USA= $modx->getObject('modSystemSetting', 'USA');
$USA->set('value', 'Америкосам привет!');
$USA->save();
//Чистим кеш
$modx->cacheManager->refresh(array('system_settings' => array()));
Необязательно подключать полностью файл index.php чтобы создать объект modx.
У меня ведь объект создается без всяких проблем. И контекст инициализируется и getOption() работает.
Да, такая системная настройка есть.
Сам пока не пойму, что не так…
Меня вот лично смущает тот факт, что системные настройки располагаются в пространствах имен, но эти пространства никак не учитываются в методах getOption() и setOption()…
У меня ведь объект создается без всяких проблем. И контекст инициализируется и getOption() работает.
Да, такая системная настройка есть.
Сам пока не пойму, что не так…
Меня вот лично смущает тот факт, что системные настройки располагаются в пространствах имен, но эти пространства никак не учитываются в методах getOption() и setOption()…
Пробовал на прямую к объекту?
$USA= $modx->getObject('modSystemSetting', 'USA');
$USA->set('value', 'Америкосам привет!');
$USA->save();
//Чистим кеш
$modx->cacheManager->refresh(array('system_settings' => array()));
Запустил в консоли, да, все записалось корректно.
А через setOption() не работает.
Но правда ради чистоты эксперимента нужно попробовать обратиться к объекту напрямую не через консоль в админке а из файла.
А через setOption() не работает.
Но правда ради чистоты эксперимента нужно попробовать обратиться к объекту напрямую не через консоль в админке а из файла.
Да, если работать напрямую с объектом системной настройки, то все ок.
Если через метод setOption() то не ок.
Остается только признать, что о том, что этот метод работает не так как ожидается, нам старались намекнуть в документации.
docs.modx.com/xpdo/2.x/class-reference/xpdoobject/configuration-accessors/setoption
фразой
Если через метод 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 не приводит к постоянному обновлению опции?? Но загружаются при каждом запросе… ересь какая-то
Кстати тоже не работает ваш код.
Читать системные настройки читает, а вот ничего не записал в USA.
Странно.
Читать системные настройки читает, а вот ничего не записал в USA.
Странно.
Не важно где, почитай про пути относительные тогда
пример минус 2 директории, к примеру файл лежит в assets/api/
ЗЫ: у себя проверил все работает.
Попробуй еще так
пример минус 2 директории, к примеру файл лежит в assets/api/
require './../../index.php';
А в системных настройках присутствует запись USA?ЗЫ: у себя проверил все работает.
Попробуй еще так
$USA= $modx->getObject('modSystemSetting', 'USA');
$USA->set('value', 'Америкосам привет!');
$USA->save();
//Чистим кеш
$modx->cacheManager->refresh(array('system_settings' => array()));
И не будет работать, потому что в MODX есть несколько сущностей, где настройки сохраняются. Это просто системные настройки, это системные настройки контекста, системные настройки группы пользователей, системные настройки пользователя. Обычный метод setOption записывает значение в текущий контекст использования, но ему ничего не известно, откуда пришло оригинальное значение настройки. Сейчас правильный и единственный рабочий вариант установить настройку — это работать напрямую с объектом.
Больше деталей можно почитать тут — github.com/modxcms/revolution/issues/4494
Больше деталей можно почитать тут — github.com/modxcms/revolution/issues/4494
Да, спасибо.
Мы с vectorserver методом проб и ошибок тоже пришли к такому мнению.
Мы с vectorserver методом проб и ошибок тоже пришли к такому мнению.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.