Оптимизация smart.filter

Home » Bitrix » bitrix рецепты » Оптимизация smart.filter
bitrix рецепты Комментариев нет
1. добавить в конце файла class.php // usovdm perfomance fix CModule::IncludeModule("iblock"); class SmartFilterCIBlockElement extends CIBlockElement { public static function GetPropertyValues($IBLOCK_ID, $arElementFilter) { global $DB; $IBLOCK_ID = intval($IBLOCK_ID); $VERSION = CIBlockElement::GetIBVersion($IBLOCK_ID); $arElementFilter["IBLOCK_ID"] = $IBLOCK_ID; $element = new CIBlockElement; $element->strField = "ID"; $element->GetList(array(), $arElementFilter, false, false, array("ID")); $q = 'SELECT DISTINCT `PROPERTY_ID` FROM `b_iblock_section_property` WHERE `SMART_FILTER` = "Y" AND `IBLOCK_ID` = '.$IBLOCK_ID; $db = $DB->Query($q); $propertyIDs = array(); while($propertyID = $db->fetch()){ $propertyIDs[] = $propertyID['PROPERTY_ID']; } if ($VERSION == 2) $strSql = " SELECT BEP.* FROM ".$element->sFrom." INNER JOIN b_iblock_element_prop_s".$IBLOCK_ID." BEP ON BEP.IBLOCK_ELEMENT_ID = BE.ID WHERE 1=1 ".$element->sWhere." ORDER BY BEP.IBLOCK_ELEMENT_ID "; else $strSql = " SELECT BE.ID IBLOCK_ELEMENT_ID ,BEP.IBLOCK_PROPERTY_ID ,BEP.VALUE ,BEP.VALUE_NUM FROM ".$element->sFrom." LEFT JOIN b_iblock_element_property BEP ON BEP.IBLOCK_ELEMENT_ID = BE.ID AND BEP.VALUE != ''".(!empty($propertyIDs) ? " AND BEP.IBLOCK_PROPERTY_ID IN (".implode(', ', $propertyIDs).")" : "")." WHERE 1=1 ".$element->sWhere." ORDER BY BEP.IBLOCK_ELEMENT_ID "; $rs = new CIBlockPropertyResult($DB->Query($strSql)); $rs->setIBlock($IBLOCK_ID); return $rs; } } 2. В component.php заменить дважды GetPropertyValues по примеру // $rsElements = CIBlockElement::GetPropertyValues($this->IBLOCK_ID, $arElementFilter); $rsElements = SmartFilterCIBlockElement::GetPropertyValues($this->IBLOCK_ID, $arElementFilter); // usovdm perfomance fix