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

Код, собственно в заметке - там и нечего добавить.

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