В битриксе к сожалению штатно не реализована возможность задания наценки группе товаров по их принадлежности к разделу инфоблока, поэтому приходится придумывать вот такие вот костыли. Решение не претендует на качество, написано быстро, без работы над ошибками и тестов, но многим может пригодиться, используйте на свой страх и риск. Создаем обычную статичную страничку в битриксе, ограничиваем к ней доступ. И собственно код страницы:
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");?>
|
результат такой: