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) ну кому надо тот изменит под себя
МНОЖЕСТВЕННЫЙ ВЫБОР
![](http://content.screencast.com/users/Hotbox/folders/Jing/media/1afefa51-03c3-4edc-b6d9-9a01060ee4a6/2013-09-07_0042.png)
Списки выбора
![](http://content.screencast.com/users/Hotbox/folders/Jing/media/de3b902e-6b9c-4bbe-89d8-d88085766ed5/2013-09-07_0044.png)
Если кому пригодится буду рад!
Всем известная функция 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) ну кому надо тот изменит под себя
МНОЖЕСТВЕННЫЙ ВЫБОР
![](http://content.screencast.com/users/Hotbox/folders/Jing/media/1afefa51-03c3-4edc-b6d9-9a01060ee4a6/2013-09-07_0042.png)
Списки выбора
![](http://content.screencast.com/users/Hotbox/folders/Jing/media/de3b902e-6b9c-4bbe-89d8-d88085766ed5/2013-09-07_0044.png)
Если кому пригодится буду рад!
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; } |