Автоматический расчет цены комплекта в Битрикс
Готовый скрипт для расчета цены комплекта по его составу, работает на cron.
$_SERVER['DOCUMENT_ROOT'] = __DIR__.'/../..'; error_reporting(0); ini_set("display_errors", false); ini_set("display_startup_errors", false); ini_set('max_execution_time', 360); define("NO_KEEP_STATISTIC", true); define("PUBLIC_AJAX_MODE", true); define("STOP_STATISTICS", true); define("NO_AGENT_STATISTIC", true); define("NO_AGENT_CHECK", true); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); \Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('catalog'); // Проставляет цену комплектов по сумме цен товаров в составе //echo '<pre>'; $productsIds = []; $arSets = []; $dbSets = CCatalogProductSet::getList( // получаем комплекты [], ['TYPE' => CCatalogProductSet::TYPE_SET], false, false, ['ID', 'OWNER_ID'] ); while ($arSet = $dbSets->GetNext()) { $arSetItems = CCatalogProductSet::getSetByID($arSet['ID']); if ($arSetItems['ITEMS']) { $arSets[$arSet['ID']] = $arSetItems; foreach ($arSetItems['ITEMS'] as $arItem) { $productsIds[] = $arItem['ITEM_ID']; } } } $productsIds = array_unique($productsIds); $dbPrices = \Bitrix\Catalog\Model\Price::getList([ // цена товаров 'filter' => [ 'PRODUCT_ID' => $productsIds ], 'select' => [ 'PRODUCT_ID', 'CATALOG_GROUP_ID', 'PRICE' ] ]); while ($arPrice = $dbPrices->fetch()) { $arPrices[$arPrice['PRODUCT_ID']][$arPrice['CATALOG_GROUP_ID']] = $arPrice; } foreach ($arSets as $arSet) { $arSetPrices = []; foreach ($arSet["ITEMS"] as $arItem) { // считаем цену комплекта if ($arPrices[$arItem["ITEM_ID"]]) { foreach ($arPrices[$arItem["ITEM_ID"]] as $priceId => $arPrice) { $arSetPrices[$priceId] += $arItem["QUANTITY"]*$arPrice["PRICE"]; } } } foreach ($arSetPrices as $priceId => $priceValue) { if ($arPrice = \Bitrix\Catalog\Model\Price::getList([ // текущая цена комплекта 'filter' => [ 'PRODUCT_ID' => $arSet["OWNER_ID"], 'CATALOG_GROUP_ID' => $priceId ] ])->fetch()) { \Bitrix\Catalog\Model\Price::update($arPrice['ID'], [ // обновляем цену 'PRODUCT_ID' => $arSet["OWNER_ID"], 'CATALOG_GROUP_ID' => $priceId, 'PRICE' => $priceValue, 'CURRENCY' => 'RUB' // todo: сделать проброс валюты из запроса цена товаров ]); } else { \Bitrix\Catalog\Model\Price::add([ // добавляем 'PRODUCT_ID' => $arSet["OWNER_ID"], 'CATALOG_GROUP_ID' => $priceId, 'PRICE' => $priceValue, 'CURRENCY' => 'RUB' // todo: сделать проброс валюты из запроса цена товаров ]); } } } echo 'done;'; require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
Создаёте файл /local/cron/sets-price.php и добавляете задачу в крон (раз в 4 часа):
0 */4 * * * php -f /path/to/site/local/cron/sets-price.php
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.