GetIBlockDropDownList Но с выбором разделов!
Всем известная функция GetIBlockDropDownList ну или GetIBlockDropDownListEx выводящая списки выбора инфоблока
Тут задался вопросом что надо вывести тип-инфоблок -разделы выбранного инфоблока
искал готовое - что-то не нашел (может плохо искал) решил написать по образу и подобию вышенаписанных функций
вот что получилось:
получилось 2 функции (
GetSectionList - основная функция
getSectionPath - возвращающая путь до раздела (вспомогательная)
Если такое уже есть в битриксе то подскажите чтобы велосипеды не плодить - если нет - то хотелось бы чтобы была такая функция - полезно для некоторого функционала
Ну по порядку:
ВЫЗОВ
echo GetSectionList(array(3,4,5,6,23), 'IBLOCK_TYPE_ID', 'IBLOCK_ID','SECTION_ID',array('CHECK_PERMISSIONS' => 'Y','MIN_PERMISSION' => 'W'),
"","","",'','','',true,10);
Большинство параметров аналогичны параметрам GetIBlockDropDownListно есть изменения
1. т.к. конечный результат это РАЗДЕЛЫ - то на ВХОД (что может быть уже выбрано) подается либо Массив выбранных разделов (ID раздела) либо просто ID раздела
2. Задается параметр $multiple (по умолчанию = false)
Если данный параметр true то будет множественный выбор и соответственно все 3 (тип,ИБ,раздел) все будет во множественном выборе
3. Задается размер $size ( по умолчанию=5) ну кому надо тот изменит под себя
МНОЖЕСТВЕННЫЙ ВЫБОР
Списки выбора
Если кому пригодится буду рад!
Всем известная функция GetIBlockDropDownList ну или GetIBlockDropDownListEx выводящая списки выбора инфоблока
Тут задался вопросом что надо вывести тип-инфоблок -разделы выбранного инфоблока
искал готовое - что-то не нашел (может плохо искал) решил написать по образу и подобию вышенаписанных функций
вот что получилось:
получилось 2 функции (
GetSectionList - основная функция
getSectionPath - возвращающая путь до раздела (вспомогательная)
Если такое уже есть в битриксе то подскажите чтобы велосипеды не плодить - если нет - то хотелось бы чтобы была такая функция - полезно для некоторого функционала
Ну по порядку:
ВЫЗОВ
echo GetSectionList(array(3,4,5,6,23), 'IBLOCK_TYPE_ID', 'IBLOCK_ID','SECTION_ID',array('CHECK_PERMISSIONS' => 'Y','MIN_PERMISSION' => 'W'),
"","","",'','','',true,10);
Большинство параметров аналогичны параметрам GetIBlockDropDownListно есть изменения
1. т.к. конечный результат это РАЗДЕЛЫ - то на ВХОД (что может быть уже выбрано) подается либо Массив выбранных разделов (ID раздела) либо просто ID раздела
2. Задается параметр $multiple (по умолчанию = false)
Если данный параметр true то будет множественный выбор и соответственно все 3 (тип,ИБ,раздел) все будет во множественном выборе
3. Задается размер $size ( по умолчанию=5) ну кому надо тот изменит под себя
МНОЖЕСТВЕННЫЙ ВЫБОР
Списки выбора
Если кому пригодится буду рад!
function getSectionPath($id){ $pathAr = array(); $nav = CIBlockSection::GetNavChain(false, $id); $path = ""; while($arNav = $nav->GetNext()){ $path .= " / ".$arNav["NAME"]; } return $path; } function GetSectionList($SECTION_ID, $strTypeName, $strIBlockName,$strSectionName, $arFilter = false, $onChangeType = '', $onChangeIBlock = '', $onChangeSection='',$strAddType = '', $strAddIBlock = '',$strAddSection='',$multiple=false,$size="5") { $html = ''; static $arTypesAll = array(); static $arTypes = array(); static $arIBlocks = array(); static $arSections = array(); if($multiple) { $mltp="multiple"; $ml="[]"; } else { $mltp="";$ml="";$size=1; } if(!is_array($arFilter)) $arFilter = array(); if (!array_key_exists('MIN_PERMISSION',$arFilter) || trim($arFilter['MIN_PERMISSION']) == '') $arFilter["MIN_PERMISSION"] = "W"; $filterId = md5(serialize($arFilter)); if(!isset($arTypes[$filterId])) { $arTypes[$filterId] = array(0 => "Выберите тип"); $arIBlocks[$filterId] = array(0 => array(''=>"Выберите инфоблок")); $arSections[$filterId] = array(0 => array(''=>"Выберите раздел")); $rsIBlocks = CIBlock::GetList(array("IBLOCK_TYPE" => "ASC", "NAME" => "ASC"), $arFilter); while($arIBlock = $rsIBlocks->Fetch()) { $tmpIBLOCK_TYPE_ID = $arIBlock["IBLOCK_TYPE_ID"]; if(!array_key_exists($tmpIBLOCK_TYPE_ID, $arTypesAll)) { $arType = CIBlockType::GetByIDLang($tmpIBLOCK_TYPE_ID, LANG); $arTypesAll[$arType["~ID"]] = $arType["~NAME"]." [".$arType["~ID"]."]"; } if(!array_key_exists($tmpIBLOCK_TYPE_ID, $arTypes[$filterId])) { $arTypes[$filterId][$tmpIBLOCK_TYPE_ID] = $arTypesAll[$tmpIBLOCK_TYPE_ID]; } $arIBlocks[$filterId][$tmpIBLOCK_TYPE_ID][$arIBlock["ID"]] = $arTypesAll[$tmpIBLOCK_TYPE_ID].":".$arIBlock["NAME"]." [".$arIBlock["ID"]."]"; $arFilter = Array('IBLOCK_ID'=>$arIBlock["ID"], 'GLOBAL_ACTIVE'=>'Y', 'INCLUDE_SUBSECTIONS'=>'Y'); $db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true); while($ar_result = $db_list->GetNext()) { $arSections[$filterId][$arIBlock["ID"]][$ar_result['ID']]=$arIBlocks[$filterId][$tmpIBLOCK_TYPE_ID][$arIBlock["ID"]].getSectionPath($ar_result['ID']); } } } $html .= ' <script> function OnType_'.$filterId.'_Changed(typeSelect, iblockSelectID) { var arIblocs = '.CUtil::PhpToJSObject($arIBlocks[$filterId]).'; var iblockSelect = BX(iblockSelectID); if(iblockSelect) { var sel=getSelectedIndexes(typeSelect); for(var i=iblockSelect.length-1; i >= 0; i--) iblockSelect.remove(i); for(var k=sel.length-1;k>=0;k--) { for(var j in arIblocs[sel[k]]) { var newOption = new Option(arIblocs[sel[k]][j], j, false, false); iblockSelect.options.add(newOption); } } } } function OnIBlock_'.$filterId.'_Changed(iblockSelect, sectionSelectID) { var arSections = '.CUtil::PhpToJSObject($arSections[$filterId]).'; var SectionSelect = BX(sectionSelectID); if(SectionSelect) { var sel=getSelectedIndexes(iblockSelect); for(var i=SectionSelect.length-1; i >= 0; i--) SectionSelect.remove(i); for(var k=sel.length-1;k>=0;k--) { for(var j in arSections[sel[k]]) { var newOption = new Option(arSections[sel[k]][j], j, false, false); SectionSelect.options.add(newOption); } } } } function getSelectedIndexes (oListbox) { var arrIndexes = new Array; for (var i=0; i < oListbox.options.length; i++) { if (oListbox.options[i].selected) arrIndexes.push(oListbox.options[i].value); } return arrIndexes; }; </script> '; $IBLOCK_TYPE = false; $IBLOCK = false; if(is_array($SECTION_ID) && count($SECTION_ID)>0) { foreach($SECTION_ID as $section) { foreach($arSections[$filterId] as $iblock_id => $sections) { if(array_key_exists($section, $sections)) { $IBLOCK_ID[] = $iblock_id; } } } $IBLOCK_ID=array_unique($IBLOCK_ID); foreach($IBLOCK_ID as $iblock) { foreach($arIBlocks[$filterId] as $iblock_type_id => $iblocks) { if(array_key_exists($iblock, $iblocks)) { $IBLOCK_TYPE[] = $iblock_type_id; } } } $IBLOCK_TYPE=array_unique($IBLOCK_TYPE); } else { if($SECTION_ID > 0) { foreach($arSections[$filterId] as $iblock_id => $sections) { if(array_key_exists($SECTION_ID, $sections)) { $IBLOCK_ID = $iblock_id; break; } } foreach($arIBlocks[$filterId] as $iblock_type_id => $iblocks) { if(array_key_exists($IBLOCK_ID, $iblocks)) { $IBLOCK_TYPE = $iblock_type_id; break; } } } } $htmlTypeName = htmlspecialcharsbx($strTypeName); $htmlIBlockName = htmlspecialcharsbx($strIBlockName); $htmlSectionName = htmlspecialcharsbx($strSectionName); $onChangeType = 'OnType_'.$filterId.'_Changed(this, \''.CUtil::JSEscape($strIBlockName).'\');'.$onChangeType.';'; $onChangeIBlock = 'OnIBlock_'.$filterId.'_Changed(this, \''.CUtil::JSEscape($strSectionName).'\');'.$onChangeIBlock.';'; $html .= '<select '.$mltp.' size="'.$size.'" name="'.$htmlTypeName.$ml.'" id="'.$htmlTypeName.'" onchange="'.htmlspecialcharsbx($onChangeType).'" '.$strAddType.'>'."\n"; foreach($arTypes[$filterId] as $key => $value) { if($IBLOCK_TYPE === false) $IBLOCK_TYPE = $key; elseif(is_array($IBLOCK_TYPE)) { $html .= '<option value="'.htmlspecialcharsbx($key).'"'.(in_array($key,$IBLOCK_TYPE) ? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } else $html .= '<option value="'.htmlspecialcharsbx($key).'"'.($IBLOCK_TYPE===$key? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } $html .= "</select>\n"; $html .= " \n"; $html .= '<select '.$mltp.' size="'.$size.'" name="'.$htmlIBlockName.$ml.'" id="'.$htmlIBlockName.'" onchange="'.htmlspecialcharsbx($onChangeIBlock).'" '.$strAddIBlock.'>'."\n"; if(is_array($IBLOCK_TYPE)) { foreach($IBLOCK_TYPE as $iblock_type) { foreach($arIBlocks[$filterId][$iblock_type] as $key => $value) { $html .= '<option value="'.htmlspecialcharsbx($key).'"'.(in_array($key,$IBLOCK_ID) ? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } } } else foreach($arIBlocks[$filterId][$IBLOCK_TYPE] as $key => $value) { $html .= '<option value="'.htmlspecialcharsbx($key).'"'.($IBLOCK_ID==$key? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } $html .= "</select>\n"; $html .=" \n"; $html .= '<select '.$mltp.' size="'.$size.'" name="'.$htmlSectionName.$ml.'" id="'.$htmlSectionName.'"'.($onChangeSection != ''? ' onchange="'.htmlspecialcharsbx($onChangeSection).'"': '').' '.$strAddSection.'>'."\n"; if(is_array($IBLOCK_ID)) { foreach($IBLOCK_ID as $iblock) { foreach($arSections[$filterId][$iblock] as $key => $value) { $html .= '<option value="'.htmlspecialcharsbx($key).'"'.(in_array($key,$SECTION_ID) ? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } } } else foreach($arSections[$filterId][$IBLOCK_ID] as $key => $value) { $html .= '<option value="'.htmlspecialcharsbx($key).'"'.($SECTION_ID==$key? ' selected': '').'>'.htmlspecialcharsEx($value).'</option>'."\n"; } $html .= "</select>\n"; return $html; } |