Битрикс ошибка регистрации нового пользователя

 

Здравствуйте.

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

У нас сделано так, что вся регистрация происходит автоматически, эмейл на уникальность не проверяется, письма о регистрации не приходят и на один адрес можно оформлять заказы повторно. Это сделано для того, чтобы не мучать людей ЛК и Асей регистрацией. Просо зашли люди и оформили заказ. Все работает стандартными методами битрикса.

Сейчас же, уже несколько звонков, что на этапе последнего оформления заказа, то есть подтверждения уже возникает ошибка: Ошибка регистрации нового пользователя: пользователь с номером телефона…. уже существует.

Что делать? Настройки не менялись, все как и было. Но видимо, мосле обновлений битрикса он стал проверять номер телефона на уникальность и говорить, что такой уже есть. В главном модуле да, появились две новый галки (у нас не активны), что использовать номер телефона и телефон является обязательным. Но про уникальность ничего. Как отключить эту новою функцию битрикса? Кто что посоветует?  

 
http://joxi.ru/D2PyBMGIqad6BA

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

 

Путем изучения sale.order.ajax выяснилось, что в этой проблеме помогли настройки — в главном модуле установить

http://prntscr.com/oald3x

(если на вашем сайте это допустимо) и в настройках sale.order.ajax «ALLOW_APPEND_ORDER» => ‘Y’

GYRYs , если нашли другое решение, поделитесь, пожалуйста

 

В том то и дело, что там ничего не стоит.

Написал в поддержку, они сняли галочку в настройках магазина в списке свойств заказа в телефоне «является как телефон». И вроде как, обсудят с разработчиками что делать.  

 

Изучил что не так.
пока думаю что проблема пришла с этого обновления

Модуль «Интернет-магазин» Обновление 18.6.500

«Добавлена возможность регистрации покупателей по номеру телефона в компоненте sale.order.ajax.»

Проблема даже не в компоненте , а в том как регистрируется пользователь и что при этом происходит с полем указанным как телефон.
В главном модуле добавились несколько классов отвечающие за обработку  телефонов,
В момент регистрации пользователя с полем телефона происходит ряд проверок и нет ни каких условий на параметры/настройки модуля,  
то есть процесс прохождения проверки телефона на уникальность и соответствие формату номера выбранной страны прямолинеен и обойти его не меняя ядро невозможно.
Единственное что можно сделать это не передавать этот параметр для регистрации пользователя.
а как это сделать уже сами решайте:

самый простой способ это отключить галочку в свойствах заказа «это поле является телефоном»
но в этом случае мы теряем весь функционал связанный с телефоном в модуле интернет магазин.  

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

 

Ждём решения от разработчиков

 

Пользователь 1242451

Заглянувший

Сообщений: 13
Баллов: 1
Регистрация: 30.06.2017

#7

0

09.07.2019 12:06:24

Цитата
GYRYs написал:
Ждём решения от разработчиков

Поддерживаю. Вопрос теперь когда ждать обновления с доработкой по данному функционалу.

 

Тоже столкнулся в данной проблемой, опять прилетело кривое обновление.
Задолбали уже хрень выкатывать, не протестировав ничего.
Отдел тестирования у них вообще работает ?

Весной тоже пришло уведолмение что выкатили обновления и теперь для умного фильтра (catalog.smart.filter) работает предфильтрация …. сегодня проверил, ага, хрен там был, нихрена как не работало так и не работает.

 

Пользователь 252363

Заглянувший

Сообщений: 10
Баллов: 1
Регистрация: 28.05.2014

#9

1

10.07.2019 13:56:46

В файле class.php который находится в /bitrix/components/bitrix/sale.order.ajax есть функция она где то на 1700 rкакой то строке

Код
protected function registerAndLogIn($userProps)
   {
      $userId = false;
      $userData = $this->generateUserData($userProps);

      $fields = [
         'LOGIN' => $userData['NEW_LOGIN'],
         'NAME' => $userData['NEW_NAME'],
         'LAST_NAME' => $userData['NEW_LAST_NAME'],
         'PASSWORD' => $userData['NEW_PASSWORD'],
         'CONFIRM_PASSWORD' => $userData['NEW_PASSWORD_CONFIRM'],
         'EMAIL' => $userData['NEW_EMAIL'],
         'GROUP_ID' => $userData['GROUP_ID'],
         'ACTIVE' => 'Y',
         'LID' => $this->getSiteId(),
         'PHONE_NUMBER' => isset($userProps['PHONE']) ? $userProps['PHONE'] : '',
         'PERSONAL_PHONE' => isset($userProps['PHONE']) ? $this->getNormalizedPhone($userProps['PHONE']) : '',
         'PERSONAL_ZIP' => isset($userProps['ZIP']) ? $userProps['ZIP'] : '',
         'PERSONAL_STREET' => isset($userProps['ADDRESS']) ? $userProps['ADDRESS'] : '',
      ];

      if ($this->arParams['IS_LANDING_SHOP'] === 'Y')
      {
         $fields['GROUP_ID'] = BitrixCrmOrderBuyerGroup::getDefaultGroups();
         $fields['EXTERNAL_AUTH_ID'] = 'shop';

         // reset department for intranet
         $fields['UF_DEPARTMENT'] = [];

         // rewrite login with email
         if (!empty($userData['NEW_EMAIL']))
         {
            $fields['LOGIN'] = $userData['NEW_EMAIL'];
         }
      }

      $user = new CUser;
      $addResult = $user->Add($fields);

      if (intval($addResult) <= 0)
      {
         $this->addError(Loc::getMessage('STOF_ERROR_REG').((strlen($user->LAST_ERROR) > 0) ? ': '.$user->LAST_ERROR : ''), self::AUTH_BLOCK);
      }
      else
      {
         global $USER;

         $userId = intval($addResult);
         $USER->Authorize($addResult);

         if ($USER->IsAuthorized())
         {
            if ($this->arParams['SEND_NEW_USER_NOTIFY'] == 'Y')
            {
               if (
                  isset($this->arParams['CONTEXT_SITE_ID']) &&
                  $this->arParams['CONTEXT_SITE_ID'] > 0 &&
                  Loader::includeModule('landing')
               )
               {
                  $componentName = 'bitrix:landing.pub';
                  /** @var LandingPubComponent $className */
                  $className = CBitrixComponent::includeComponentClass($componentName);
                  $className::replaceUrlInLetter(
                     $this->arParams['CONTEXT_SITE_ID']
                  );
               }
               CUser::SendUserInfo($USER->GetID(), $this->getSiteId(), Loc::getMessage('INFO_REQ'), true);
            }
         }
         else
         {
            $this->addError(Loc::getMessage('STOF_ERROR_REG_CONFIRM'), self::AUTH_BLOCK);
         }
      }

      return $userId;
   }

меняем на предпоследнюю версию компонента где не было проблем с регистрацией пользователя с телефоном и его повторной авторизацией

Код
   protected function registerAndLogIn($userProps)
   {
      $userId = false;
      $userData = $this->generateUserData($userProps);

      $fields = [
         'LOGIN' => $userData['NEW_LOGIN'],
         'NAME' => $userData['NEW_NAME'],
         'LAST_NAME' => $userData['NEW_LAST_NAME'],
         'PASSWORD' => $userData['NEW_PASSWORD'],
         'CONFIRM_PASSWORD' => $userData['NEW_PASSWORD_CONFIRM'],
         'EMAIL' => $userData['NEW_EMAIL'],
         'GROUP_ID' => $userData['GROUP_ID'],
         'ACTIVE' => 'Y',
         'LID' => $this->getSiteId(),
         'PERSONAL_PHONE' => isset($userProps['PHONE']) ? $this->getNormalizedPhone($userProps['PHONE']) : '',
         'PERSONAL_ZIP' => isset($userProps['ZIP']) ? $userProps['ZIP'] : '',
         'PERSONAL_STREET' => isset($userProps['ADDRESS']) ? $userProps['ADDRESS'] : '',
      ];

      if ($this->arParams['IS_LANDING_SHOP'] === 'Y')
      {
         $fields['GROUP_ID'] = BitrixCrmOrderBuyerGroup::getDefaultGroups();
         $fields['EXTERNAL_AUTH_ID'] = 'shop';

         // reset department for intranet
         $fields['UF_DEPARTMENT'] = [];

         // rewrite login with email
         if (!empty($userData['NEW_EMAIL']))
         {
            $fields['LOGIN'] = $userData['NEW_EMAIL'];
         }
      }

      $user = new CUser;
      $addResult = $user->Add($fields);

      if (intval($addResult) <= 0)
      {
         $this->addError(Loc::getMessage('STOF_ERROR_REG').((strlen($user->LAST_ERROR) > 0) ? ': '.$user->LAST_ERROR : ''), self::AUTH_BLOCK);
      }
      else
      {
         global $USER;

         $userId = intval($addResult);
         $USER->Authorize($addResult);

         if ($USER->IsAuthorized())
         {
            if ($this->arParams['SEND_NEW_USER_NOTIFY'] == 'Y')
            {
               CUser::SendUserInfo($USER->GetID(), $this->getSiteId(), Loc::getMessage('INFO_REQ'), true);
            }
         }
         else
         {
            $this->addError(Loc::getMessage('STOF_ERROR_REG_CONFIRM'), self::AUTH_BLOCK);
         }
      }

      return $userId;
   }

и проблема решена  

 

Пользователь 306532

Постоянный посетитель

Сообщений: 99
Баллов: 17
Регистрация: 19.01.2015

#10

0

11.07.2019 11:28:01

dpechurkin, В любом случае, хорошо чтобы они сами исправили и не надо было дорабатывать самостоятельно.  

Не удается создать нового пользователя с использованием ранее зарегистрированного электронного ящика

ID статьи: 241
, создана 22 июн 2017

При регистрации нового профиля на существующий электронный адрес во время оформлении заказа вылетает сообщение: «Ошибка регистрации нового пользователя: Email %адрес электронной почты% уже используется».


Решение

Активируйте проверку электронных адресов при регистрации на уникальность.

Настройку можно найти в административной части сайта: Настройки → Настройки продукта → Настройки модулей → Главный модуль, вкладка «Авторизация», группа настроек «Регистрация новых пользователей».


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

Пример регистрации на один email:


Результат в личном кабинете:


Возможности системного компонента регистрации довольно скромные: нет возможности добавить свои поля, сделать их обязательными для заполнения. Для реализации таких возможностей есть компонент «Настраиваемая регистрация», который позволяет настроить и разместить на сайте свою форму регистрации. В визуальном редакторе компонент расположен по пути: «Служебные • Пользователь • Настраиваемая регистрация».

Пример вызова компонента

<?php
$APPLICATION->IncludeComponent(     // Настраиваемая регистрация
    "bitrix:main.register",
    "",
    array(
        "AUTH" => "Y",              // Автоматически авторизовать пользователей
        "REQUIRED_FIELDS" => array( // Поля, обязательные для заполнения
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
        ),
        "SET_TITLE" => "Y",         // Устанавливать заголовок страницы
        "SHOW_FIELDS" => array(     // Поля, которые показывать в форме
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
        ),
        "SUCCESS_PAGE" => "",       // Страница окончания регистрации
        "USER_PROPERTY" => "",      // Показывать дополнительные свойства
        "USER_PROPERTY_NAME" => "", // Название блока пользовательских свойств
        "USE_BACKURL" => "N",       // Отправлять пользователя по обратной ссылке
    ),
    false
);
?>

Создадим страницу /auth/register.php, разместим на ней вызов компонента «Настраиваемая регистрация». В настройках компонента выберем поля, которые надо показывать:

  • [EMAIL] E-mail
  • [NAME] Имя
  • [LAST_NAME] Фамилия
  • [PERSONAL_PHONE] Телефон
  • [WORK_COMPANY] Наименование компании
  • [WORK_PHONE] Телефон (рабочий)

И укажем поля, обязательные для заполнения:

  • [EMAIL] E-mail
  • [NAME] Имя
  • [LAST_NAME] Фамилия
  • [PERSONAL_PHONE] Телефон

После этого страница /auth/register.php содержит следующий код:

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Регистрация");
?>

<?php
$APPLICATION->IncludeComponent(
    "bitrix:main.register",
    ".default",
    array(
        "AUTH" => "N",
        "COMPONENT_TEMPLATE" => ".default",
        "REQUIRED_FIELDS" => array(
            0=>"EMAIL",
            1=>"NAME",
            2=>"LAST_NAME",
            3=>"PERSONAL_PHONE",
        ),
        "SET_TITLE" => "Y",
        "SHOW_FIELDS" => array(
            0=>"EMAIL",
            1=>"NAME",
            2=>"LAST_NAME",
            3=>"PERSONAL_PHONE",
            4=>"WORK_COMPANY",
            5=>"WORK_PHONE",
        ),
        "SUCCESS_PAGE" => "/auth/",
        "USER_PROPERTY" => array(),
        "USER_PROPERTY_NAME" => "",
        "USE_BACKURL" => "N"
    )
);
?>

<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>

И имеет такой вид:

Теперь нам надо кастомизировать форму регистрации под наш дизайн. Для этого копируем шаблон компонента:

  • откуда: bitrix/components/bitrix/main.register/templates/.default
  • куда: local/templates/.default/components/bitrix/main.register/.default

После внесения изменений получилось так:

