Михаил Базаров Разработка на 1С-Битрикс Михаил Базаров

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

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

Замена 8 на +7 в номере телефона

Если пользователи указывали свои телефоны с 8-ки, такие номера не скопируются. По этому, в обходе пользователей нужно заменить 8 на +7.

Для замены номера телефона, начинающегося с "8" на номер, начинающийся с "+7", нужно добавить проверку в коде. Используем функцию substr, чтобы проверить первый символ номера телефона и заменить его, если он начинается с "8". Вот пример, как это можно сделать:

$user = new CUser;
$data = CUser::GetList(
    ($by="ID"),
    ($order="ASC"),
    array(
        'ACTIVE' => 'Y',
    )
);
while($arUser = $data->Fetch()) {
   echo '<pre>';
   print_r($arUser['PERSONAL_PHONE']);
   echo '</pre>';
    $phoneNumber = $arUser['PERSONAL_PHONE'];
    // Проверяем, начинается ли номер на "8"
    if(substr($phoneNumber, 0, 1) === '8') {
        // Заменяем "8" на "+7"
        $phoneNumber = '+7' . substr($phoneNumber, 1);
    }
    $fields = Array(
        "PHONE_NUMBER" => $phoneNumber,
    );
    $user->Update($arUser['ID'], $fields);
}

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

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

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

require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Loader;
use Bitrix\Main\Application;
Loader::includeModule("sale");
$connection = Application::getConnection();
// ---------------------------------------------------------------------------
// Шаг 1. Одним JOIN-запросом получаем телефон из последнего заказа для каждого
//         активного пользователя (устранение N+1 проблемы)
// ---------------------------------------------------------------------------
$sql = "
    SELECT
        u.ID AS USER_ID,
        op.VALUE AS PHONE
    FROM b_user u
    INNER JOIN (
        SELECT o.USER_ID, MAX(o.ID) AS MAX_ORDER_ID
        FROM b_sale_order o
        GROUP BY o.USER_ID
    ) latest ON u.ID = latest.USER_ID
    INNER JOIN b_sale_order_props_value op
        ON op.ORDER_ID = latest.MAX_ORDER_ID
        AND op.CODE = 'PHONE'
    WHERE u.ACTIVE = 'Y'
";
$phoneMap = [];
$result = $connection->query($sql);
while ($row = $result->fetch()) {
    $phoneMap[(int)$row['USER_ID']] = trim($row['PHONE']);
}
// ---------------------------------------------------------------------------
// Шаг 2. Итерируем пользователей с пагинацией и обновляем
// ---------------------------------------------------------------------------
$user = new CUser;
$pageSize = 500;
$page = 1;
$updatedCount = 0;
$errorCount = 0;
$skippedCount = 0;
do {
    $navParams = [
        'nPageSize' => $pageSize,
        'iNumPage'  => $page,
    ];
    $data = CUser::GetList(
        'ID',
        'ASC',
        ['ACTIVE' => 'Y'],
        ['FIELDS' => ['ID']],
        $navParams
    );
    $fetchedInPage = 0;
    while ($arUser = $data->Fetch()) {
        $userId = (int)$arUser['ID'];
        $fetchedInPage++;
        if (!isset($phoneMap[$userId])) {
            $skippedCount++;
            continue;
        }
        $fields = [
            'PHONE_NUMBER' => $phoneMap[$userId],
        ];
        if ($user->Update($userId, $fields)) {
            $updatedCount++;
        } else {
            $errorCount++;
        }
    }
    $page++;
} while ($fetchedInPage === $pageSize);
// ---------------------------------------------------------------------------
// Итог
// ---------------------------------------------------------------------------
echo sprintf(
    "Готово. Обновлено: %d, ошибок: %d, пропущено (без телефона в заказе): %d\n",
    $updatedCount,
    $errorCount,
    $skippedCount
);

Услуги Стоимость разработки на 1С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.
Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.
Поддержка и доработки проектов
от 3 000 руб. от 1 часа

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

Подробнее
Сайт на готовом решении 1С-Битрикс
от 70 000 руб. от 5-ти дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Подробнее
Индивидуальная разработка магазина
от 400 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Подробнее
Мобильное приложение
от 300 000 руб. от 4-х недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Подробнее
Инфоресурс
от 170 000 руб. от 3-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Подробнее
Сайт компании
от 150 000 руб. от 2-х недель

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

Подробнее

Включено в стоимость разработки:

  • Лицензия на 1С-Битрикс необходимой редакции, дополнительные модули, для реализации функционала и видео-инструкции по работе с готовым проектом
  • Оптимизация программной части проекта и конфигурации сервера под максимальную скорость работы. Базовая СЕО оптимизация и добавление сайта в поисковые системы.

Блог-note Заметки по 1С-Битрикс