Как добавить свойства заказа после оформления?
пытаюсь обновить свойство заказа, но не записывается свойство, пробовал по разному объявить
1-й вариант:
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
'sale', 'OnSaleOrderSaved', 'addOrderProperty'
);
function addOrderProperty($event)
{
$order = $event->getParameter("ENTITY");
$code = 'PAY_LINK';
$value = "https://" . $_SERVER["SERVER_NAME"] . "/pay.php?ORDER_ID=" . $order->getId();
if (CModule::IncludeModule('sale')) {
if ($prop = CSaleOrderProps::GetList([], ['CODE' => $code])->Fetch()) {
return CSaleOrderPropsValue::Add([
'NAME' => $prop['NAME'],
'CODE' => $prop['CODE'],
'ORDER_PROPS_ID' => $prop['ID'],
'ORDER_ID' => $order,
'VALUE' => $value
]);
}
}
}
2-й вариант:
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
'sale', 'OnSaleOrderSaved', 'PayLink'
);
function PayLink(Main\Event $event) {
CModule::IncludeModule("sale");
$order = $event->getParameter("ENTITY");
$paymentIds = $order->getPaymentSystemId();
$personTypeId = $order->getPersonTypeId();
$propertyCollection = $order->getPropertyCollection();
if ($paymentIds[0] == 10) {
$orderPropertyId = ($personTypeId == 1) ? 55 : 56;
$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderPropertyId);
var_dump($somePropValue);
if (!$somePropValue) {
CSaleOrderPropsValue::Add(array(
'ORDER_ID' => $order->getId(),
'ORDER_PROPS_ID' => $orderPropertyId,
'NAME' => "Ссылка на оплату",
'VALUE' => "https://" . $_SERVER["SERVER_NAME"] . "/pay.php?ORDER_ID=" . $order->getId(),
'CODE' => "PAY_LINK",
));
} else {
$propValue = $somePropValue->getValue();
var_dump($propValue);
if (empty($propValue)) {
$somePropValue->setValue("https://" . $_SERVER["SERVER_NAME"] . "/pay.php?ORDER_ID=" . $order->getId());
$somePropValue->save();
}
}
}
}
Подскажите, как сделать чтобы работало?
Ответы (1 шт):
Автор решения: Firsov36
→ Ссылка
Что-то вы в своем коде то используете D7, то старые методы.. вот решение на чистом D7. Данные код, при сохранении заказа, проверяет есть ли свойство PAY_LINK и в зависимости от этого добавляет свойство, либо обновляет, если оно заполнено не так как надо. Другие проверки, типа физ.лицо или юр.лицо, уж сами добавьте.
/* дополнение для /bitrix/php_interface/init.php */
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler(
'sale',
'OnSaleOrderSaved',
'addOrderPropertyPayLink'
);
function addOrderPropertyPayLink(\Bitrix\Main\Event $event) {
/** @var \Bitrix\Sale\Order $order */
$order = $event->getParameter("ENTITY");
$payLinkCode = 'PAY_LINK';
$serverName = \Bitrix\Main\Context::getCurrent()->getServer()->getServerName();
$payLinkValue = 'https://' . $serverName . "/pay.php?ORDER_ID=" . $order->getId();
/** @var \Bitrix\Sale\PropertyValueCollection $propertyCollection */
$propertyCollection = $order->getPropertyCollection();
$property = null;
if($propertyCollection->getItemByOrderPropertyCode($payLinkCode) === null) {
$property = $propertyCollection->createItem(
[
'NAME' => 'Ссылка на оплату',
'CODE' => $payLinkCode,
'TYPE' => 'STRING',
]
);
} else {
$property = $propertyCollection->getItemByOrderPropertyCode($payLinkCode);
}
if($property && $property->getValue() !== $payLinkValue) {
$property->setField('VALUE', $payLinkValue);
$order->save();
}
}