Представляю Вашему вниманию короткую статью о том, как искать объяснение непонятных явлений в битриксе. В качестве примера приведу историю — когда-то, еще на заре изучения системы, мне удалось вывести в форме авторизации капчу. Причем как это вышло, выяснить не получилось. И вот сейчас, кастомизируя очередной шаблон компонента авторизации, обнаружился код ее выводящий. Спортивный интерес и отсутствие информации в официальной документации (хотя вполне может быть, я просто не нашел то что нужно) подтолкнули меня на маленькое расследование.

Первым делом, надо посмотреть в шаблоне компонента элемент массива, в котором приходит флаг показа капчи — несложно увидеть, что это $arResult[«CAPTCHA_CODE»]. Массив arResult формируется внутри компонента, поэтому следующим шагом стало изучение содержимого bitrix\components\bitrix\system.auth.form\component.php. Найденный фрагмент кода показал, что за капчу отвечает функция NeedCAPTHAForLogin, которая по логину пользователя решает, выводить ее или нет.

if($APPLICATION->NeedCAPTHAForLogin($arResult["USER_LOGIN"]))
{
    $arResult["CAPTCHA_CODE"] = $APPLICATION->CaptchaGetCode();
}
else
{
    $arResult["CAPTCHA_CODE"] = false;
}

Api-help битрикса о назначении NeedCAPTHAForLogin рассказывать отказался, в настройках пользователя заветной галочки не оказалось. Остается найти и посмотреть исходник этой загадочной функции. С помощью Total Commander (или аналога) в директории bitrix\modules\main\ ищем файлы, содержащие текст NeedCAPTHAForLogin. Напомню, что такие исследования доступны счастливым обладателям версии в исходных кодах. Итак, результат поиска — файлик \bitrix\modules\main\classes\general\main.php. Находим кусок кода функции NeedCAPTHAForLogin, который ставит все точки над i

if(strlen($login) > 0)
{
    $rsUser = CUser::GetList($o, $b, array("LOGIN_EQUAL_EXACT" => $login));
    $arUser = $rsUser->Fetch();
    if($arUser)
    {
        $arPolicy = CUser::GetGroupPolicy($arUser["ID"]);
        $POLICY_ATTEMPTS = intval($arPolicy["LOGIN_ATTEMPTS"]);
        $USER_ATTEMPTS = intval($arUser["LOGIN_ATTEMPTS"]);
    }
}

Оказывается, вывод капчи в форме авторизации регулируется в настройках групповой политики неприметной галочкой в самом конце списка.

Приведенный способ иногда действует даже быстрее поиска по документации разработчиков. К тому же, дает возможность посмотреть на систему изнутри, понять принципы ее функционирования, и следовательно, писать более адаптированный код.

Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!

Подписаться в telegram

7 комментариев “Битрикс: в поисках потерянной капчи

  1. Sergey

    день добрый Алексей. я только разбираюсь в битриксе, ваш блог очень помогает, спасибо большое!

  2. PuBlik

    Столкнулся с необходимостью отодвинуть вывод капчи не на третью попытку а дальше. Пересмотрел все настройки в разделе «настройки продукта», начал ковырять компонент, единственное описание NeedCAPTHAForLogin в интернете нашел только у вас.
    Огромное спасибо за статью!

  3. Hippie

    Стандартная уже мысль, при очередном затыке — надо посмотреть у Валеева :)
    В очередной раз нашел решение. Спасибо!

  4. Иван

    Спасибо! Реально помогла статья! Еще запутывает то, что в данной ситуации API битрикса при авторизации через $USER->Login() выдает сообщение «Неверный логин или пароль.», а про капчу ни слова!

  5. Сергей

    Большое спасибо. Разбирался в коде и застрял именно на функции NeedCAPTHAForLogin

  6. Виктор

    Файлы формата CHM обновляются ежемесячно, тем не менее, возможно некоторое отставание их от онлайновой версии курса.

Добавить комментарий

Ваш адрес email не будет опубликован.