Заметка готова, рекомендую воспользоваться кодом из нее, он более лаконичный и правильный
https://camouf.ru/blog-note/12877/
Задача:
Пользователь, при оформлении заказа, заполняет три отдельных поля с фамилией, именем и отчеством.
Нам нужно сохранить эти три поля в одно "ФИО целиком" не показывая его пользователю.
1) Создаем служебное (не видимое пользователю) свойство заказа, называем как нам нужно. Пусть будет "ФИО целиком".
Обязательное и обязательно со значением по умолчанию.
2) Значение по умолчанию, вообще любое. Главное, что бы свойсво создалось во время оформления заказа- так сэкономим на будущих итерациях.
3) В шаблоне оформления заказа, в файл confirm.php добавляем:
| Код |
|---|
$db_props = CSaleOrderPropsValue::GetOrderProps($arResult["ORDER"]['ID']);
while ($arProps = $db_props->Fetch()) {
if ($arProps['CODE'] == 'NAME') {
$name = $arProps['VALUE'];
}
if ($arProps['CODE'] == 'S_NAME') {
$s_name = $arProps['VALUE'];
}
if ($arProps['CODE'] == 'L_NAME') {
$l_name = $arProps['VALUE'];
}
}
$fullname = $s_name . ' ' . $name . ' ' . $l_name;
$order = \Bitrix\Sale\Order::load($arResult["ORDER"]['ID']);
$collection = $order->getPropertyCollection();
$dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
'select' => ['ID'],
'filter' => [
'=ORDER_ID' => $arResult["ORDER"]['ID'],
'ORDER_PROPS_ID' => 12
]
]);
while ($item = $dbRes->fetch())
{
$propertyValue = $collection->getItemById($item['ID']);
$r = $propertyValue->setField('VALUE', $fullname);
}
$order->save();
|
Пояснения:
- C CSaleOrderPropsValue::GetOrderProps получили поля заказа с ФИО и создали переменную с ФИО целиком.
- C \Bitrix\Sale\PropertyValueCollection::getList получили ID свойства заказа с "ФИО целиком"
- С $propertyValue->setField установили значение свойства из переменной с полным ФИО
- Сохранили заказ
Заметка готова, рекомендую воспользоваться кодом из нее, он более лаконичный и правильный
https://camouf.ru/blog-note/12877/
Улучшения (для заметки).
1) SaleOrderPropsValue::GetOrderProps не нужен, мы итак загрузили заказ в \Bitrix\Sale\Order::load и получили коллекцию свойств.
2) В \Bitrix\Sale\PropertyValueCollection::getList получаем только нужные поля с ФИО и свойство для заполнения. Таким образом не тягаем весь массив с заказом в ОЗУ.
3) Всю работу с массивом и сохранением свойства + заказа делаем внутри цикла.