В битриксе к сожалению штатно не реализована возможность задания наценки группе товаров по их принадлежности к разделу инфоблока, поэтому приходится придумывать вот такие вот костыли. Решение не претендует на качество, написано быстро, без работы над ошибками и тестов, но многим может пригодиться, используйте на свой страх и риск. Создаем обычную статичную страничку в битриксе, ограничиваем к ней доступ. И собственно код страницы:
jquery Должен быть подключен
результат такой:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("extra"); ?> <?php CModule::IncludeModule('iblock'); CModule::IncludeModule('catalog'); // если применили наценку if (isset($_REQUEST['extra-submit']) && !empty($_REQUEST['extra-submit'])) { $iExtraType = intval($_REQUEST['extra-type']); if (0 < $iExtraType && isset($_REQUEST['section']) && is_array($_REQUEST['section']) && !empty($_REQUEST['section'])) { $arElsFilter = array('IBLOCK_ID' => 1, 'SECTION_ID' => array_keys($_REQUEST['section'])); $arElsSelect = array('ID', 'NAME'); $dbEls = CIBlockElement::GetList(false, $arElsFilter, false, false, $arElsSelect); $arEls = $arElsID = array(); while ($arEl = $dbEls -> Fetch()) { $arEls[] = $arEl; $arElsID[] = $arEl['ID']; } if (!empty($arElsID)) { $productCounter = 0; foreach ($arElsID as $arElID) { // найдем ID торговых предложений для выбранных товаров $dbSellingProposition = CPrice::GetList( array(), array('PRODUCT_ID'=>$arElID,'CATALOG_GROUP_ID'=>2), false, array('nTopCount'=>1), array('ID') ); // поля которые установим для торгового предложения $arNewSellingPropositionFields = array( 'PRODUCT_ID' => $arElID, 'EXTRA_ID' => $iExtraType, // код наценки 'CATALOG_GROUP_ID' => 2, //2 - ID типа цены (розничная цена) //'PRICE' => 0, // новая цена с наценкой // обязательно должна быть задана валюта! 'CURRENCY' => 'RUB' ); // если торговое предложение существует if ($arSellingProposition = $dbSellingProposition->Fetch()) { CPrice::Update($arSellingProposition['ID'], $arNewSellingPropositionFields, true); } else { CPrice::Add($arNewSellingPropositionFields, true); } /*echo '<pre>'; print_r($arTmp); echo '</pre>';*/ $productCounter++; } echo '<h2 class="red">Всего изменено цен: '.$productCounter.'</h2>'; } } } // вывод секций $arResult["SECTIONS"] = array(); $rsSections = CIBlockSection::GetList( array('left_margin' => 'asc', 'NAME' => 'ASC'), array('IBLOCK_ID' => 1), true, array('ID', 'NAME', 'CODE', 'DEPTH_LEVEL', 'SECTION_PAGE_URL') ); while($arSection = $rsSections->GetNext(false)) { $arResult["SECTIONS"][]=$arSection; } // достанем возможные варианты наценок $arResult["EXTRA"] = array(); $dbExtra = CExtra::GetList(array('PERCENTAGE' => 'ASC'), array()); while ($arExtra = $dbExtra->Fetch()) { $arResult["EXTRA"][] = $arExtra; } ?> <fo rm action="/extra/" id="extra-form" method="post"> <div id="extra-right-block"> <select id="extra-type" name="extra-type"> <option value="-1">Выбрать тип наценки</option> <?php foreach($arResult["EXTRA"] as $arExtra):?> <option value="<?=$arExtra['ID']?>"><?=$arExtra['NAME']?> [<?=$arExtra['PERCENTAGE']?>%]</option> <?php endforeach; ?> </select> <br /> <br /> <input type="s ubmit" name="extra-submit" id="extra-submit" value="Применить" /> </div> <ul class="extra-list"> <?php $i=1; ?> <?foreach($arResult['SECTIONS'] as $arSection):?> <li> <?php //echo $arSection["DEPTH_LEVEL"]; ?> <input type="checkbox" id="section<?=$arSection['ID'];?>" name="section[<?=$arSection['ID'];?>]" /> <label for="section<?=$arSection['ID'];?>"><?=$arSection["NAME"];?> (<?=$arSection["ELEMENT_CNT"]?>)</label> <a target="_blank" href="<?=$arSection["SECTION_PAGE_URL"]?>">»»</a> <?php if (isset($arResult['SECTIONS'][$i]) && ($arResult['SECTIONS'][$i]['DEPTH_LEVEL']>$arSection["DEPTH_LEVEL"])): ?> <ul> <?php else:?> <?php if ((isset($arResult['SECTIONS'][$i]) && ($arResult['SECTIONS'][$i]['DEPTH_LEVEL']<$arSection["DEPTH_LEVEL"])) || ($i == count($arResult['SECTIONS']))): ?> <?php echo str_repeat("</li></ul>", $arSection["DEPTH_LEVEL"] - $arResult['SECTIONS'][$i]['DEPTH_LEVEL']); ?> <?php endif;?> </li> <?php endif;?> <?php $i++;?> <?endforeach?> </ul> </form> <sc ript type="text/javascript"> $(docu ment).ready(f unction(){ $('#extra-form input[type="checkbox"]').change(f unction(){ var obParentLi = $(this).parent('li'); var bThisCheckboxState = $(this).is(':checked'); $('input[type="checkbox"]',obParentLi).each(f unction(){ $(this).attr('checked',bThisCheckboxState); }); }); }); </sc ript> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
результат такой: