Практически каждый модуль имеет настройки. И иногда встает задача, что какую-то настройку для частного конкретного случая надо переопределить (для конкретной группы пользователей, или раздела сайта, или ID сайта). Но меняя в модуле, настройка меняется для всех случаев. Вот как это можно переопределить в частном случае. [spoiler] Дело в том, что все настройки в начале исполнения каждой страницы ложатся в GLOBALS, и если там лежат, то берутся оттуда при вызове COption::GetOptionString. Вот на этом мы и сыграем. Да, кстати, по этой причине в настройках нельзя хранить сколько-нибудь большие данные.
Давайте рассмотрим конкретную задачу: в многосайтовой конфигурации на втором сайте сделаем e-mail НЕ уникальным при регистрации.
Итак, идем от общего к частному, как договорились. Поэтому, глобальную настройку ставим вкл.:
Естественно, на втором сайте получаем отлуп:
Сейчас нам надо понять, в какой этап исполнения страницы внедриться. Небольшое пояснение - в GLOBALS нужная настройка ложится только когда сделан любой вызов COption::GetOptionString, даже если не ваша настройка. Но тут успокою - COption дергается в первых строчках кода (когда ядро выставляет error_reporting), так что вы можете использовать любое удобное событие по ссылке выше. Лучше, если позволяет задача, самый верхний. Возьмем OnPageStart.
Но для начала узнаем имя ключа массива, где хранится нужная настройка. Излюбленный и проверенный метод - через инспектор:
Теперь о том, как хранятся опции в GLOBALS. Хранятся они в ключе MAIN_OPTIONS, разгруппированные по сайтам. Общие настройки для любого сайта лежат в группе [-]. Ну а далее идет дробление по модулям. То есть картина какая-то такая:
(массив ключа [-] на деле огромен, для скрина я его вырезал)
Ну и теперь находим нашу опцию в этом ключе. Конечный путь будет: $GLOBALS['MAIN_OPTIONS']['-']['main']['new_user_email_uniq_check']. И будет содержаться значение Y. Нам надо поменять на N. Код получается предельно простым:
public static function OnPageStart() {
if (SITE_ID == 'vw') {
if (!isset($GLOBALS['MAIN_OPTIONS']['-']['main'])) {
COption::GetOptionString('main', 'foo');
}
$GLOBALS['MAIN_OPTIONS']['-']['main']['new_user_email_uniq_check'] = 'N';
}
}
Зачем isset и вызов GetOption? Это хак, чтобы наполнить GLOBALS, если он вдруг оказался пустым.
Значение меняется у new_user_registration_email_confirmation, но sale.order.ajax все равно считает что включено подтверждение регистрации по емайлу. Пытаюсь сделать, чтобы на момент оформления заказа отключить подтверждение регистрации по email. При вызове:
Долганин Антон, сработал такой код, но он меняет значение настройки глобально для всех пользователей (он был вставлен прямо в init.php и скорее всего срабатывал на начальной стадии загрузки страницы, нужно понять при каком событии и как вызвать этот код):
use \Bitrix\Main\Config\Option;
class A extends Option
{
public static function changeOptions($module, $config, $value)
{
parent::$options[$module]['-'][$config] = $value;
}
}
A::changeOptions('main', 'new_user_registration_email_confirmation', 'N');
Долганин Антон написал: Вот для нового ядра (наследуемся и переопределяем protected)
Возможно для кого-то тема будет все еще актуальна. Код из последнего сообщения Антона в настоящее время не заработает. Вероятно, в одном из обновлений главного модуля было решено сменить порядок хранения настроек и теперь модуль является корневым ключом массива, а настройки с привязкой к сайтам (или без таковой), '-', 's1' и т.д. - являются вложенными в каждый модуль.
Поэтому предлагаю такую реализацию класса для решения данной задачи:
<?php
class ExtendedOption extends \Bitrix\Main\Config\Option
{
/**
* Локально изменить настройку определенного модуля для текущего хита.
* См. подробнее здесь: https://dev.1c-bitrix.ru/community/webdev/user/11948/blog/7799/
*
* @param $module
* @param $parameter
* @param $value
*/
public static function changeOptionForCurrentHit($module, $parameter, $value)
{
if (!isset(parent::$options[$module]['-'][$parameter])) {
static::get($module, $parameter);
}
parent::$options[$module]['-'][$parameter] = $value;
}
}
ExtendedOption::changeOptionForCurrentHit('main', 'captcha_registration', 'N');
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».