Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

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

Просмотров: 2838

Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режиму, через логин(e-mail) и пароль. При этом, у всех пользователей запрашивался и номер телефона, который записывался в стандартное поле "Номер телефона", он же PERSONAL_MOBILE.

Необходимо перевести всех пользователей на вход по номеру телефона, с отправкой смс с паролем.

Что бы не напрягать существующих пользователей просто скопируем номера телефонов из PERSONAL_MOBILE в новое поле (которое доступно в свежих редакциях Битрикс, создавать его не надо) Номер телефона для регистрации он же PHONE_NUMBER

Получаем информацию о пользователях через API

Для начала, нам нужно получить информацию о пользователях, с помощью CUser::GetList - Возвращает список пользователей в виде объекта класса CDBResult. Статический метод.

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

$data = CUser::GetList(($by="ID"), ($order="ASC"),
    array(
     'ACTIVE' => 'Y', // Выбрали всех активных
    )
);
while($arUser = $data->Fetch()) {
   echo '<pre>';
   	print_r($arUser);
   echo '</pre>';
}

В распечатке $arUser увидем вообще всю информацию о каждом пользователе (ФИО, дату регистрации, все персональные данные итд).

Нам достаточно, с помощью метода CUser::Update обновить поле PHONE_NUMBER из поля PERSONAL_MOBILE

$user = new CUser;
$data = CUser::GetList(($by="ID"), ($order="ASC"),
    array(
     'ACTIVE' => 'Y',
    )
);
while($arUser = $data->Fetch()) {
    $fields = Array(
        "PHONE_NUMBER"  => $arUser['PERSONAL_MOBILE'],
    );
    $user->Update($arUser['ID'], $fields);
}

Здесь мы вписали номер телефона "PHONE_NUMBER" => $arUser['PERSONAL_MOBILE'], и измениили параметры пользователя.

Получить номер телефона из последнего заказа пользователя

Если, вы ни когда не справшивали номер телефона пользователя, можно попоробовать скопировать его из заказа, если пользователь хотя бы раз делал заказ в интернет магазине.

Для начала, получим самый свежий заказ каждого пользователя, скорее всего в нем актуальный номер телефона в свойстве "Номер телефона". Делать будем старым методом, так как на D7 все работает гораздо медленеее.

$user = new CUser;
CModule::IncludeModule("sale");
$data = CUser::GetList(($by="ID"), ($order="ASC"),
    array(
        'ACTIVE' => 'Y', // Выбрали всех активных
    )
);
while($arUser = $data->Fetch()) {
    $db_sales = CSaleOrder::GetList(
        array('DATE_INSERT' => 'DESC'),
        array("USER_ID" => $arUser['ID']),
        array('ID')
    );
    while ($ar_sales = $db_sales->Fetch())
    {
        $dbOrderProps = CSaleOrderPropsValue::GetList(
            array("SORT" => "ASC"),
            array("ORDER_ID" => $ar_sales['ID'], "CODE"=>array("PHONE"))
        );
        while ($arOrderProps = $dbOrderProps->GetNext()) {
            $userOrderPhone = $arOrderProps['VALUE'];
        }
        break;
    }
    $fields = Array(
        "PHONE_NUMBER"  => $userOrderPhone,
    );
    $user->Update($arUser['ID'], $fields);
}

Пояснения:

  • Все также с CUser::GetList прошлись по пользователям. Теперь нам нужны только их ID.
  • Внутри цикла пользователя воспользовались CSaleOrder::GetList получили заказы пользователя, при этом отфильтровали по дате создания (от новых к старым) 'DATE_INSERT' => 'DESC'. В отборе использовали только ID заказа array('ID') - другие данные нам не нужны и весь скрипт отработает быстрее.
  • В конце цикла, перебора заказов пользователя, оборвали его с помощью break, что бы получить только один заказ, а не все заказы пользователя. )
  • Внутри заказа, зная его ID "ORDER_ID" => $ar_sales['ID'] получили (методом CSaleOrderPropsValue::GetList) значение свойства с телефоном, в моем случае это поле с кодом "CODE"=>array("PHONE")
  • Передали VALUE с номером телефона в переменную $userOrderPhone
  • Дальше, все также, как и в статье выше, обновили номер для регистрации методом CUser::Update
На этом все, вопросы прошу задавать в комментариях. Для работы с заказом специально не использовал D7 - так как возможностей там больше, по работе с заказами- но они работают медленнее, для конкретно этой, описанной в статье ситуации (нужно получать коллекции свойств и грузить классы заказа \Bitrix\Sale\Order)

Но, можете попробовать перевести все это на D7 и написать в комментарии и не плохая практика и возможно, кому-то будет полезно.

Александр 07.09.2022
Мы эту процедуру запускаем разово перед переходом на авторизацию по номеру телефона?
Есть пример готового полного файла скрипта?
Михаил Базаров 07.09.2022
Да, один раз. Подразумевается, что новые пользователи уже заведомом регистрируются по телефону.
Код, собственно в заметке - там и нечего добавить. :)
Павел 26.09.2022
Поле PHONE_NUMBER хоть и есть и можно в него записать, но как поучить из этого поля данные простым удобным способом не понятно...

\CUser::GetList не возвращает это поле.

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Вывести множественное свойство типа файл с названием и весом файла в ... Просмотров: 21934 В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 63231 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Получение местоположений через API Битрикс c поиском по select. Просмотров: 23250 Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Би... Пункты меню из разделов инфоблока Битрикс Просмотров: 93319 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Пошагово получить информацию о заказах и сохранить как Excel (xls) Просмотров: 1702 Задача: Нужно получить информацию о заказах с возможностью указания даты создания "от"" и ... Как подобрать редакцию Битрикс под задачи Просмотров: 7029 Последнее время, все чаще, при общении с заказчиками, сталкиваюсь с вопросом "— К... Fancybox в стандартном шаблоне детальной карточки товара, вместо вспл... Просмотров: 127 Задача: заменить работу с изображениями в стандартном или кастомном шаблоне детальной карт... Сортировка элементов по индексу сортировки значений типа список Просмотров: 11628 Внутри любого компонента есть заранее заложенные поля для сортировки элементов. МОжно сорт... Вывести товары из того же раздела в карточке товара Просмотров: 18895 Немножко топорный, но все же вполне действенный способ по выводу внутри подробной карточки... Создание раздела инфоблока при регистрации пользователя в Битрикс Просмотров: 8665 Например вам нужно выводить информацию исключительно для определенного пользователя. Само ... Дать пользователю возможность быстро отредактировать материал Просмотров: 4969 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10375 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... Менять большую картинку, при клике на маленькую, в детальной карточке Просмотров: 2148 Мини скриптик, может кому пригодится для каталога товаров или новостей при использовании д... Ускорение работы сайта на 1С-Битрикс Просмотров: 17806 Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный... Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7694 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Установить остатки товара на складе из доступных остатков. Просмотров: 6262 Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество". Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 26844 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Удалить товары из корзины, если есть определенные товары. Просмотров: 1931 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Рассылка новинок каталога в автоматическом режиме Просмотров: 1889 Что бы реализовать рассылку новинок каталога на email-ы пользователей, можно воспользовать... Запретить указание количества товаров, добавляемого в корзину, в опре... Просмотров: 92 Задача состоит в том, чтобы запретить указание количества товара, добавляемого в корзину, ...