При создании заказа покупатель заполняет поле "ФИО". Необходимо скопировать эти данные в профиль пользователя (не путать с профилем покупателя) разбив на отдельные поля.
Работать это будет при условии что у пользователя данные поля еще не заполнены. Соответственно поля будут заполняться как у старых покупателей, которые еще не вбили эти данные, так и у новых- оформляющих заказ в первый раз.
Для оформляющих заказ в первый раз наиболее актуально, если используете фоновую регистрацию пользователя при оформлении заказа. Так как, такие пользователи в принципе не заполняют свой профиль и кроме e-mail и телефона у них поля с именем пустые.
Получение данных о заказе и пользователе по API
Для реализации открываем файл confirm.php который находится в шаблоне оформления заказа (sale.order.ajax). Этот файл отвечает за последний шаг заказа, когда и заказ и пользователь уже созданы.
Здесь есть массив $arResult["ORDER"] в котором имеются ID пользователя в ключе $arResult['ORDER']['USER_ID'] и ID заказа в ключе $arResult["ORDER"]['ID']
Сначала получим информацию о пользователе методом CUser::GetByID и создадим условие, проверяющее не пустое ли у пользователя поле с именем (мне достаточно только этого, но можете проверить все три поля).
$user = CUser::GetByID($arResult['ORDER']['USER_ID']);
$arUser = $user->Fetch();
if (empty($arUser['NAME'])) {
// тут будет срабатывать наш скрипт, если поле ИМЯ пустое
}
Теперь получаем информацию о свойствах заказа, нам нужно только поле с ФИО, которое пользователь заполняет одной строкой, при оформлении
Для этого пользуемся из API D7 \Bitrix\Sale\Order::load и $order->getPropertyCollection();
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
'select' => ['VALUE'], // Только значение
'filter' => [
'=ORDER_ID' => $arResult["ORDER"]['ID'], // ID этого заказа
'=CODE' => 'FIO' // Код свойства с ФИО
]
]);
while ($item = $dbRes->fetch()) {
$arUserOrderFio = explode(' ', $item['VALUE']); // Массив с ФИО
}
Теперь, у нас в массиве $arUserOrderFio ключи с фамилией именем и отчеством указанные пользователем. Массив создан с помощью explode с пробелом, в качестве разделителя, между значениями.
Обновление полей пользователя
Осталось, с помощью метода CUser::Update заполнить поля пользователя значениями ключей массива.
$user = CUser::GetByID($arResult['ORDER']['USER_ID']);
$arUser = $user->Fetch();
// Если имя пустое
if (empty($arUser['NAME'])) {
// Данные о заказе с получением ФИО
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
'select' => ['VALUE'], // Только значение
'filter' => [
'=ORDER_ID' => $arResult["ORDER"]['ID'], // ID этого заказа
'=CODE' => 'FIO' // Код свойства с ФИО
]
]);
while ($item = $dbRes->fetch()) {
$arUserOrderFio = explode(' ', $item['VALUE']); // Массив с ФИО
}
// Обновление полей пользователя
user = new CUser;
$fields = array(
"LAST_NAME" => $arUserOrderFio['0'],
"NAME" => $arUserOrderFio['1'],
"SECOND_NAME" => $arUserOrderFio['2'],
);
$user->Update($arResult['ORDER']['USER_ID'], $fields);
}
На этом все. Да, по массиву $arUserOrderFio можно было пробежаться foreach-ом но это излишне.
Само собой, пользователь может не правильно вбить свое ФИО- не в том порядке который нам нужен (например ИФО), но тут остается только поделить ФИО на три отдельных поля в самом заказе и получать ровно таким же способом, но без создания массива.