Пользователь, при оформлении заказа, заполняет три отдельных поля с фамилией, именем и отчеством. Нам нужно сохранить это все одной строкой в отдельное, скрытое свойство заказа и использовать как название профиля покупателя.
Создаем новое свойство заказа, которое называем "ФИО целиком" с кодом 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. Но этот способ более ресурсоемкий и вызывает небольшой лаг на последнем шаге оформления заказа.