Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Поле «Имя» при регистрации нового пользователя

00 голосов
5
По умолчанию в битриксе стоит ограничение на размер поля «Имя» при регистрации пользователя.
Можно ли как-нибудь поменять это значение, до 255 символов, скажем? Подскажите, как это сделать?
спросил 28 Окт, 13 от Asteria (1,840 баллов)

5 Ответы

00 голосов
Цитата
Юрий Шубин пишет:
Можно ли как-нибудь поменять это значение, до 255 символов, скажем? Подскажите, как это сделать?

к сожалению такой возможности нет, т.к. данное ограничение прописано на уровне таблицы b_user, структуру которой изменять нельзя.
ответил 28 Ноя, 13 от JIETYHOK (2,260 баллов)
00 голосов
Цитата
Михаил Митрофанов пишет:
структуру которой изменять нельзя

а что будет, если структура изменить?
ответил 09 Март, 14 от Asteria (1,840 баллов)
00 голосов
Цитата
Михаил Митрофанов пишет:
структуру которой изменять нельзя

а что будет, если структуру изменить?
ответил 30 Июнь, 14 от Asteria (1,840 баллов)
00 голосов
Цитата
Юрий Шубин пишет:
а что будет, если структуру изменить?

http://dev.1c-bitrix.ru/support/faq/8366/#112861
ответил 30 Окт, 14 от JIETYHOK (2,260 баллов)
00 голосов
Ну, вообще, если нельзя, но очень хочется... Как всегда, есть один не очень красивый, но действенный вариант. Если вкратце:

В Битриксе заявлена совместимость с 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 пятой версии и выше.

Выводы: следует иметь ввиду данный подход, но стараться его избегать. В большинстве случаев можно придумать более простое и красивое решение, либо отказаться от задачи.
ответил 28 Фев, 15 от SuPeRSID (180 баллов)

Похожие вопросы

0 голосов
5 ответов
+1 голос
2 ответов
0 голосов
2 ответов