<? /* * Файл local/templates/.default/components/bitrix/main.register/.default/template.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?> <?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован */ ?> <p><?= GetMessage('MAIN_REGISTER_REG_AUTH'); /* Вы зарегистрированы и авторизованы */ ?></p> <?php return ?> <?php endif; ?> <div class="bitrix-main-register"> <h2><?= GetMessage('MAIN_REGISTER_FORM_TITLE'); /* заголовок формы */ ?></h2> <?php if (count($arResult["ERRORS"]) > 0): /* сообщения об ошибках при заполнении формы */ ?> <?php foreach ($arResult["ERRORS"] as $key => $error) { if (intval($key) == 0 && $key !== 0) { $arResult["ERRORS"][$key] = str_replace( "#FIELD_NAME#", '«'.GetMessage('MAIN_REGISTER_'.$key).'»', $error ); } } ShowError(implode("<br />", $arResult["ERRORS"])); ?> <?php elseif ($arResult["USE_EMAIL_CONFIRMATION"] === "Y"): ?> <p><?= GetMessage('MAIN_REGISTER_EMAIL_HELP'); /* будет отправлено письмо для подтверждения */ ?></p> <?php endif; ?> <form method="post" action="<?= POST_FORM_ACTION_URI; ?>" name="regform" enctype="multipart/form-data"> <?php if ($arResult["BACKURL"] <> ''): ?> <input type="hidden" name="backurl" value="<?= $arResult["BACKURL"]; ?>" /> <?php endif; ?> <?php foreach ($arResult["SHOW_FIELDS"] as $FIELD): ?> <?php if ($FIELD == "AUTO_TIME_ZONE" && $arResult["TIME_ZONE_ENABLED"]): /* часовой пояс */ ?> <!-- код удален --> <?php continue; ?> <?php endif; ?> <div> <span> <?= GetMessage('MAIN_REGISTER_'.$FIELD); /* очередное поле */ ?> <?php if ($arResult["REQUIRED_FIELDS_FLAGS"][$FIELD] == "Y"): ?> <i>*</i> <!-- поле обязательно для заполнения --> <?php endif; ?> </span> <span> <?php if ($FIELD == "PASSWORD"): /* пароль */ ?> <input type="password" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>" autocomplete="off" /> <?php if ($arResult["SECURE_AUTH"]): /* безопасная авторизация */ ?> <!-- код удален --> <?php endif; ?> <?php elseif ($FIELD == "CONFIRM_PASSWORD"): /* подтверждение пароля */ ?> <input type="password" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>" autocomplete="off" /> <?php elseif ($FIELD == "PERSONAL_GENDER"): /* пол: мужской, женский */ ?> <select name="REGISTER[<?= $FIELD; ?>]"> <option value=""> <?= GetMessage('MAIN_REGISTER_USER_UNKNOWN'); ?> </option> <option value="M"<?= $arResult["VALUES"][$FIELD] == 'M' ? ' selected="selected"' : ''; ?>> <?= GetMessage('MAIN_REGISTER_USER_MALE'); ?> </option> <option value="F"<?= $arResult["VALUES"][$FIELD] == 'F' ? ' selected="selected"' : ''; ?>> <?= GetMessage('MAIN_REGISTER_USER_FEMALE'); ?> </option> </select> <?php elseif (in_array($FIELD, array("PERSONAL_COUNTRY", "WORK_COUNTRY"))): /* страна проживания или работы */ ?> <select name="REGISTER[<?= $FIELD; ?>]"> <?php foreach ($arResult["COUNTRIES"]["reference_id"] as $key => $value): ?> <?php $selected = ($value == $arResult["VALUES"][$FIELD]) ? ' selected="selected"' : ''; ?> <option value="<?= $value; ?>"<?= $selected; ?>> <?= $arResult["COUNTRIES"]["reference"][$key]; ?> </option> <?php endforeach; ?> </select> <?php elseif (in_array($FIELD, array("PERSONAL_PHOTO", "WORK_LOGO"))): /* личное фото */ ?> <input type="file" name="REGISTER_FILES_<?= $FIELD; ?>" /> <?php elseif (in_array($FIELD, array("PERSONAL_NOTES", "WORK_NOTES"))): ?> <textarea name="REGISTER[<?= $FIELD; ?>]"> <?= $arResult["VALUES"][$FIELD]; ?> </textarea> <?php elseif ($FIELD == "PERSONAL_BIRTHDAY"): /* дата рождения */ ?> <small><?= $arResult["DATE_FORMAT"]; ?></small><br /> <input size="30" type="text" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>" /> <?php $APPLICATION->IncludeComponent( 'bitrix:main.calendar', '', array( 'SHOW_INPUT' => 'N', 'FORM_NAME' => 'regform', 'INPUT_NAME' => 'REGISTER[PERSONAL_BIRTHDAY]', 'SHOW_TIME' => 'N' ), null, array("HIDE_ICONS"=>"Y") ); ?> <?php else: ?> <input type="text" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>" /> <?php endif; ?> </span> </div> <?php endforeach; ?> <?php /***** User properties *****/ ?> <?php if($arResult["USER_PROPERTIES"]["SHOW"] == "Y"): ?> <h3> <?= empty($arParams["USER_PROPERTY_NAME"]) ? GetMessage("USER_TYPE_EDIT_TAB") : $arParams["USER_PROPERTY_NAME"]; ?> </h3> <?php foreach ($arResult["USER_PROPERTIES"]["DATA"] as $FIELD_NAME => $arUserField): ?> <div> <span> <?= $arUserField["EDIT_FORM_LABEL"]; ?> <?php if ($arUserField["MANDATORY"]=="Y"): ?> <i>*</i> <!-- поле обязательно для заполнения --> <?php endif; ?> </span> <span> <?php $APPLICATION->IncludeComponent( "bitrix:system.field.edit", $arUserField["USER_TYPE"]["USER_TYPE_ID"], array( "bVarsFromForm" => $arResult["bVarsFromForm"], "arUserField" => $arUserField, "form_name" => "regform" ), null, array("HIDE_ICONS"=>"Y") ); ?> </span> </div> <?php endforeach; ?> <?php endif; ?> <?php /***** User properties *****/ ?> <?php if ($arResult["USE_CAPTCHA"] == "Y"): /* использовать CAPTCHA? */ ?> <div class="captcha"> <h3><?= GetMessage('MAIN_REGISTER_CAPTCHA_TITLE'); ?></h3> <input type="hidden" name="captcha_sid" value="<?= $arResult["CAPTCHA_CODE"]; ?>" /> <img src="/bitrix/tools/captcha.php?captcha_sid=<?= $arResult["CAPTCHA_CODE"]; ?>" width="180" height="40" alt="CAPTCHA" /> <span> <?= GetMessage('MAIN_REGISTER_CAPTCHA_HELP'); ?> <i>*</i> </span> <span> <input type="text" name="captcha_word" maxlength="50" value="" /> </span> </div> <?php endif; ?> <div class="submit"> <input type="submit" name="register_submit_button" value="<?= GetMessage('MAIN_REGISTER_FORM_SUBMIT'); /* кнопка отправки формы */ ?>" /> </div> </form> <p> <?= $arResult["GROUP_POLICY"]["PASSWORD_REQUIREMENTS"]; /* предупреждение о min длине пароля */?> </p> <p> <i>*</i> <?= GetMessage('MAIN_REGISTER_REQUIRED'); /* Эти поля обязательны для заполнения */ ?> </p> </div>
<?php /* * Файл local/templates/.default/components/bitrix/main.register/.default/lang/ru/template.php */ $MESS['MAIN_REGISTER_FORM_TITLE'] = 'Регистрация'; $MESS['MAIN_REGISTER_REG_AUTH'] = 'Вы зарегистрированы и успешно авторизованы.'; $MESS['MAIN_REGISTER_EMAIL_HELP'] = 'На указанный в форме e-mail придет запрос на подтверждение регистрации.'; $MESS['MAIN_REGISTER_LOGIN'] = 'Логин'; $MESS['MAIN_REGISTER_EMAIL'] = 'E-mail'; $MESS['MAIN_REGISTER_PASSWORD'] = 'Пароль'; $MESS['MAIN_REGISTER_CONFIRM_PASSWORD'] = 'Подтверждение пароля'; $MESS['MAIN_REGISTER_NAME'] = 'Имя'; $MESS['MAIN_REGISTER_SECOND_NAME'] = 'Отчество'; $MESS['MAIN_REGISTER_LAST_NAME'] = 'Фамилия'; $MESS['MAIN_REGISTER_TITLE'] = 'Обращение'; $MESS['MAIN_REGISTER_USER_UNKNOWN'] = 'Нет данных'; $MESS['MAIN_REGISTER_USER_MALE'] = 'Мужской'; $MESS['MAIN_REGISTER_USER_FEMALE'] = 'Женский'; $MESS['MAIN_REGISTER_PERSONAL_PROFESSION'] = 'Профессия'; $MESS['MAIN_REGISTER_PERSONAL_WWW'] = 'WWW-страница'; $MESS['MAIN_REGISTER_PERSONAL_ICQ'] = 'ICQ'; $MESS['MAIN_REGISTER_PERSONAL_GENDER'] = 'Пол'; $MESS['MAIN_REGISTER_PERSONAL_BIRTHDAY'] = 'Дата рождения'; $MESS['MAIN_REGISTER_PERSONAL_PHOTO'] = 'Фотография'; $MESS['MAIN_REGISTER_PERSONAL_PHONE'] = 'Телефон'; $MESS['MAIN_REGISTER_PERSONAL_FAX'] = 'Факс'; $MESS['MAIN_REGISTER_PERSONAL_MOBILE'] = 'Мобильный'; $MESS['MAIN_REGISTER_PERSONAL_PAGER'] = 'Пейджер'; $MESS['MAIN_REGISTER_PERSONAL_STREET'] = 'Улица, дом'; $MESS['MAIN_REGISTER_PERSONAL_MAILBOX'] = 'Почтовый ящик'; $MESS['MAIN_REGISTER_PERSONAL_CITY'] = 'Город'; $MESS['MAIN_REGISTER_PERSONAL_STATE'] = 'Область / край'; $MESS['MAIN_REGISTER_PERSONAL_ZIP'] = 'Почтовый индекс'; $MESS['MAIN_REGISTER_PERSONAL_COUNTRY'] = 'Страна'; $MESS['MAIN_REGISTER_PERSONAL_NOTES'] = 'Дополнительные заметки'; $MESS['MAIN_REGISTER_WORK_COMPANY'] = 'Наименование компании'; $MESS['MAIN_REGISTER_WORK_DEPARTMENT'] = 'Департамент / Отдел'; $MESS['MAIN_REGISTER_WORK_POSITION'] = 'Должность'; $MESS['MAIN_REGISTER_WORK_WWW'] = 'WWW-страница (работа)'; $MESS['MAIN_REGISTER_WORK_PHONE'] = 'Телефон (работа)'; $MESS['MAIN_REGISTER_WORK_FAX'] = 'Факс (работа)'; $MESS['MAIN_REGISTER_WORK_PAGER'] = 'Пейджер (работа)'; $MESS['MAIN_REGISTER_WORK_STREET'] = 'Улица, дом (работа)'; $MESS['MAIN_REGISTER_WORK_MAILBOX'] = 'Почтовый ящик (работа)'; $MESS['MAIN_REGISTER_WORK_CITY'] = 'Город (работа)'; $MESS['MAIN_REGISTER_WORK_STATE'] = 'Область / край (работа)'; $MESS['MAIN_REGISTER_WORK_ZIP'] = 'Почтовый индекс (работа)'; $MESS['MAIN_REGISTER_WORK_COUNTRY'] = 'Страна (работа)'; $MESS['MAIN_REGISTER_WORK_PROFILE'] = 'Направления деятельности'; $MESS['MAIN_REGISTER_WORK_LOGO'] = 'Логотип компании'; $MESS['MAIN_REGISTER_WORK_NOTES'] = 'Дополнительные заметки (работа)'; $MESS['MAIN_REGISTER_FORM_SUBMIT'] = 'Зарегистрироваться'; $MESS['MAIN_REGISTER_CAPTCHA_TITLE'] = 'Защита от автоматической регистрации'; $MESS['MAIN_REGISTER_CAPTCHA_HELP'] = 'Введите символы с картинки'; $MESS['MAIN_REGISTER_REQUIRED'] = 'Эти поля обязательны для заполнения';
<?php /* * Файл local/templates/.default/components/bitrix/main.register/.default/lang/ru/component.php */ $MESS['REGISTER_WRONG_CAPTCHA'] = 'Неверно введено слово с картинки'; $MESS['REGISTER_FIELD_REQUIRED'] = 'Поле #FIELD_NAME# обязательно для заполнения'; $MESS['REGISTER_DEFAULT_TITLE'] = 'Регистрация нового пользователя'; $MESS['REGISTER_USER_WITH_EMAIL_EXIST'] = 'Пользователь с таким e-mail (#EMAIL#) уже существует'; $MESS['main_register_sess_expired'] = 'Ваша сессия истекла, повторите попытку регистрации'; $MESS['main_register_decode_err'] = 'Ошибка при дешифровании пароля (#ERRCODE#)';
/* * Файл local/templates/.default/components/bitrix/main.register/.default/style.css */ .bitrix-main-register { } .bitrix-main-register > p { margin: 1em 0; } .bitrix-main-register > p > a { text-decoration: underline; } .bitrix-main-register > form { overflow: hidden; } .bitrix-main-register > form > div { width: 50%; margin-bottom: 15px; float: left; box-sizing: border-box; } .bitrix-main-register > form > div.captcha { border: 1px solid #ccc; padding: 20px 15px 15px 15px; position: relative; margin-top: 15px; width: 49%; clear: both; } .bitrix-main-register > form > div.captcha > h3 { position: absolute; top: -10px; font-weight: normal; font-size: 16px; background: #eee; padding: 0 10px; color: #999; } .bitrix-main-register > form > div.captcha > span:first-of-type { margin-top: 10px; } .bitrix-main-register > form > div:nth-of-type(even) { padding-left: 1%; } .bitrix-main-register > form > div:nth-of-type(odd) { padding-right: 1%; } .bitrix-main-register > form > div > span { display: block; } .bitrix-main-register > form > div > span:first-child { margin-bottom: 5px; } .bitrix-main-register > form > div > span > input[type="text"], .bitrix-main-register > form > div > span > input[type="password"], .bitrix-main-register > form > div > span > select, .bitrix-main-register > form > div > span > textarea { width: 100%; padding: 5px; border:1px solid #ccc; } .bitrix-main-register > form > div.submit { float: none; padding-left: 0; } .bitrix-main-register > form > div.submit > input[type="submit"] { width: 30%; padding: 5px; background: #333; color: #fff; border: none; margin-top: 10px; } .bitrix-main-register i { font-style: normal; font-weight: bold; color: #f00; }

И вот что получилось в итоге:

Тут есть еще один важный момент. Что будет, если на эту страницу попадает авторизованный пользователь? Ему показывается малоинформативное сообщение, что он зарегистрирован и авторизован.

<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован */ ?> <p><?= GetMessage('MAIN_REGISTER_REG_AUTH'); /* Вы зарегистрированы и авторизованы */ ?></p> <?php return ?> <?php endif; ?>

Есть смысл перенаправить его на страницу личного кабинета или на страницу профиля:

<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован, ему здесь делать нечего */ ?> <?php LocalRedirect('/auth/profile.php'); ?> <?php endif; ?>

Пользовательские поля

Хотя Битрикс предлагает большой набор предопределенных полей, их все-таки может не хватить. Тогда остается только создавать свои поля. Это можно сделать в панели управления: «Настройки • Настройки продукта • Пользовательские поля»:

Я добавил поле «Мое поле», тип «Строка», в настройках компонента указал, что это поле надо показывать:

Теперь форма регистрации имеет вид:

Порядок полей

Для настройки порядка следования полей в форме, создадим файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php:

<?php /* * Файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); // меняем порядок следования полей $arResult['SHOW_FIELDS'] = array( 'NAME', 'LAST_NAME', 'LOGIN', 'EMAIL', 'PASSWORD', 'CONFIRM_PASSWORD', 'WORK_COMPANY', 'WORK_PHONE', 'PERSONAL_PHONE', ); ?>

В результате чего форма примет вид:

Авторизация по E-mail

Давайте уберем поле LOGIN, как отживший свое пережиток прошлого. Без этого поля регистрацию пользователь не пройдет, поэтому будем создавать LOGIN из EMAIL. Добавляем в init.php следующий код:

AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserUpdateHandler"); AddEventHandler("main", "OnBeforeUserUpdate", "OnBeforeUserUpdateHandler"); function OnBeforeUserUpdateHandler(&$arFields) { $arFields["LOGIN"] = $arFields["EMAIL"]; return $arFields; }

Чтобы форма регистрации не выдавала ошибок «Не заполнено обязательное поле логин», внесем изменение в шаблон компонента:

<?php if ($FIELD == 'LOGIN'): /* логин */ ?> <input type="text" name="REGISTER[<?= $FIELD; ?>]" value="<?= uniqid('user_'); ?>" /> <?php elseif ($FIELD == "PASSWORD"): /* пароль */ ?> <!-- код пропущен --> <?php elseif ($FIELD == "CONFIRM_PASSWORD"): /* подтверждение пароля */ ?> <!-- код пропущен --> <?php endif; ?>

Еще раз изменим порядок следования полей в форме и сделаем поле LOGIN первым, чтобы можно было его скрыть, обратившись с помощью :first-of-type:

<?php /* * Файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); // меняем порядок следования полей $arResult['SHOW_FIELDS'] = array( 'LOGIN', 'NAME', 'LAST_NAME', 'EMAIL', 'PERSONAL_PHONE', 'PASSWORD', 'CONFIRM_PASSWORD', 'WORK_COMPANY', 'WORK_PHONE', ); ?>

Теперь скроем поле LOGIN:

/* * Файл local/templates/.default/components/bitrix/main.register/.default/style.css */ .bitrix-main-register { } /* код пропущен */ .bitrix-main-register > form > div:first-of-type { display: none; } /* код пропущен */ .bitrix-main-register > form > div:nth-of-type(even) { padding-right: 1%; } .bitrix-main-register > form > div:nth-of-type(odd) { padding-left: 1%; } /* код пропущен */

Но есть еще одна проблема — у нас теперь две формы регистрации с разным составом полей:

  • первая формируется системным компонентом system.auth.registration и доступна по адресу /auth/?register=yes
  • вторая формируется компонентом bitrix:main.register и доступна по адресу /auth/register.php

Давайте это исправим. Удалим весь код из шаблона компонента system.auth.registration, и поместим в него вызов компонента bitrix:main.register из файла /auth/register.php:

<?php /* * Файл local/templates/.default/components/bitrix/system.auth.registration/.default/template.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $APPLICATION->IncludeComponent( "bitrix:main.register", ".default", array( "AUTH" => "N", "REQUIRED_FIELDS" => array( 0 => "EMAIL", 1 => "NAME", 2 => "LAST_NAME", 3 => "PERSONAL_PHONE", ), "SET_TITLE" => "Y", "SHOW_FIELDS" => array( 0 => "EMAIL", 1 => "NAME", 2 => "LAST_NAME", 3 => "PERSONAL_PHONE", 4 => "WORK_COMPANY", 5 => "WORK_PHONE", ), "SUCCESS_PAGE" => "/auth/", "USER_PROPERTY" => array( ), "USER_PROPERTY_NAME" => "", "USE_BACKURL" => "N", "COMPONENT_TEMPLATE" => ".default" ), false );

А файл /auth/register.php просто удалим. Можно еще удалить лишний код из шаблона компонента bitrix:main.register, который никогда не будет выполнен. Системный компонент system.auth.registration вызывается где-то глубоко в недрах Битрикс только в том случае, если пользователь не авторизован. И еще одна проверка в шаблоне «Пользователь авторизован?» просто не нужна.

<?php /* * Файл local/templates/.default/components/bitrix/main.register/.default/template.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?> <!-- следующие три строчки можно удалить --> <?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован, ему здесь делать нечего */ ?> <?php LocalRedirect('/auth/profile.php'); ?> <?php endif; ?>

Не забываем изменить другие системные компоненты:

<?php /* * Файл local/templates/.default/components/bitrix/system.auth.authorize/.default/lang/ru/template.php */ $MESS['SYS_AUTH_AUTHORIZE_TITLE'] = 'Авторизация'; // теперь e-mail используется как логин $MESS['SYS_AUTH_AUTHORIZE_LOGIN'] = 'E-mail'; $MESS['SYS_AUTH_AUTHORIZE_PASSWORD'] = 'Пароль'; $MESS['SYS_AUTH_AUTHORIZE_REMEMBER'] = 'Запомнить меня'; $MESS['SYS_AUTH_AUTHORIZE_CAPTCHA_TITLE'] = 'Защита от автоматической регистрации'; $MESS['SYS_AUTH_AUTHORIZE_CAPTCHA_TEXT'] = 'Введите символы с картинки'; $MESS['SYS_AUTH_AUTHORIZE_SUBMIT'] = 'Войти'; $MESS['SYS_AUTH_AUTHORIZE_REG_USER'] = 'Зарегистрироваться'; $MESS['SYS_AUTH_AUTHORIZE_FORGOT'] = 'Забыли пароль?';
<?php /* * Файл local/templates/.default/components/bitrix/system.auth.forgotpasswd/.default/lang/ru/template.php */ $MESS['SYS_AUTH_FORGOT_TITLE'] = 'Восстановление пароля'; // теперь восстановление пароля только по e-mail $MESS['SYS_AUTH_FORGOT_HELP'] = 'Введите Ваш E-mail: инструкция по смене пароля будет отправлена на этот почтовый адрес.'; $MESS['SYS_AUTH_FORGOT_LOGIN'] = 'Логин'; $MESS['SYS_AUTH_FORGOT_EMAIL'] = 'E-mail'; $MESS['SYS_AUTH_FORGOT_CAPTHA_TITLE'] = 'Защита от автоматической регистрации'; $MESS['SYS_AUTH_FORGOT_CAPTHA_TEXT'] = 'Введите символы с картинки'; $MESS['SYS_AUTH_FORGOT_SUBMIT'] = 'Отправить'; $MESS['SYS_AUTH_FORGOT_AUTH'] = 'Авторизация';
<?php /* * Файл local/templates/.default/components/bitrix/system.auth.forgotpasswd/.default/template.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?> <!-- логин больше не нужен, удаляем или комментируем код ниже --> <!-- <div> <span> <?= GetMessage('SYS_AUTH_FORGOT_LOGIN'); /* логин пользователя */ ?> </span> <span> <input type="text" name="USER_LOGIN" maxlength="50" value="<?= $arResult["LAST_LOGIN"]; ?>" /> </span> </div> -->
<?php /* * Файл local/templates/.default/components/bitrix/system.auth.changepasswd/.default/lang/ru/template.php */ $MESS['SYS_AUTH_CHANGE_TITLE'] = 'Смена пароля'; // теперь e-mail используется как логин $MESS['SYS_AUTH_CHANGE_LOGIN'] = 'E-mail'; $MESS['SYS_AUTH_CHANGE_CHECK'] = 'Контрольная строка'; $MESS['SYS_AUTH_CHANGE_PASSWORD'] = 'Новый пароль'; $MESS['SYS_AUTH_CHANGE_CONFIRM'] = 'Подтверждение пароля'; $MESS['SYS_AUTH_CHANGE_CAPTCHA_TITLE'] = 'Защита от автоматической регистрации'; $MESS['SYS_AUTH_CHANGE_CAPTCHA_TEXT'] = 'Введите символы с картинки'; $MESS['SYS_AUTH_CHANGE_SUBMIT'] = 'Изменить пароль'; $MESS['SYS_AUTH_CHANGE_AUTH'] = 'Авторизация'; $MESS['SYS_AUTH_CHANGE_REQUIRED'] = 'Эти поля обязательны для заполнения';

Есть еще один момент, о котором есть смысл упомянуть. Если при изменении пароля не заполнить поле «E-mail», появляется сообщение об ошибке «Логин должен быть не менее 3 символов». Где это изменить, я не нашел, видимо где-то в недрах ядра Битрикс. Поэтому небольшой хак:

<?php /* * Файл local/templates/.default/components/bitrix/system.auth.changepasswd/.default/template.php */ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?> <div class="system-auth-changepasswd"> <h2><?= GetMessage('SYS_AUTH_CHANGE_TITLE'); /* заголовок формы */ ?></h2> <?php // небольшй хак, который убирает сообщение о длине логина if (isset($arParams['AUTH_RESULT']['TYPE']) && $arParams['AUTH_RESULT']['TYPE'] == 'ERROR' && false !== iconv_strpos($arParams['AUTH_RESULT']['MESSAGE'], 'Логин должен быть')) { $arParams['~AUTH_RESULT']['MESSAGE'] = 'Недопустимое значение поля «E-mail»'; } ?> <p><?php ShowMessage($arParams["~AUTH_RESULT"]); /* сообщение о результате смены пароля */ ?></p>

Поиск:
CMS • Web-разработка • Авторизация • Битрикс • Компонент • Регистрация • Форма • Шаблон компонента

партнер компании 1с-битрикс

сайт фрилансера Сергея Эстрина

Закрыть

Универсальная галерея - модуль для битрикс

 

При создании быстрого заказа (заказ в 1клик) неавторизованным пользователем первый раз для конкретного емейла — все проходит успешно.
При попытке последующих заказов, если указать тот же емейл — выдает ошибку «Ошибка регистрации нового пользователя: Пользователь с таким e-mail (**@***.ru) уже существует.»
Т.е. как я понимаю — он в первый раз создает пользователя в базе, а при следующем заказе пытается его безуспешно авторизовать, т.к. пароль не передается.

PS Сайт на Битронике

 

Андрей, да, он создает пользователя, без него он жить не может, к сожалению) В настройках главного модуля есть галочка «Проверять E-mail на уникальность при регистрации».

 

