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

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

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

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

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

Решение

Добавление обработчика события сохранения заказа

Добавляем обработчик события перед сохранением заказа OnSaleOrderBeforeSaved в файл с обработчиками событий модуля. Например, /local/php_interface/init.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)» в названии товара в заказе.