Объединить отдельные поля ФИО в одно свойство при оформлении заказа.

Просмотров: 2814

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

Создаем новое свойство заказа, которое называем "ФИО целиком" с кодом FULL_NAME. Делаем его обязательным и служебным, что бы не показывалось при оформлении заказа. Обязательно задаем значение по умолчанию, что бы свойство в любом случае создавалось, при оформлении заказа.

Объединить отдельные поля ФИО в одно свойство при оформлении заказа.

Дополнительно ставим галку на против "Значение свойства будет использовано как название профиля пользователя". И делаем свойству максимальную сортировку, что бы оно оказалось в самом низу списка.

Получаем свойства заказа и заполняем свойство

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

В файле confirm.php (этот файл отвечает за последний шаг заказа, шаблона sale.order.ajax, когда заказ уже сформирован) добавляем такой код:

if (!empty($arResult["ORDER"])):

    $order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
    $collection = $order->getPropertyCollection();
    $dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
        'select' => ['ID', 'NAME', 'CODE', 'VALUE'],
        // Можно добавить order что бы явно отсортировать свойства 
        // и FULL_NAME оказалось самым последним
        '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();

... тут остальной код этого файла ...
  • $order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']); загрузили данные о свежесозданом заказе.
  • $dbRes = \Bitrix\Sale\PropertyValueCollection::getList получили все свойства этого заказа.
  • $fullname наполнили переменную с отдельными данными и имени, отчестве, фамилии.
  • $propertyValue->setField('VALUE', $fullname); свойство с кодом FULL_NAME заполниили переменной $fullname
  • $order->save(); сохранили заказ

В общем-то и все. Это свойство обновится на последнем шаге оформления заказа и в дальнейшем используется как название профиля.

Да, можно было не создавать и перезаписывать свойство а добавлять его методом $propertyValue = $collection->createItem. Но этот способ более ресурсоемкий и вызывает небольшой лаг на последнем шаге оформления заказа.

Михаил Базаров 12.06.2022
Можно не перебирать весь массив свойств, а получить только ФИО (отдельные)
Если каждое из них хранится как "Использовать как имя плательщтка"
Можно получить геттером
Код
$propertyValue = $collection->getPayerName();

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

Смена вида карточек товаров в catalog.section с иммитацией AJAX

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

Фотогалерея на шаблоне новостей в 1С-Битрикс

Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Детальная картинка", добавить в...

Получить цены товаров с помощью D7-ORM в 1С-Битрикс

Веб-разработка часто требует работы с базой данных для получения и обработки информации о товарах, в том числе и их цен...

Информация о заказах и содержимое корзины текущего пользователя.

В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можно как угодно и где угодно, я л...

Следующая/предыдущая новость/статья при просмотре подробной в Битрикс

Странное дело, в Битрикс по умолчанию, отсутсвует функционал для навигации внутри новостей или статей типа: "Следующая/...

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Обновление цен и остатков из текстового файла, в каталоге 1C-Битрикс.

Задача: прочитать txt-файл с ценами и остатками, который выгружает программа учета по FTP, и обновить эти данные в катал...

Малая корзина Битрикс, упрощенный шаблон

Шаблон малой корзины битрикс, который можно вывести в боковом разделе шаблона или в шапке интернет-магазина. Код окульту...

Cordova, ввод в input под диктовку. Голосовой поиск в мобильном приложении.

Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам нужно захватить речь с микроф...