Заполнить поля пользователя из свойства заказа, на примере ФИО

RSS
Заполнить поля пользователя из свойства заказа, на примере ФИО
 
Заполнить поля пользователя из свойства заказа, на примере ФИО

При создании заказа покупатель заполняет поле "ФИО". Необходимо скопировать эти данные в профиль пользователя (не путать с профилем покупателя) разбив на отдельные поля.
 
Подскажите, пожалуйста, как адаптировать код, если ФИО хранится раздельно?

Также интересует момент объединения кода с этой заметкой - https://bazarow.ru/blog-note/12877/, чтобы для новых клиентов ФИО заполнялись из полей заказа.
 
Опишите задачу более подробно, можно прям по простому: Я хочу чтобы (подставить нужное).
Не надо сложными словами описывать, максимально топорно - по человечески.

Я, пока, не понимаю для чего вам это.
 
Тест сообщения форума  
 
По этой заметке. В Вашем примере ФИО в заказе хранится в одном поле. В моём случае в заказе используются 3 раздельных поля - Фамилия, Имя и Отчество (так удобнее передавать данные в транспортные компании, особенно в Почту России).

Необходимо Фамилию, Имя и Отчество из заказа передавать в соответствующие поля пользователя.


По заметке https://bazarow.ru/blog-note/12877/. С ней всё хорошо, код работает, в поле ФИО (единое) в заказе записываются данные из полей Фамилия, Имя и Отчество.
Но так как мы и в той и этой заметке редактируем файл confirm.php, хочется объединить эти две заметки в одну, то есть:
- в заказе есть три поля - Фамилия, Имя и Отчество
- в единое поле ФИО заказа записываем их вместе, делаем названием профиля
- данные из полей Фамилия, Имя и Отчество копируем в соответствующие поля пользователя (если не заполнены)
 
Как-то так. Проверить негде делал не глядя) но вроде бы ошибки быть не должно.
Код
// Заполняем единное поле ФИО в заказе
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
    'select' => ['ID', 'NAME', 'CODE', 'VALUE'],
    'filter' => [
        '=ORDER_ID' => $arResult["ORDER"]['ID']
    ]
]);
while ($item = $dbRes->fetch())
{
    if ($item['CODE'] == 'FAMILIA') {
        $fullname .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'NAME') {
        $fullname .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'OTCHESTVO') {
        $fullname .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'FULL_NAME') {
        $propertyValue = $collection->getItemById($item['ID']);
        $r = $propertyValue->setField('VALUE', $fullname);
    }
}
$order->save();

// А пользователю заполняем по отдельности
// Бъем строку на массив по пробелу
$arFullname = explode(' ', $fullname);
$user = new CUser;
$fields = array(
    "LAST_NAME" =>$arFullname['0'],
    "NAME" => $arFullname['1'],
    "SECOND_NAME" => $arFullname['2'],
);
$user->Update($arResult['ORDER']['USER_ID'], $fields);

Или можно не использовать explode, просто выше (в while ($item = $dbRes->fetch())) заполнить переменные для заполнения пользователя
Изменено: Михаил Базаров - 26.06.2024 13:05:51
 
Варик без explode
Код
// Заполняем единное поле ФИО в заказе
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
    'select' => ['ID', 'NAME', 'CODE', 'VALUE'],
    'filter' => [
        '=ORDER_ID' => $arResult["ORDER"]['ID']
    ]
]);
while ($item = $dbRes->fetch())
{
    if ($item['CODE'] == 'FAMILIA') {
        $familia = $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'NAME') {
        $name = $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'OTCHESTVO') {
        $otchestvo = $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'FULL_NAME') {
        $fullname = $familia  . ' ' .  $name  . ' ' .  $otchestvo;
        $propertyValue = $collection->getItemById($item['ID']);
        $r = $propertyValue->setField('VALUE', $fullname);
    }
}
$order->save();

// А пользователю заполняем по отдельности
$user = new CUser;
$fields = array(
    "LAST_NAME" =>$familia,
    "NAME" => $name,
    "SECOND_NAME" => $otchestvo,
);
$user->Update($arResult['ORDER']['USER_ID'], $fields);
Изменено: Михаил Базаров - 26.06.2024 13:09:43
 
В моём варианте код стал таким:

Код
// Заполняем единое поле ФИО в заказе
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
   'select' => ['ID', 'NAME', 'CODE', 'VALUE'],
   'order' => array('ID'),
   'filter' => [
     '=ORDER_ID' => $arResult["ORDER"]['ID']
   ]
]);
while ($item = $dbRes->fetch())
{
    if ($item['CODE'] == 'SECONDNAME') {
        $secondname .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'FIRSTNAME') {
        $firstname .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'MIDDLENAME') {
        $middlename .= $item['VALUE'] . ' ';
    }

    if ($item['CODE'] == 'FIO') {
$fullname = $secondname  . ' ' .  $firstname  . ' ' .  $middlename;
        $propertyValue = $collection->getItemById($item['ID']);
        $r = $propertyValue->setField('VALUE', $fullname);
    }
}
$order->save();

// А пользователю заполняем по отдельности

$user = CUser::GetByID($arResult['ORDER']['USER_ID']);
$arUser = $user->Fetch();
if (empty($arUser['NAME'])) {
    $arFullname = explode(' ', $fullname);
    $user = new CUser;
    $fields = array(
    "LAST_NAME" =>$secondname,
    "NAME" => $firstname,
    "SECOND_NAME" => $middlename,
    );
    $user->Update($arResult['ORDER']['USER_ID'], $fields);
}



Используемые значения:
SECONDNAME - Фамилия
FIRSTNAME- Имя
MIDDLENAME - Отчество
FIO - ФИО в одно поле

Также оставлена проверка на заполнение полей у пользователя
Код
if (empty($arUser['NAME'])) { }


Работает как для авторизованных, так и не авторизованных пользователей.
Изменено: Михаил Базаров - 26.06.2024 14:27:08
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

Блог-note: заметки разработчика

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Валидация пароля и подтверждения при регистрации в битрикс

Встала задачка сделать валидацию пароля и его подтверждения в стандартной форме регистрации сайта под управлением Битрик...

Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов на одну карту

Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоблоке некоторое количество элем...

Изменить размер картинок на лету в битрикс

Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздела дизайн. Само собой, перезали...

Вывести товары в каталоге перебрав их по свойству и разделив на секции.

Задача: В каталоге, у товаров, есть свойство типа список с названием "Тип изделия" и кодом "TIP_IZDELIYA&...

Правильное подключение стилей и скриптов в Битрикс

Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в системе управления 1С-Битрикс. Если...

Добавление не существующего товара в корзину и заказ, 1С-Битрикс

Задача: нужно добавить в корзину товар, которого не существует в каталоге, с возможностью задать ему произвольные назван...

Вывести новости из конкретного раздела инфоблока Битрикс

Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Битрикс, для этого потребуется ...

Как работает система сертификации партнеров 1С-Битрикс, уровни партнеров и специалистов

Сертификация от «1С-Битрикс» – это объективная оценка знаний и практических навыков разработки проектов на платформе от ...