Старая цена из свойства в ASPRO Next. Красиво и надёжно

вывод старой цены товара из свойства в Aspro Next

Йо-йо! Недавно мне от клиента поступила задача — «нужно, чтобы из 1С выгружалось свойство. В свойстве будет содержаться старая цена. В карточке товара должна отображаться разница. На товары, у которых будет установлена старая цена, не будут распространяться никакие скидки.»

В шаблоне Aspro Next уже был встроен механизм отображения старой цены и суммы скидки. И выглядело это так:

Отображение скидки в ASPRO Next в списке товаров
Отображение скидки в ASPRO Next в списке товаров
Отображение скидки в ASPRO Next в детальной карточке товара
Отображение скидки в ASPRO Next в детальной карточке товара

Поэтому вмешиваться в шаблон не было никакого смысла и нужно было удачно подменить данные. Сразу оговорюсь, что мой способ может не подойти для тех кто использует SKU. В моём случае заказчик никогда не будет их использовать, поэтому я выбрал это решение.

Определение источника данных

С Битриксом я работаю около 2-х лет (около 6 месяцев с бэкендом 08.07.2019). За это время я усвоил, что лучше всего распечатать данные из массива, чтобы найти то, что тебе нужно. Я так и поступил. В итоге я узнал, что данные в детальной карточке товара, которые использует шаблон, находятся в элементе массива —

$arResult['PRICE_MATRIX']['MATRIX'][1]['ZERO-INF']['PRICE']

Создание свойства

В настройке инфоблока я создал новое свойство «CUSTOM_OLD_PRICE«

Создание нового свойства инфоблока - старая цена
Создание нового свойства инфоблока — старая цена

Теперь значение этого свойства мне доступно в переменной

$arResult['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE']

Редактирование result_modifier.php

Т.к. я ранее делал доработки на этом, тема уже лежала в папке .

local > templates > aspro_next

Если у вас это не так, то перенесите папку templates в папку local .

Детальная карточка товара

Далее я перешёл в сам файл, который лежал в

templates > aspro_next > components > bitrix > catalog.element > main > result_modifier.php

В самом файле я написал следующее

/*
* Custom code
*/
// 

// Change the print of the old price depending on the property CUSTOM_OLD_PRICE

if($arResult['PROPERTIES']['CUSTOM_OLD_PRICE'] && !empty($arResult['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE']) && $arResult['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE'] != 0){
	$arResult['PRICE_MATRIX']['MATRIX'][1]['ZERO-INF']['PRICE'] = $arResult['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE'];
}

/*
*  !Custom code
*/

Писать это нужно после строки

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();

Т.к. на сайте есть несколько шаблонов, я прописал изменения в каждом шаблоне в котором был файл result_modifier.php

Шаблоны карточки товара в Aspro Next
Шаблоны карточки товара в Aspro Next

Карточка товара в списке

У карточки товара нужно отредактировать result_modifier.php другого шаблона. Он находиться здесь —

local > templates > aspro_next > components > bitrix > catalog.section > catalog_block > result_modifier.php

После примерно 134 строк и

$arNewItemsList = array();
	foreach ($arResult['ITEMS'] as $key => $arItem)
	{

Нужно написать следующее

/*
* Custom code
*/
// 

// Change the print of the old price depending on the property CUSTOM_OLD_PRICE

if($arItem['PROPERTIES']['CUSTOM_OLD_PRICE'] && !empty($arItem['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE']) && $arItem['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE'] != 0){
	$arItem['PRICE_MATRIX']['MATRIX'][1]['ZERO-INF']['PRICE'] = $arItem['PROPERTIES']['CUSTOM_OLD_PRICE']['VALUE'];

}

/*
*  !Custom code
*/

Вот и всё, скидывайте кэш и проверяйте. Не забудьте поменять result_modifier.php у всех шаблонов. Возможно вы поменяете режим отображения и у вас не будет видно ваших скидок или, например, в режиме быстрого просмотра будут некорректные данные.

Как можно улучшить?

Вы можете написать свои проверки «старой цены». Можете нечаянно ввести значение ниже, чем действующая цена. Тогда возникнут ошибки. У меня этим занимается 1С.

Ещё одна возможная проблема — будут действовать настройки работы с корзиной. Вы могли дать на этот товар скидку. Добавьте проверку, давалась ли скидка к этому товару или нет, по необходимости. В моём случае товары определённой группы не получают никаких скидок и на них не действуют никакие дополнительные скидки. Цену уже уменьшили в 1С.

P.S.

Делитесь своими наработками в комментариях, а также вы можете написать мне лично, чтобы я разместил ваш код на сайте. Битрикс — ужасная платформа для программистов, нет ни какого стандарта, который бы сказал как правильно сделать. И если вы читаете эту статью, вы уже сами столкнулись с этим. Помогите другим программистам, поделитесь своими наработкам по Битриксу.