Всем привет.
Все знают уже обычный тип свойства ИБ - привязка к элементам в виде списка. Но у него, как и у всех подобных свойств, есть один огромный минус в плане производительности - чтобы на странице показа выдернуть имя, надо делать лишний запрос. Я же пошел другим путем.
[spoiler]
А именно, я подумал, а почему бы не дергать имя заранее и не хранить дернутое имя в поле "Описание" каждого свойства. Первый вариант что приходит вроде бы на ум - сделать обработчик. Но... лень. И решил прибегнуть к стандартным средствам.
Сразу оговорюсь, что данный тип свойства врядли будет полезен "компонентщикам". Данный тип предназначен скорее для самописных компонент, чтобы избежать лишних запросов.
Знающие люди уже поняли к чему я клоню. Приведу собственно код, нагло скомунизженный со стандартного типа свойств"Привязка к элементам в виде списка" и дописанный парой строк.
Обращу внимание на один момент:
В стандартном типе свойств ACTIVE идет закоменчен, в связи с чем в данном списке вываливались все элементы, а не только активные.
Для наглядности привожу картинку:
Данный способ для самопальщиков позволит сократить приличное количество запросов. Ведь зачастую со связки нам надо дернуть только NAME.
Все знают уже обычный тип свойства ИБ - привязка к элементам в виде списка. Но у него, как и у всех подобных свойств, есть один огромный минус в плане производительности - чтобы на странице показа выдернуть имя, надо делать лишний запрос. Я же пошел другим путем.
[spoiler]
А именно, я подумал, а почему бы не дергать имя заранее и не хранить дернутое имя в поле "Описание" каждого свойства. Первый вариант что приходит вроде бы на ум - сделать обработчик. Но... лень. И решил прибегнуть к стандартным средствам.
Сразу оговорюсь, что данный тип свойства врядли будет полезен "компонентщикам". Данный тип предназначен скорее для самописных компонент, чтобы избежать лишних запросов.
Знающие люди уже поняли к чему я клоню. Приведу собственно код, нагло скомунизженный со стандартного типа свойств"Привязка к элементам в виде списка" и дописанный парой строк.
<? class CIBlockPropertyElementListPlus { function GetUserTypeDescription() { return array( "PROPERTY_TYPE" => "E", "USER_TYPE" => "EListPlus", "DESCRIPTION" => "Привязка к элементам в виде списка (расширенное)", "GetPropertyFieldHtml" =>array("CIBlockPropertyElementListPlus","GetPropertyFieldHtml"), ); } function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { static $cache = array(); $IBLOCK_ID = $arProperty["LINK_IBLOCK_ID"]; if (!array_key_exists($IBLOCK_ID, $cache)) { $arSelect = array( "ID", "NAME", ); $arFilter = array ( "IBLOCK_ID"=> $arProperty["LINK_IBLOCK_ID"], "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y", ); $arOrder = array( "NAME" => "ASC", "ID" => "ASC", ); $cache[$IBLOCK_ID] = array(); $rsItems = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect); while($arItem = $rsItems->GetNext()) $cache[$IBLOCK_ID][] = $arItem; } $varName = str_replace("VALUE", "DESCRIPTION", $strHTMLControlName["VALUE"]); $html = '<select name="'.$strHTMLControlName["VALUE"].'" onchange="document.getElementById(\'DESCR_'.$varName.'\').value=this.options[this.selectedIndex].text"> <option value=""> </option>'; foreach ($cache[$IBLOCK_ID] as $arItem) { $html .= '<option value="'.$arItem["ID"].'"'; if($value["VALUE"] == $arItem["~ID"]) $html .= ' selected'; $html .= '>'.$arItem["NAME"].'</option>'; } $html .= '</select>'; $html .= ' '; $html .= '<input type="text" id="DESCR_'.$varName.'" name="'.$varName.'" value="'.$value["DESCRIPTION"].'" />'; return $html; } } AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockPropertyElementListPlus", "GetUserTypeDescription")); ?> |
Обращу внимание на один момент:
$arFilter = array ( "IBLOCK_ID"=> $arProperty["LINK_IBLOCK_ID"], "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y", ); |
В стандартном типе свойств ACTIVE идет закоменчен, в связи с чем в данном списке вываливались все элементы, а не только активные.
Для наглядности привожу картинку:
Данный способ для самопальщиков позволит сократить приличное количество запросов. Ведь зачастую со связки нам надо дернуть только NAME.