Может быть тогда высылать сразу на емейл при первом же заказе сгенерированный пароль для доступа к сайту? Глядишь в следующий раз зайдет уже авторизованным

 

Сергей Эстрин

Администратор

Сообщений: 512
Регистрация: 18.02.2010

#4

28.03.2015 02:08:39

Цитата
Андрей пишет:
Может быть тогда высылать сразу на емейл при первом же заказе сгенерированный пароль для доступа к сайту? Глядишь в следующий раз зайдет уже авторизованным

Конкретно пароль стандартными средствами не отправить, т.к. он хранится в зашифрованном виде в битриксе, но можно с помощью стандартных средств отправлять сообщение со ссылкой на страницу смены пароля, т.е. с помощью стандартных шаблонов сообщений.

Цитировать   Имя

 

Гость

Гость

#5

10.03.2016 16:33:13

Цитата
Андрей написал:
Может быть тогда высылать сразу на емейл при первом же заказе сгенерированный пароль для доступа к сайту? Глядишь в следующий раз зайдет уже авторизованным

Не вариант, так как все решают поведенческие факторы и мы многое теряем. Думаю, при таком вариант авторизованным никто не зайдет, скорее развернется и уйдет.

Цитировать   Имя

В шаблоне компонента bitrix:sale.order.ajax при оформлении заказа от лица не зарегистрированного пользователя вылазит сообщение: «Не указан Email для регистрации пользователя» и поля e-mail нет, совсем нет — то есть записать почту некуда.

Как то нажатием галочек это можно исправить?


  • Вопрос задан

    более года назад

  • 363 просмотра

Вам нужно добавить обязательное свойство заказа Email (магазин -> настройки магазина -> свойства заказа) и поставьте галочку у опции «Использовать как E-Mail». Это нужно даже если вы указали что можно оформлять заказ без регистрации, так как создается каждый раз служебный пользователь для привязки заказа.

Так же в настройках главного модуля, на вкладке авторизации должно быть отключено подтверждение регистрации по email

Пригласить эксперта


  • Показать ещё
    Загружается…

22 июн. 2023, в 13:47

2000 руб./за проект

22 июн. 2023, в 13:40

2500 руб./за проект

22 июн. 2023, в 13:18

30000 руб./за проект

Минуточку внимания

  • Битрикс ошибка открытия файла импорта битрикс
  • Битрикс ошибка обновления err доступ запрещен
  • Битрикс ошибка неподходящая версия модуля crm
  • Битрикс ошибка есть ошибки при отправке системных почтовых сообщений число неотправленных сообщений
  • Битрикс ошибка входа при сохраненной авторизации