РАЗРАБОТКА НА БИТРИКС

Изменение названий товаров в заказе (метка SALE)

Подписывайтесь на канал для bitrix-разработчиков в Telegram!
В кейсе рассмотрено изменение названия товаров в заказе при наличии метки SALE в панели администратора и в публичной части.

Описание задачи

У клиента возникла необходимость во время просмотра заказа в панели администратора видеть товары в заказе с меткой SALE. Для этого было принято решение добавлять префикс "(SALE)" к названию товаров в заказе.

Решение

Добавление обработчика события сохранения заказа
Если обработчик уже есть, этот пункт можно пропустить.
Добавляем обработчик события перед сохранением заказа OnSaleOrderBeforeSaved в файл с обработчиками событий модуля. Например, /local/php_interface/init.php (в примере для обработчиков модуля sale выделен файл local/php_interface/include/module_events/sale.php)
Пример кода:
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler("sale", "OnSaleOrderBeforeSaved", array("SaleOrderAjaxEventsO2K","OnSaleOrderBeforeSavedHandler"));
class SaleOrderAjaxEventsO2K
{
    function OnSaleOrderBeforeSavedHandler(\Bitrix\Main\Event $event)
    {
        $order = $event->getParameter("ENTITY");
    }    
}
Изменение названий товаров в заказе
Для выполнения задачи решено было добавить префикс "(SALE)" к названию товаров в заказе, то есть из вида "Название товара" нужно привести к виду "(SALE) Название товара".
Для этого собираем товары из заказа, проверяем наличие метки SALE. Если она есть, то меняем название товара.
Также нужно предусмотреть, чтобы товар не менялся при каждом сохранении заказа. Для этого проверяем название товара на наличие подстроки "(SALE)".
Код получившейся функции OnSaleOrderBeforeSavedHandler представлен ниже:
public static function OnSaleOrderBeforeSavedHandler(\Bitrix\Main\Event $event)
    {
        $order = $event->getParameter('ENTITY');
		$basket = $order->getBasket();
		$basket_items = $basket->getBasketItems();
		foreach ($basket_items as $Item) {
			$rsItem = CIblockElement::GetList(
				[],
				array("ID" => $Item->getField('PRODUCT_ID'), "!PROPERTY_SPECIALOFFER" => false),
				false,
				false,
				array("ID", "PROPERTY_SPECIALOFFER")
			);
			if($itemSale = $rsItem->Fetch() && strpos($Item->getField('NAME'),"(SALE)") === false){
				$Item->setFields(array(
					'NAME' => "(SALE)".$Item->getField('NAME')
				));
			}
			$basket->save();
		}
    }

Результат

При оформлении заказа, а также при сохранении заказа из панели администратора либо через API, товарам с пометкой SALE в админке добавляется префикс "(SALE)" в названии товара в заказе.
Подписывайтесь на канал для bitrix-разработчиков в Telegram!

Рекомендованные статьи