Приведу пример асинхронного подсчета количества элементов инфоблока по определенному свойству. Сразу отмечу, что сделано на JQuery.[spoiler]
Вначале о структуре:
Есть инфоблок. В нем элементы ). У элементов есть свойство.
Нужно подсчитать сколько элементов со свойством в данном инфоблоке.
Создадим файл (Ajx_QFilter.php), который будет подсчитывать, сохранять в кеше результат и отправлять ответ.
Теперь в шаблоне пропишем AJAX вызов.
Примечание - если вернем из Ajx_QFilter.php вернем 0 или пустое значение, то это свойство скроем, иначе выведем (<значение_которое_вернули>)
Вначале о структуре:
Есть инфоблок. В нем элементы ). У элементов есть свойство.
Нужно подсчитать сколько элементов со свойством в данном инфоблоке.
Создадим файл (Ajx_QFilter.php), который будет подсчитывать, сохранять в кеше результат и отправлять ответ.
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?>
<?
$APPLICATION->RestartBuffer();
header("Content-Type: text/html; charset=".LANG_CHARSET);
//header("Pragma: no-cache");
?>
<?
if(!CModule::IncludeModule("iblock")){
$this->AbortResultCache();
ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
die();
}
$IBLOCK_ID = (int)$_GET['IBLOCK_ID'];
$PROPERTY = trim($_GET['PROPERTY']); //<код свойства>
$VALUE = (int)(trim($_GET['VALUE'])); //<ID значение свойства>
// CHACHE
$const['CACHE_TIME'] = 3600;
$const['CACHE_ID'] = 'count_QFilter_'.$IBLOCK_ID.'_'.$PROPERTY.'_'.$VALUE;
$obCache = new CPHPCache;
if($IBLOCK_ID > 0 && strlen($PROPERTY) > 0 && strlen($VALUE) > 0){
// если кэш есть и он ещё не истек то
if($obCache->InitCache($const['CACHE_TIME'], $const['CACHE_ID'], "/")) :
// получаем закешированные переменные
$vars = $obCache->GetVars();
$arResult = $vars["arResult"];
else :
$arSelect = Array("ID", "IBLOCK_ID", 'PROPERTY_'.$PROPERTY);
//$arFilter = Array('IBLOCK_TYPE'=>'ns_catalog', "IBLOCK_ID"=>$IBLOCK_ID, 'PROPERTY_'.$PROPERTY.'_VALUE' => $VALUE);
$arFilter = Array('IBLOCK_TYPE'=>'ns_catalog', "IBLOCK_ID"=>$IBLOCK_ID, 'PROPERTY_'.$PROPERTY => $VALUE);
$res = CIBlockElement::GetList(Array("ID" => "ASC"), $arFilter, false, false, $arSelect);
$arResult = (int)$res->SelectedRowsCount();
// echo '<pre>arSelect'.print_r($arSelect,true).'</pre>';
// echo '<pre>arFilter'.print_r($arFilter,true).'</pre>';
endif;
//////////// end CHACHE
if($obCache->StartDataCache()):
// записываем предварительно буферизированный вывод в файл кэша
// вместе с дополнительной переменной
$obCache->EndDataCache(array(
"arResult" => $arResult,
));
endif;
}else{
$arResult = '';
}
echo $arResult;
?>
<?
$r = $APPLICATION->EndBufferContentMan();
echo $r;
if(defined("HTML_PAGES_FILE") && !defined("ERROR_404")) CHTMLPagesCache::writeFile(HTML_PAGES_FILE, $r);
die();
?>
|
Теперь в шаблоне пропишем AJAX вызов.
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<script type="text/javascript">
$(document).ready(function(){
var fltr = $(".countQFilter");
for(var j=0; i<fltr.length; i++){
var url = $(fltr[j]).attr("id");
$(fltr[j]).load("/Ajx_QFilter.php?"+url, function(obj){if((obj+0) == 0){$(this).parent().parent('li').hide();}else{$(this).prepend(" (").append(")");}});
}
});
</script>
...
<?foreach($arResult as $arItem):?>
<ul>
<?foreach($arItem['PROPERTY'] as $arProperty):?>
<li>
<span>
<?=$arProperty['NAME']?>
<span class="countQFilter" id="IBLOCK_ID=<?=$arItem['IBLOCK_ID']?>&PROPERTY=<?=$arProperty['CODE']?>&VALUE=<?=$arProperty['CODE']['VALUE']?>"></span>
</span>
</li>
<?endforeach;?>
</ul>
<?endforeach;?>
|
Примечание - если вернем из Ajx_QFilter.php вернем 0 или пустое значение, то это свойство скроем, иначе выведем (<значение_которое_вернули>)

. Кстати видел приписал еще ставнение товаров, теперь и добавление в сравнение на ajax