Необходимо перевести всех пользователей на вход по номеру телефона, с отправкой смс с паролем.
Что бы не напрягать существующих пользователей просто скопируем номера телефонов из 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
);