Йо-йо! Недавно мне от клиента поступила задача — «нужно, чтобы из 1С выгружалось свойство. В свойстве будет содержаться старая цена. В карточке товара должна отображаться разница. На товары, у которых будет установлена старая цена, не будут распространяться никакие скидки.»
В шаблоне 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']
Т.к. я ранее делал доработки на этом, тема уже лежала в папке .
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
У карточки товара нужно отредактировать 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С.
Делитесь своими наработками в комментариях, а также вы можете написать мне лично, чтобы я разместил ваш код на сайте. Битрикс — ужасная платформа для программистов, нет ни какого стандарта, который бы сказал как правильно сделать. И если вы читаете эту статью, вы уже сами столкнулись с этим. Помогите другим программистам, поделитесь своими наработкам по Битриксу.