+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Переопределяем значение GetOptionString для определенного посетителя

Практически каждый модуль имеет настройки. И иногда встает задача, что какую-то настройку для частного конкретного случая надо переопределить (для конкретной группы пользователей, или раздела сайта, или ID сайта). Но меняя в модуле, настройка меняется для всех случаев. Вот как это можно переопределить в частном случае.

Дело в том, что все настройки в начале исполнения каждой страницы ложатся в GLOBALS, и если там лежат, то берутся оттуда при вызове COption::GetOptionString. Вот на этом мы и сыграем. Да, кстати, по этой причине в настройках нельзя хранить сколько-нибудь большие данные.

Давайте рассмотрим конкретную задачу: в многосайтовой конфигурации на втором сайте сделаем e-mail НЕ уникальным при регистрации.

Итак, идем от общего к частному, как договорились. Поэтому, глобальную настройку ставим вкл.:

scr1.png

Естественно, на втором сайте получаем отлуп:

scr2.png

Сейчас нам надо понять, в какой этап исполнения страницы внедриться. Небольшое пояснение - в GLOBALS нужная настройка ложится только когда сделан любой вызов COption::GetOptionString, даже если не ваша настройка. Но тут успокою - COption дергается в первых строчках кода (когда ядро выставляет error_reporting), так что вы можете использовать любое удобное событие по ссылке выше. Лучше, если позволяет задача, самый верхний. Возьмем OnPageStart.

Но для начала узнаем имя ключа массива, где хранится нужная настройка. Излюбленный и проверенный метод - через инспектор:

scr3.png

Теперь о том, как хранятся опции в GLOBALS. Хранятся они в ключе MAIN_OPTIONS, разгруппированные по сайтам. Общие настройки для любого сайта лежат в группе [-]. Ну а далее идет дробление по модулям. То есть картина какая-то такая:

scr4.png

(массив ключа [-] на деле огромен, для скрина я его вырезал)

Ну и теперь находим нашу опцию в этом ключе. Конечный путь будет: $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, если он вдруг оказался пустым.

Готово!

scr5.png

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA