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

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

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

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

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

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

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

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