#sql #битрикс
Переходим на новую версию php 7 в bitrix 16.5 и я пытаюсь записать в базу имя физического лица при помощи кода: https://gist.github.com/vasilukwolf/c2dfaf819de9d9b65a18b0264757c3a0 Однако происходит сбой записи. Пробовал менять события, пробовал просто отправить, результат один и тот же. Запись заблокирована. Пытался даже использовать совет: http://fmwd.ru/stati/cms/1c-bitrix/pochemu-ne-rabotaet-csaleorderpropsvalue.html Но запись в базу не происходит. Однако все прекрасно пишет в кеш. Вопрос состоит в том, как записать эту информацию базу, аналогично OnOrderSave: https://gist.github.com/vasilukwolf/995446e77fedf29014d5bfa640734b94
Ответы
Ответ 1
К сожалению, помогло только это: https://stackoverflow.com/questions/11761140/mysql-on-duplicate-key-update-trouble В результате составил прямой запрос: $strSql = "INSERT INTO `b_sale_order_props_value` SET `ORDER_ID`=" . $value_id . ", `ORDER_PROPS_ID`=" . $ar['ID'] . ", `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "' ON DUPLICATE KEY UPDATE `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "';" Который отправил в базу и всё работает. Почему происходит другой запрос в штатной функции bitrix. Я написал запрос в bitrix, возможно еще дополню.Ответ 2
Вот ответ на вопрос: \Bitrix\Main\EventManager::getInstance()-> addEventHandler("sale", "OnSaleOrderBeforeSaved", "OnSHandler"); function OnSHandler(Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if (15 == $p["ID"]) { $family = $property->getField("VALUE"); } if (19 == $p["ID"]) { $name = $property->getField("VALUE"); } if ("PRIVATE_PERSON" == $p["CODE"]) { $property->setValue($name . ' ' . $family); } } } } Публикую с целью CodeReview. Поддержка ответила: ЦИТАТА Вам не нужно писать в базу в этом событии. Вам нужно просто взять коллекцию свойств объекта $order и дописать в нее свои данные, или изменить уже существующие. Система сама потом сохранит всё в базу: $propertyCollection = $order->getPropertyCollection(); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if( $p["CODE"] == "CONTACT_PERSON") $property->setValue("VASYA"); } } С уважением, ведущий специалист отдела технической поддержки Шестопалов Лев При этом мы использовали событие OnSaleOrderBeforeSaved. Допилить мне его помог: https://mrcappuccino.ru/blog/post/work-with-basket-bitrix-d7Ответ 3
Так а при чем здесь PHP7. У вас черным по белому пишет: нарушение уникальности ключа IX_SOPV_ORD_PROP_UNI. Это не зависит от версии PHP ни коим образом. По всему похоже, что есть некий тригер срабатывающий на обновление записив этой таблице. Вам надо с этим разбираться... Возможно что то не так у вас обновилось при серьезном обновлении или где то обращаетесь к БД в обход АПИ и там что то нкосячили.
Комментариев нет:
Отправить комментарий