Закидываем одну из двух версий в init.php и проверяем
Версия на d7:
if (\Bitrix\Main\Loader::includeModule('iblock')) { \Bitrix\Main\EventManager::getInstance()->addEventHandler( "iblock", "OnTemplateGetFunctionClass", ["FunctionMinPriceSection", "eventHandler"] ); //подключаем файл с определением класса FunctionBase include_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/iblock/lib/template/functions/fabric.php"); class FunctionMinPriceSection extends \Bitrix\Iblock\Template\Functions\FunctionBase { //Обработчик события на вход получает имя требуемой функции public static function eventHandler($event) { $parameters = $event->getParameters(); $functionName = $parameters[0]; if ($functionName === "minpricesection") { //обработчик должен вернуть SUCCESS и имя класса return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, "\\FunctionMinPriceSection" ); } } public function onPrepareParameters(\Bitrix\Iblock\Template\Entity\Base $entity, array $parameters) { $arguments = []; // Перехватываем id элемента/раздела, чтобы можно было обращаться к его свойствам $this->data['id'] = $entity->getId(); foreach ($parameters as $parameter) { $arguments[] = $parameter->process($entity); } return $arguments; } //собственно функция выполняющая "магию" public function calculate($parameters) { $priceGroup = '1'; // base or number \Bitrix\Main\Loader::includeModule("catalog"); \Bitrix\Main\Loader::includeModule('currency'); $sectionID = (!empty(reset($parameters)) ? reset($parameters) : $this->data['id']); // Получаем основной раздел $section = \Bitrix\Iblock\SectionTable::getList([ 'filter' => ['ID' => $sectionID], 'select' => ['LEFT_MARGIN', 'RIGHT_MARGIN', 'IBLOCK_ID', 'ID'] ])->fetchRaw(); // Собираем все подразделы $subSections = \Bitrix\Iblock\SectionTable::getList([ 'filter' => [ '>=LEFT_MARGIN' => $section['LEFT_MARGIN'], '<=RIGHT_MARGIN' => $section['RIGHT_MARGIN'], '=IBLOCK_ID' => $section['IBLOCK_ID'], ], 'select' => ['ID'] ]); while ($section = $subSections->fetch()) { $arSectionsID[] = $section['ID']; } // Составляем запрос для получения элементво привязанных к секциям $elementSection = new Bitrix\Main\Entity\Query('\Bitrix\Iblock\SectionElementTable'); $elementSection->addSelect('IBLOCK_ELEMENT_ID')->setFilter(['=IBLOCK_SECTION_ID' => $arSectionsID])->registerRuntimeField( 'SECTION', [ 'data_type' => '\Bitrix\Iblock\SectionTable', 'reference' => [ '=this.IBLOCK_SECTION_ID' => 'ref.ID', ], 'join_type' => 'inner' ] ); // Выполняем запрос $resElementsID = \Bitrix\Main\Application::getConnection()->query($elementSection->getQuery()); while ($elementsID = $resElementsID->fetch()) { $arElementsID[] = $elementsID['IBLOCK_ELEMENT_ID']; } $arItem = \Bitrix\Iblock\ElementTable::getList( [ 'filter' => ['=ID' => $arElementsID], 'order' => ['PriceTable.PRICE_SCALE' => 'asc'], 'select' => [ 'PriceTable.PRICE_SCALE', // Сумма конвертируется в базовую валюту ], 'limit' => 1, 'runtime' => [ new \Bitrix\Main\Entity\ReferenceField( 'PriceTable', \Bitrix\Catalog\PriceTable::class, ['=this.ID' => 'ref.PRODUCT_ID', $priceGroup => 'ref.CATALOG_GROUP_ID'], ['join_type' => 'RIGHT'] ) ] ] )->fetchRaw(); if (!empty($arItem)) { // Получаем форматированную цену в базовой валюте $minPriceSection = \CCurrencyLang::CurrencyFormat(reset($arItem), \Bitrix\Currency\CurrencyManager::getBaseCurrency()); } return $minPriceSection; } } } |
Версия на старом ядре:
<? /** * Парсер "{=minpricesection $id|null} минимальной цены товаров раздела" * @param id - или указываем id раздеа или функция сама получает через \Bitrix\Iblock\Template\Entity\Base * @param priceGroup - нужно указать какую цену запрашиваем. По дефолту базовая (1) * @return string */ if (\Bitrix\Main\Loader::includeModule('iblock')) { \Bitrix\Main\EventManager::getInstance()->addEventHandler( "iblock", "OnTemplateGetFunctionClass", ["FunctionMinPriceSection", "eventHandler"] ); //подключаем файл с определением класса FunctionBase include_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/iblock/lib/template/functions/fabric.php"); class FunctionMinPriceSection extends \Bitrix\Iblock\Template\Functions\FunctionBase { //Обработчик события на вход получает имя требуемой функции public static function eventHandler($event) { $parameters = $event->getParameters(); $functionName = $parameters[0]; if ($functionName === "minpricesection") { //обработчик должен вернуть SUCCESS и имя класса return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, "\\FunctionMinPriceSection" ); } } public function onPrepareParameters(\Bitrix\Iblock\Template\Entity\Base $entity, array $parameters) { $arguments = []; // Перехватываем id элемента/раздела, чтобы можно было обращаться к его свойствам $this->data['id'] = $entity->getId(); foreach ($parameters as $parameter) { $arguments[] = $parameter->process($entity); } return $arguments; } //собственно функция выполняющая "магию" public function calculate($parameters) { $priceGroup = '1';// base or number $sectionID = (!empty(reset($parameters)) ? reset($parameters) : $this->data['id']); $arItems = \CIBlockElement::GetList(["CATALOG_PRICE_{$priceGroup}" => "ASC"], ["SECTION_ID" => $sectionID, "ACTIVE" => "Y", 'INCLUDE_SUBSECTIONS' => 'Y']); $item = $arItems->Fetch(); if (!empty($item)) { $minPriceSection = \CCurrencyLang::CurrencyFormat((int) $item["CATALOG_PRICE_{$priceGroup}"], $item["CATALOG_CURRENCY_{$priceGroup}"], true); } return $minPriceSection; } } } |
UPD. Для версии D7 добавил товары которые привязаны к разделам. Ранее товары участвовали, только если у них IBLOCK_SECTION_ID стоял указанного раздела или его подразделов.
UPD. Пропустили на маркетплейс: