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

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

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

Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режиму, через логин(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

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

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

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

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

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

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;
    }
    $user = new CUser;
    $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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Получение доступа к железу устройства из Битрикс мобильное приложение Просмотров: 5573 Документация к мобильному приложению 1С-Битрикс очень куцая. В основном описывает функцион... Заполнить коэффициент единицы измерения (MEASURE_RATIO) из свойства э... Просмотров: 5694 Задачка: Каталог наполняется из 1С, но 1С не передает коэффициент единицы измерения (особе... Дополнительные картинки в новостях Битрикс, почти фотогалерея. Просмотров: 48000 Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Деталь... Изменить размер картинок на лету в битрикс Просмотров: 46732 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Ссылки для добавления и удаления товара из сравнения в Битрикс Просмотров: 8206 Просто оставляю это здесь, вставка ссылок на добавление и удаление товара из сравнения, ес... Очистка корзины в 1С-Битрикс одним нажатием Просмотров: 27711 В стандартной корзине Битрикс не хватает кнопки для полной очистки корзины одним нажатием... Вывести свойство отдельно ото всех или исключить из всех Просмотров: 6986 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Умный фильтр во всплывающей панели на мобильных. Просмотров: 1412 Шаблон умного фильтра в Битриксе достаточно сложный, с точки зрения верстки и не очень кра... Вывести производителей на сайте с отбором его товаров из каталога Просмотров: 18190 Достаточно частая задачка для каталога или интернет-магазина: вывести список производителе... Время на БД и веб сервере отличается на 3600 секунд, тест Битрикс Просмотров: 15279 Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок... Добавление и удаление из сравнения на AJAX: Битрикс Просмотров: 17646 Рецепт лежал у меня в закромах, почти о нем и забыл, но тут подвернулся под руку- решил оп... Сниппеты типографики bootstrap, для Битрикс Просмотров: 7575 Если вы подключили bootstrap к своему сайту, или сверстали весь шаблон, подключив bootstra... Дополнительные опции/услуги, добавляемые в корзину, в карточке товаро... Просмотров: 278 Задача: в детальной карточке товара сделать возможность добавления услуги или опции, при д... Заполнить картинки разделов каталога из картинок товаров Просмотров: 324 Задача: в каталоге, разделы и подразделы выводятся в виде плитки над товарами, с картинкам... Снять ограничение на количество символов в комментарии к заказу магаз... Просмотров: 11506 Как многим известно, в интернет-магазине на Битрикс имеется ограничение на количество симв... Пункты меню из разделов инфоблока Битрикс Просмотров: 90591 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Показать пользователю накопительную скидку за все сделанные заказы, и... Просмотров: 1736 Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и ... Определить местоположение пользователя и показать на карте Просмотров: 3253 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 36654 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Создание скидки на общую сумму покупки в Битрикс корзине Просмотров: 26907 Функционал интернет-магазина, работающего под управлением 1С Битрикс, позволяет задавать м...