@IliaMal

Почему возникает ошибка при заполнеии мвойст заказа при создании заказа через Bitrix\Sale\Order?

Здравствуйте.

Для формирования заказа в один клик использовал класс Bitrix\Sale\Order.
Возникла проблема с заполнением свойств заказа ФИО, телефон, почта покупателя.
В документации не нашел информации как заполнить именно эти поля, нашел только что их можно заполнить через метод getPropertyCollection().
Методом тыка удалось их заполнить так:
$collection = $order->getPropertyCollection();

$propertyValue = $collection->createItem([
    'ID' => 1,
    'NAME' => 'NAME',
    'TYPE' => 'STRING',
    'CODE' => 'PROP_Name',
]);
$propertyValue->setField('VALUE', $name);
$propertyValue = $collection->createItem([
    'ID' => 2,
    'NAME' => 'PHONE',
    'TYPE' => 'STRING',
    'CODE' => 'PROP_Phone',
]);
$propertyValue->setField('VALUE', $phone);
$propertyValue = $collection->createItem([
    'ID' => 3,
    'NAME' => 'EMAIL',
    'TYPE' => 'STRING',
    'CODE' => 'PROP_Email',
]);
$propertyValue->setField('VALUE', $email);


Заказы создавались корректно пока не обновил Битрикс.
Теперь выдает ошибку mysql
[Bitrix\Main\DB\SqlQueryException] 
Mysql query error: (1062) Duplicate entry '1020-1' for key 'IX_SOPV_ORD_PROP_UNI' (400)
INSERT INTO `b_sale_order_props_value`(`ORDER_ID`, `ORDER_PROPS_ID`, `NAME`, `VALUE`, `CODE`, `XML_ID`) VALUES (1020, 1, 'NAME', 'email@email.ru', 'PROP_Name', 'bx_603f258e31ae7')


Заказ создается, но в свойствах заказа информация о покупателе не сохраняется.

Подскажите как правильно передать эти свойства.
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
Какое то из свойств дублируется. Скорее всего email.
Попробуйте сначала получить из $propertyCollection эти свойства, а если их нет, то уже создавать.
Пример для email
if ($emailProp = $collection->getUserEmail()) {
	$emailProp->setValue($email);
} else {
	$emailProp = $collection->createItem([
		'ID' => 3,
		'NAME' => 'NAME',
		'TYPE' => 'STRING',
		'CODE' => 'PROP_Email',
	]);
	$emailProp->setField('VALUE', $email);
}


Данный код будет работать если в настройках свойства email стоит галочка "Значение свойства будет использовано как E-Mail при регистрации нового пользователя". Если она не стоит, то нужно будет в цикле обойти propertyCollection
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы