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

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

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

Создаем новое свойство заказа, которое называем "ФИО целиком" с кодом 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();