Ну, вообще, если нельзя, но очень хочется... Как всегда, есть один не очень красивый, но действенный вариант. Если вкратце:
В Битриксе заявлена совместимость с PHP версии 4. Следовательно, все свойства и методы стандартных классов Битрикса определены без модификатора доступа, а потому, интерпретируются как публичные (public), из чего следует, что они могуть быть переопределены, что и можно использовать для решения задачи. Порядок действий следующий:
1) Создать дополнительное свойство пользователя нужной... э... вместимости, которое и будет использоваться в качестве альтернативного хранилища для имени пользователя.
2) В произвольном неключевом месте, например, в папке bitrix/php_interface/ создать новый php-файл подобного содержания:
Код |
---|
class CPRXUserHook extends CUser {
protected $m_objOriginal;
public function __construct(&$objOriginal) {
$this->m_objOriginal = $objOriginal;
}
public function GetFirstName() {
// Тут, используя $this->m_objOriginal->GetList
// следует получить имя пользователя из ранее
// созданного дополнительного свойства.
// Допустим, получили и записали имя в переменную $szRet
...
return $szRet;
}
...
};
|
Очевидно, в что в этом классе следует переопределить все методы, которые тем или иным образом работают с именем пользователя. Среди них наиболее неприятными являются GetList и GetByID. В этих методах придется получать результат запросов, перебирать его в цикле, забивать результирующий массив, подменять в нем имя пользователя на имя пользователя из расширенного свойства, после чего вручную создавать новый объект класса CDBResult, инициализировать его с помощью метода InitFromArray и возвращать в качестве результата функций. Как видно, способ не самый быстрый и красивый. Таким же образом следует переопределить так же функции создания нового пользователя.
3) В папке bitrix/php_interface создать файл init.php, если он еще не существует и где-нибудь в начале файла прописать следующее:
Код |
---|
AddEventHandler("main", "OnBeforeProlog", "ApplyUserObjectHook");
function ApplyUserObjectHook() {
if (is_object($GLOBALS['USER'])) {
$GLOBALS['USER'] = new CPRXUserHook($GLOBALS['USER']);
}
}
|
Как видно из этого кода, тут происходит подмена глобальной функции $USER, которую используют большинство (а скорее всего и все) стандартные компоненты Битрикс. Таким образом, все обращения к $USER будут проходить через класс CPRXUserHook, который полностью под нашим контролем.
Плюсы данного подхода:
- позволяет модифицировать классы ядра Битрикса без внесения прямых изменений в код ядра и без обращений к базе напрямую, что позволяет не бояться обновлений.
Минусы данного подхода:
- дополнительная нагрузка на сервер; причем для высоконагрузочных сайтов данный пункт является критическим;
- трудозатраты на тестирование и доводку некоторых компонентов;
- отсутствие всяких гарантий: возможно не все компоненты, и определенно не все модули используют глобальную переменную $USER для работы с пользователем. Некоторые самостоятельно создают объект класса CUser со всеми вытекающими последствиями;
- решение точно будет работать только с PHP пятой версии и выше.
Выводы: следует иметь ввиду данный подход, но стараться его избегать. В большинстве случаев можно придумать более простое и красивое решение, либо отказаться от задачи.