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

RSS
Объединить отдельные поля ФИО в одно скрытое поле- при оформлении заказа в Битрикс, Черновик, для будующей заметки в блог
 
Это черновк для будущей, более развернутой, заметки в блог https://camouf.ru/blog-note/

Заметка готова, рекомендую воспользоваться кодом из нее, он более лаконичный и правильный
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) Всю работу с массивом и сохранением свойства + заказа делаем внутри цикла.
Изменено: Михаил Базаров - 11.06.2022 11:49:31
 
Добрый день, сделал все как указанно на странице но не поле не объединяется, HELP
 
Коды отдельных полей правильно указаны? В примере это: NAME, S_NAME и L_NAME
У вас могут быть другие.
И ID поля в которое они должны записать, в примере 'ORDER_PROPS_ID' => 12

PS: Чуть позже будет заметка в блоге. Более развернутая
 
Цитата
написал:
Коды отдельных полей правильно указаны? В примере это: NAME, S_NAME и L_NAME
У вас могут быть другие.
И ID поля в которое они должны записать, в примере 'ORDER_PROPS_ID' => 12

PS: Чуть позже будет заметка в блоге. Более развернутая
Коды полей и id указаны верно, все равно не объединяет
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Ютубе