Итак, задача:
Отсортировать элементы по цене (цены берутся из отдельной таблицы, свои типы цен, валюты, остатки и т.п., редакция старт)
[spoiler]
1. для начала описываем необходимые нам таблицы, для фильтрации, сортировки и т.п.
в моем случае их примерно так. (стоит отметить, что пока сильно не заморачивался с поддержкой инфоблоков 1.0, включал поддержку на будущее местами)
2. Теперь можно приступить и к компонету... параметры наскорую взял из одного из своих компонентов
все стандартно никаких велосипедов нет, отмечу, что для фильтрации и т.п. используются айдишники свойст, а не их коды (так проще);
3. Сам компонент (гибрид апи старого и нового ядра)
все стандартно, подготавливаем данные
подключаем необходимые модули
получаем параметры инфоблока, больше нас будут интересовать версия инфоблока
подготавливаем массив select (если нужно добавить дополнительные поля, их стоит описать в нашем \Siteshouse\Asz\ElementTable)
добавляем свойства, если указаны в параметрах компонента (в $arSelect впринципе необязательно загонять, значения свойств удобнее получить отдельно уже в getlist элементов)
дальше фильтр
дальше уже формируем даннные для запроса в бд, заодно устанавливаем сортировки, лимиты и т.п. (пока получение свойств вырезаются, быстрее с помощью старого апи их собрать, после если потребуется можно и доработать)
с постраничкой возникли проблемы, поэтому нужен костыль для подсчета количества элементов
теперь все готово, для выборки данных. Свойства получаем в цикле используя CIBlockElement::GetProperty
постраничка, ничего толкового не придумал. Поэтому костыль в 2-3 метра
мета теги и данные для крошек (старые метатеги из свойств, уже можно не учитывать)
секретное получение цен, ничего сверх там не хранится (сначала забираю данные о доступных типах цен для групп пользователей, дальше метод уже просто собирает цены в массив array("ид-элемента"=>array("VALUE"=>10000.00,"CUR"=>"RUB"
))
ну дальше тут понятно
и крошки с метатегами
Ну и разумеется данный ориентированно костыльный подход, требует критики.
Поэтому любая критика в комментариях приветствуется...
Отсортировать элементы по цене (цены берутся из отдельной таблицы, свои типы цен, валюты, остатки и т.п., редакция старт)
[spoiler]
1. для начала описываем необходимые нам таблицы, для фильтрации, сортировки и т.п.
в моем случае их примерно так. (стоит отметить, что пока сильно не заморачивался с поддержкой инфоблоков 1.0, включал поддержку на будущее местами)
CModule::AddAutoloadClasses('siteshouse.asz', array( 'Siteshouse\Asz\PriceTable' => 'lib/price.php', //секретке 'Siteshouse\Asz\CurencyFunc' => 'lib/curencyfunc.php', //секретке 'Siteshouse\Asz\PropertyValuesTable' => 'lib/propertyvalues.php', 'Siteshouse\Asz\ElementTable' => 'lib/element.php', )); |
<?php /** * Bitrix Framework * @package Bitrix * @subpackage siteshouse.asz * @copyright 2014 Zahalski Andrew */ namespace Siteshouse\Asz; use Bitrix\Main\Entity; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); class ElementTable extends Entity\DataManager { public static function getFilePath() { return __FILE__; } public static function getTableName() { return 'b_iblock_element'; } public static function getMap() { return array( 'ID' => array( 'data_type' => 'integer', 'primary' => true, 'autocomplete' => true, ), 'NAME' => array( 'data_type' => 'string', ), 'CODE' => array( 'data_type' => 'string', ), 'PREVIEW_TEXT' => array( 'data_type' => 'string', ), 'DETAIL_TEXT' => array( 'data_type' => 'string', ), 'IBLOCK_ID' => array( 'data_type' => 'integer', ), 'IBLOCK' => array( 'data_type' => 'Iblock', 'reference' => array('=this.IBLOCK_ID' => 'ref.ID'), ), 'ACTIVE' => array( 'data_type' => 'boolean', 'values' => array('N','Y'), ), 'IBLOCK_SECTION_ID' => array( 'data_type' => 'integer', ), 'DETAIL_PICTURE' => array( 'data_type' => 'integer', ), 'PROP' => array( 'data_type' => 'Siteshouse\Asz\PropertyValuesTable', 'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'), 'join_type' => "LEFT" ), 'PRICE' => array( 'data_type' => 'Siteshouse\Asz\PriceTable', 'reference' => array('=this.ID' => 'ref.PRODID'), 'join_type' => "LEFT" ), ); } } |
<?php /** * Bitrix Framework * @package Bitrix * @subpackage siteshouse.asz * @copyright 2014 Zahalski Andrew */ namespace Siteshouse\Asz; use Bitrix\Main\Entity; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); class PropertyValuesTable extends Entity\DataManager { public static $iblockNameIb = false; public static $iblockTyperIb = false; public static function getFilePath() { return __FILE__; } public static function getTableName() { //self::$iblockTyperIb = true; //self::$iblockNameIb = 3; if(!self::$iblockTyperIb || !self::$iblockNameIb) return 'b_iblock_element_property'; return 'b_iblock_element_prop_s'.self::$iblockNameIb; } public static function getMap() { $tableField = array(); if(!self::$iblockTyperIb) { $tableField['ID'] = array( 'data_type' => 'integer', 'primary' => true, 'autocomplete' => true, ); $tableField['IBLOCK_PROPERTY_ID'] = array( 'data_type' => 'integer', 'primary' => false, ); $tableField['IBLOCK_ELEMENT_ID'] = array( 'data_type' => 'integer', 'primary' => false, ); $tableField['VALUE'] = array( 'data_type' => 'string', 'primary' => false, ); $tableField['VALUE_TYPE'] = array( 'data_type' => 'string', 'primary' => false, ); $tableField['VALUE_ENUM'] = array( 'data_type' => 'integer', 'primary' => false, ); $tableField['VALUE_NUM'] = array( 'data_type' => 'string', 'primary' => false, ); $tableField['DESCRIPTION'] = array( 'data_type' => 'string', 'primary' => false, ); }else{ \CModule::IncludeModule("iblock"); $IBLOCK_ID = self::$iblockNameIb; $properties = \CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("IBLOCK_ID"=>$IBLOCK_ID)); $arProp = array(); while ($prop_fields = $properties->GetNext()) { $arProp[] = $prop_fields; } $tableField["IBLOCK_ELEMENT_ID"] = array( 'data_type' => 'integer', 'primary' => true, 'autocomplete' => false, ); foreach($arProp as $prop){ $tableField["PROPERTY_".$prop["ID"]] = array( 'data_type' => ($prop["TYPE"]=="N" || $prop["TYPE"]=="L" || $prop["TYPE"]=="F" || $prop["TYPE"]=="G" || $prop["TYPE"]=="E") ? 'integer' : 'string', 'primary' => false, ); $tableField["DESCRIPTION_".$prop["ID"]] = array( 'data_type' => 'string', 'primary' => false, ); } } return $tableField; } } ?> |
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); /** @var array $arCurrentValues */ /** @global CUserTypeManager $USER_FIELD_MANAGER */ global $USER_FIELD_MANAGER; if(!CModule::IncludeModule("iblock")) return; $arIBlockType = CIBlockParameters::GetIBlockTypes(); $arIBlock = array(); $rsIBlock = CIBlock::GetList(array("sort" => "asc"), array("TYPE" => $arCurrentValues["IBLOCK_TYPE"], "ACTIVE"=>"Y")); while($arr=$rsIBlock->Fetch()) $arIBlock[$arr["ID"]] = "[".$arr["ID"]."] ".$arr["NAME"]; $arProperty = array(); $arPropertyID = array(); $arProperty_LNS = array(); $arProperty_N = array(); $arProperty_X = array(); if (0 < intval($arCurrentValues['IBLOCK_ID'])) { $rsProp = CIBlockProperty::GetList(array("sort"=>"asc", "name"=>"asc"), array("IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"], "ACTIVE"=>"Y")); while ($arr=$rsProp->Fetch()) { if($arr["PROPERTY_TYPE"] != "F"){ $arProperty[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; $arPropertyID[$arr["ID"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; } if($arr["PROPERTY_TYPE"]=="N") $arProperty_N[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; if($arr["PROPERTY_TYPE"]!="F") { if($arr["MULTIPLE"] == "Y") $arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; elseif($arr["PROPERTY_TYPE"] == "L") $arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; elseif($arr["PROPERTY_TYPE"] == "E" && $arr["LINK_IBLOCK_ID"] > 0) $arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; } } } $arProperty_UF = array(); $arSProperty_LNS = array(); $arSort = CIBlockParameters::GetElementSortFields( array('SHOWS', 'SORT', 'TIMESTAMP_X', 'NAME', 'ID', 'ACTIVE_FROM', 'ACTIVE_TO'), array('KEY_LOWERCASE' => 'Y') ); $arAscDesc = array( "asc" => GetMessage("IBLOCK_SORT_ASC"), "desc" => GetMessage("IBLOCK_SORT_DESC"), ); $arComponentParameters = array( "PARAMETERS" => array( "IBLOCK_TYPE" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_TYPE"), "TYPE" => "LIST", "VALUES" => $arIBlockType, "REFRESH" => "Y", ), "IBLOCK_ID" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_IBLOCK"), "TYPE" => "LIST", "ADDITIONAL_VALUES" => "Y", "VALUES" => $arIBlock, "REFRESH" => "Y", ), "SECTION_ID" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_SECTION_ID"), "TYPE" => "STRING", "DEFAULT" => '={$_REQUEST["SECTION_ID"]}', ), "SECTION_CODE" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_SECTION_CODE"), "TYPE" => "STRING", "DEFAULT" => '', ), "ELEMENT_SORT_FIELD" => array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("IBLOCK_ELEMENT_SORT_FIELD"), "TYPE" => "LIST", "VALUES" => $arSort, "ADDITIONAL_VALUES" => "Y", "DEFAULT" => "sort", ), "ELEMENT_SORT_ORDER" => array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("IBLOCK_ELEMENT_SORT_ORDER"), "TYPE" => "LIST", "VALUES" => $arAscDesc, "DEFAULT" => "asc", "ADDITIONAL_VALUES" => "Y", ), "FILTER_NAME" => array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("IBLOCK_FILTER_NAME_IN"), "TYPE" => "STRING", "DEFAULT" => "arrFilter", ), "SECTION_URL" => CIBlockParameters::GetPathTemplateParam( "SECTION", "SECTION_URL", GetMessage("IBLOCK_SECTION_URL"), "", "URL_TEMPLATES" ), "DETAIL_URL" => CIBlockParameters::GetPathTemplateParam( "DETAIL", "DETAIL_URL", GetMessage("IBLOCK_DETAIL_URL"), "", "URL_TEMPLATES" ), "ADD_SECTIONS_CHAIN" => array( "PARENT" => "ADDITIONAL_SETTINGS", "NAME" => GetMessage("CP_BCS_ADD_SECTIONS_CHAIN"), "TYPE" => "CHECKBOX", "DEFAULT" => "N", ), "SET_TITLE" => array(), "SET_STATUS_404" => array( "PARENT" => "ADDITIONAL_SETTINGS", "NAME" => GetMessage("CP_BCS_SET_STATUS_404"), "TYPE" => "CHECKBOX", "DEFAULT" => "N", ), "PAGE_ELEMENT_COUNT" => array( "PARENT" => "VISUAL", "NAME" => GetMessage("IBLOCK_PAGE_ELEMENT_COUNT"), "TYPE" => "STRING", "DEFAULT" => "30", ), "PROPERTY_CODE" => array( "PARENT" => "VISUAL", "NAME" => GetMessage("IBLOCK_PROPERTY"), "TYPE" => "LIST", "MULTIPLE" => "Y", "VALUES" => $arPropertyID, "ADDITIONAL_VALUES" => "Y", ), "CACHE_TIME" => array("DEFAULT"=>36000000), "CACHE_FILTER" => array( "PARENT" => "ADDITIONAL_SETTINGS", "NAME" => GetMessage("IBLOCK_CACHE_FILTER"), "TYPE" => "CHECKBOX", "DEFAULT" => "N", ), ), ); CIBlockParameters::AddPagerSettings($arComponentParameters, GetMessage("T_IBLOCK_DESC_PAGER_CATALOG"), true, true); ?> |
3. Сам компонент (гибрид апи старого и нового ядра)
все стандартно, подготавливаем данные
<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); use Siteshouse\Asz as ASZ; global $DB; /** @global CUser $USER */ global $USER; /** @global CMain $APPLICATION */ global $APPLICATION; /** @global CCacheManager $CACHE_MANAGER */ global $CACHE_MANAGER; CPageOption::SetOptionString("main", "nav_page_in_session", "N"); //echo'<pre>';print_r($arParams);echo'</pre>'; $arParams["IBLOCK_ID"] = intval($arParams["IBLOCK_ID"]); $arParams["SECTION_ID"] = intval($arParams["SECTION_ID"]); $arParams["SECTION_CODE"] = trim($arParams["SECTION_CODE"]); //параметры постраничной навигации $arParams["DISPLAY_TOP_PAGER"] = $arParams["DISPLAY_TOP_PAGER"]=="Y"; $arParams["DISPLAY_BOTTOM_PAGER"] = $arParams["DISPLAY_BOTTOM_PAGER"]!="N"; $arParams["PAGER_TITLE"] = trim($arParams["PAGER_TITLE"]); $arParams["PAGER_SHOW_ALWAYS"] = $arParams["PAGER_SHOW_ALWAYS"]!="N"; $arParams["PAGER_TEMPLATE"] = trim($arParams["PAGER_TEMPLATE"]); $arParams["PAGER_DESC_NUMBERING"] = $arParams["PAGER_DESC_NUMBERING"]=="Y"; $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"] = intval($arParams["PAGER_DESC_NUMBERING_CACHE_TIME"]); $arParams["PAGER_SHOW_ALL"] = $arParams["PAGER_SHOW_ALL"]!=="N"; $arNavParams = array( "nPageSize" => $arParams["PAGE_ELEMENT_COUNT"], "bDescPageNumbering" => $arParams["PAGER_DESC_NUMBERING"], 'iNumPage' => is_set($_GET['PAGEN_1']) ? $_GET['PAGEN_1'] : 1, "bShowAll" => $arParams["PAGER_SHOW_ALL"], ); $arNavigation = CDBResult::GetNavParams($arNavParams); if($arNavigation["PAGEN"]==0 && $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"]>0) $arParams["CACHE_TIME"] = $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"]; //разрешенные свойства if(!is_array($arParams["PROPERTY_CODE"])) $arParams["PROPERTY_CODE"] = array(); foreach($arParams["PROPERTY_CODE"] as $k=>$v) if($v==="") unset($arParams["PROPERTY_CODE"][$k]); global $arFilterMain; $filterVar = $arFilterMain; if($this->StartResultCache(false, array($arrFilter, $arNavigation, $filterVar, $limit))){ //логика } |
if(!CModule::IncludeModule("iblock")) { $this->AbortResultCache(); ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED")); return; } if(!CModule::IncludeModule('siteshouse.asz')) { $this->AbortResultCache(); return; } |
//получаем параметры инфоблока $res = CIBlock::GetByID($arParams["IBLOCK_ID"]); $arResult["IBLOCK"] = $res->GetNext(); //$arResult["IBLOCK"]["VERSION"] - версия инфоблока |
//необходимые поля $arSelect = array("ID","IBLOCK_ID","CODE","NAME","ACTIVE","PREVIEW_TEXT","IBLOCK_SECTION_ID","DETAIL_PICTURE"); |
//получаем id свойств для выборки из настроек компонента $arSelectProp = array(); $arSelectPropId = array(); if(is_array($arParams["PROPERTY_CODE"]) && count($arParams["PROPERTY_CODE"])>0){ foreach($arParams["PROPERTY_CODE"] as $propId) { $arSelectProp[] = 'PROPERTY_'.str_replace("PROP","",$propId); $arSelectPropId[] = str_replace("PROP","",$propId); } } $arSelect = array_merge($arSelect,$arSelectProp); |
//фильтрация $arFilter = array( "IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ACTIVE"=>"Y", ); if($arParams["SECTION_ID"]>0) { $arFilter["IBLOCK_SECTION_ID"][] = $arParams["SECTION_ID"]; } elseif(strlen($arParams["SECTION_CODE"])>0) { $db_list = CIBlockSection::GetList(array(), array("IBLOCK_ID"=>$arParams["IBLOCK_ID"],"CODE"=>$arParams["SECTION_CODE"]), false, array("ID")); if($ar_result = $db_list->GetNext()) { $arParams["SECTION_ID"] = $ar_result["ID"]; } } if(is_array($filterVar)){ foreach($filterVar as $prop=>$val){ if($arResult["IBLOCK"]["VERSION"]==2){ $arFilter['PROP.'.$prop] = $val; }elseif($arResult["IBLOCK"]["VERSION"]==1){ //TODO реализовать фильтр для первой версии инфоблоков } } } //получаем список вложенных разделов $filterSection = array("IBLOCK_ID"=>$arParams["IBLOCK_ID"]); if($arParams["SECTION_ID"]){ $filterSection["SECTION_ID"]=$arParams["SECTION_ID"]; } $db_list = CIBlockSection::GetList(array(), array("IBLOCK_ID"=>$arParams["IBLOCK_ID"],"SECTION_ID"=>$arParams["SECTION_ID"]), false, array("ID")); while($ar_result = $db_list->GetNext()) { $arFilter["IBLOCK_SECTION_ID"][] = $ar_result["ID"]; } |
//собираем данные для выборки элементов $query = array(); $query['select'] = array(); //устанавливаем айдишник и тип инфоблока ASZ\PropertyValuesTable::$iblockNameIb = $arParams["IBLOCK_ID"]; if($arResult["IBLOCK"]["VERSION"]==2){ //инфоблоки 2.0 ASZ\PropertyValuesTable::$iblockTyperIb = true; }elseif($arResult["IBLOCK"]["VERSION"]==1){ //инфоблоки 1.0 ASZ\PropertyValuesTable::$iblockTyperIb = false; } //добавляем сортировку $orderPrice = true; //пока не выносим в параметры компонента if($orderPrice){ $query['order'] = array("PRICE.PRICEVAL" => "ASC"); }else{ $query['order'] = array("NAME" => "DESC"); } //добавляем поля и свойства для выборки $arFinSelect = array(); foreach($arSelect as $val){ if(strpos($val,"PROPERTY_")!==false) { $val = false; } if($val) $arFinSelect[] = $val; } //$arFinSelect[] = "PROP"; если надо выбрать значения свойств $query['select'] = array_merge($query['select'],$arFinSelect); //добавляем фильтр $query['filter'] = $arFilter; //добавляем лимиты для постранички if (isset($arNavParams['nPageTop'])) { $query['limit'] = $arNavParams['nPageTop']; } else { $query['limit'] = $arNavParams['nPageSize']; $query['offset'] = ($arNavParams['iNumPage']-1) * $arNavParams['nPageSize']; } |
//подсчет для постранички, костылим $query_chain = new \Bitrix\Main\Entity\Query(ASZ\ElementTable::getEntity()); $query_chain->setSelect(array('CNT' => array('expression' => array('COUNT(*)'), 'data_type'=>'integer'))); $query_chain->setFilter($query['filter']); $result_chain = $query_chain->exec()->fetch(); $result_chain = $result_chain["CNT"]; unset($query_chain); |
//собираем элементы $result = ASZ\ElementTable::GetList($query); unset($query); $result = new CIBlockResult($result); $result->SetUrlTemplates($arParams["DETAIL_URL"]); $result->SetSectionContext(); $arResult["ITEMS"] = array(); $arResult["ITEM_IDS"] = array(); $countProp = count($arSelectPropId); while($arItem = $result->GetNext()) { if($countProp>0){ $db_props = CIBlockElement::GetProperty($arParams["IBLOCK_ID"], $arItem["ID"], array("sort" => "asc"), Array("ID"=>$arSelectPropId)); while($ar_props = $db_props->Fetch()){ $arItem["PROP"][$ar_props["ID"]] = $ar_props; } } $arResult["ITEM_IDS"][] = $arItem["ID"]; $arButtons = CIBlock::GetPanelButtons( $arItem["IBLOCK_ID"], $arItem["ID"], 0, array("SECTION_BUTTONS"=>false, "SESSID"=>false) ); $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"]; $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"]; $arResult["ITEMS"][] = $arItem; } |
//постраничная, костылим $result->NavStart($arNavigation,false,true); $result->NavRecordCount = $result_chain; $result->NavPageSize = $arNavParams['nPageSize']; $result->bShowAll = $arNavParams['bShowAll']; $result->NavPageCount = floor($result->NavRecordCount/$result->NavPageSize) + 1; $result->NavPageNomer = $arNavParams['iNumPage']; $arResult["NAV_STRING"] = $result->GetPageNavStringEx($navComponentObject, $arParams["PAGER_TITLE"], $arParams["PAGER_TEMPLATE"], $arNavParams['bShowAll']); $arResult["NAV_CACHED_DATA"] = $navComponentObject->GetTemplateCachedData(); $arResult["NAV_RESULT"] = $result; |
//мета теги для категории $res = CIBlockSection::GetList( $arOrder = Array("SORT"=>"DESC") , $arFilter = array('IBLOCK_ID'=>$arParams["IBLOCK_ID"],'CODE'=>$arParams["SECTION_CODE"]), false, false ); while($obElement = $res->GetNextElement(false,false)) { $arItem = $obElement->GetFields(); $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arParams["IBLOCK_ID"], $arItem["ID"]); $arResult["IPROPERTY_VALUES"] = $ipropValues->getValues(); $arResult["CHAIN"]["NAME"] = $arItem["NAME"]; $arResult["CHAIN"]["URL"] = $arItem['SECTION_PAGE_URL']; } |

if(count($arResult["ITEM_IDS"])>0){ //получаем типы цен для групп текущего пользователя $arGroups = $USER->GetUserGroupArray(); if(is_array($arGroups)){ $priceTip = \Siteshouse\Asz\CurencyFunc::getPriceForGroup($arGroups,SITE_ID); }else{ $priceTip = \Siteshouse\Asz\CurencyFunc::getPriceForGroup(); } //получаем цены $arResult["PRICE"] = \Siteshouse\Asz\CurencyFunc::getPriceBase($priceTip,$arResult["ITEM_IDS"],SITE_ID); } |
$this->SetResultCacheKeys(array( "NAV_CACHED_DATA", "CHAIN", "IPROPERTY_VALUES" )); $this->IncludeComponentTemplate(); |
if($this->StartResultCache(false, array($arrFilter, $arNavigation, $filterVar, $limit))){ //логика } |
if(isset($arResult['IPROPERTY_VALUES']["SECTION_META_TITLE"]) && $arParams["SECTION_CODE"]) { //$APPLICATION->SetTitle($arResult['IPROPERTY_VALUES']["SECTION_META_TITLE"]); $APPLICATION->SetPageProperty("title", $arResult['IPROPERTY_VALUES']["SECTION_META_TITLE"]); $APPLICATION->SetPageProperty("keywords", $arResult['IPROPERTY_VALUES']["SECTION_META_KEYWORDS"]); $APPLICATION->SetPageProperty("description", $arResult['IPROPERTY_VALUES']["SECTION_META_DESCRIPTION"]); } if(isset($arResult["CHAIN"]["NAME"]) && $arParams["SECTION_CODE"]){ $APPLICATION->AddChainItem($arResult["CHAIN"]["NAME"], $arResult["CHAIN"]["URL"]); } |
Поэтому любая критика в комментариях приветствуется...
Ваша сессия истекла. Пожалуйста, попробуйте еще раз.