Приведу пример асинхронного подсчета количества элементов инфоблока по определенному свойству. Сразу отмечу, что сделано на 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 или пустое значение, то это свойство скроем, иначе выведем (<значение_которое_вернули>)