На нашем сайте установлен модуль [Информационные блоки (iblock)] v.15.0.7 установлен 11.03.2015
При работе с этой страницей обратил внимание на два, на мой взгляд, неприятных момента.
1. Поиск.
Форма [Фильтр] содержит поля свойств элементов.
Хочу найти элементы по значению этих свойств.
Указываю значения. Нажимаю кнопку [Найти]. Ожидаю увидеть список элементов...
Вижу: полный (!) список секций (категорй) и, где-то в хвосте списка искомых элементов. Нравится? Мне нет.
Пришлось немножко покопаться... Предлагаемое решение хорошо тем, что работает ( :) ), не сложно. Плохо тем, что правится "ядро" и есть почти 100% вероятность их потери при обновлении модуля (конечно, если разработчики не обратят на это сообщение и не сочтут его полезным).
Делаем следующее:
Находим файл /bitrix/modules/iblock/classes/general/iblocksection.php. Находим строку 2117. Все изменения касаются метода GetMixedList.
Итак...
Фрагмент кода до комментария get elements приводим к виду:
[CODE]/**
* define $arSectionFilter
*/
$arSectionFilter = array (
"IBLOCK_ID" =>$arFilter["IBLOCK_ID"],
"?NAME" =>$arFilter["NAME"],
">=ID" =>$arFilter["ID_1"],
"<=ID" =>$arFilter["ID_2"],
">=TIMESTAMP_X" =>$arFilter["TIMESTAMP_X_1"],
"<=TIMESTAMP_X" =>$arFilter["TIMESTAMP_X_2"],
"MODIFIED_BY" =>$arFilter["MODIFIED_USER_ID"]? $arFilter["MODIFIED_USER_ID"]: $arFilter["MODIFIED_BY"],
">=DATE_CREATE" =>$arFilter["DATE_CREATE_1"],
"<=DATE_CREATE" =>$arFilter["DATE_CREATE_2"],
"CREATED_BY" =>$arFilter["CREATED_USER_ID"]? $arFilter["CREATED_USER_ID"]: $arFilter["CREATED_BY"],
"CODE" =>$arFilter["CODE"],
"EXTERNAL_ID" =>$arFilter["EXTERNAL_ID"],
"ACTIVE" =>$arFilter["ACTIVE"],
"CNT_ALL" =>$arFilter["CNT_ALL"],
"ELEMENT_SUBSECTIONS" =>$arFilter["ELEMENT_SUBSECTIONS"],
);
if (isset($arFilter["CHECK_PERMISSIONS"]))
{
$arSectionFilter['CHECK_PERMISSIONS'] = $arFilter["CHECK_PERMISSIONS"];
$arSectionFilter['MIN_PERMISSION'] = (isset($arFilter['MIN_PERMISSION']) ? $arFilter['MIN_PERMISSION'] : 'R');
}
if(array_key_exists("SECTION_ID", $arFilter))
$arSectionFilter["SECTION_ID"] = $arFilter["SECTION_ID"];
/**
* define $arElementFilter
*/
$arElementFilter = array (
"IBLOCK_ID" =>$arFilter["IBLOCK_ID"],
"?NAME" =>$arFilter["NAME"],
"SECTION_ID" =>$arFilter["SECTION_ID"],
">=ID" =>$arFilter["ID_1"],
"<=ID" =>$arFilter["ID_2"],
"=ID" => $arFilter["ID"],
">=TIMESTAMP_X" =>$arFilter["TIMESTAMP_X_1"],
"<=TIMESTAMP_X" =>$arFilter["TIMESTAMP_X_2"],
"CODE" =>$arFilter["CODE"],
"EXTERNAL_ID" =>$arFilter["EXTERNAL_ID"],
"MODIFIED_USER_ID" =>$arFilter["MODIFIED_USER_ID"],
"MODIFIED_BY" =>$arFilter["MODIFIED_BY"],
">=DATE_CREATE" =>$arFilter["DATE_CREATE_1"],
"<=DATE_CREATE" =>$arFilter["DATE_CREATE_2"],
"CREATED_BY" =>$arFilter["CREATED_BY"],
"CREATED_USER_ID" =>$arFilter["CREATED_USER_ID"],
">=DATE_ACTIVE_FROM" =>$arFilter["DATE_ACTIVE_FROM_1"],
"<=DATE_ACTIVE_FROM" =>$arFilter["DATE_ACTIVE_FROM_2"],
">=DATE_ACTIVE_TO" =>$arFilter["DATE_ACTIVE_TO_1"],
"<=DATE_ACTIVE_TO" =>$arFilter["DATE_ACTIVE_TO_2"],
"ACTIVE" =>$arFilter["ACTIVE"],
"?SEARCHABLE_CONTENT" =>$arFilter["DESCRIPTION"],
"?TAGS" =>$arFilter["?TAGS"],
"WF_STATUS" =>$arFilter["WF_STATUS"],
"SHOW_NEW" => ($arFilter["SHOW_NEW"] !== "N"? "Y": "N"),
"SHOW_BP_NEW" => $arFilter["SHOW_BP_NEW"]
);
if (isset($arFilter["CHECK_PERMISSIONS"]))
{
$arElementFilter['CHECK_PERMISSIONS'] = $arFilter["CHECK_PERMISSIONS"];
$arElementFilter['MIN_PERMISSION'] = (isset($arFilter['MIN_PERMISSION']) ? $arFilter['MIN_PERMISSION'] : 'R');
}
foreach($arFilter as $key=>$value)
{
$op = CIBlock::MkOperationFilter($key);
$newkey = strtoupper($op["FIELD"]);
if(
substr($newkey, 0, 9) == "PROPERTY_"
|| substr($newkey, 0, 8) == "CATALOG_"
)
{
$arElementFilter[$key] = $value;
}
}
if(strlen($arFilter["SECTION_ID"])<= 0)
unset($arElementFilter["SECTION_ID"]);
if(!is_array($arSelectedFields))
$arSelectedFields = Array("*");
if(isset($arFilter["CHECK_BP_PERMISSIONS"]))
$arElementFilter["CHECK_BP_PERMISSIONS"] = $arFilter["CHECK_BP_PERMISSIONS"];
$arFilterDiff = array_diff_key($arElementFilter,$arSectionFilter);
unset($arFilterDiff["SHOW_NEW"]);
unset($arFilterDiff["SHOW_BP_NEW"]);
$strFilterDiff = implode($arFilterDiff);
/**
* get sections
*/
if (empty($strFilterDiff)) {
$obSection = new CIBlockSection;
$rsSection = $obSection->GetList($arOrder, $arSectionFilter, $bIncCnt);
while($arSection = $rsSection->Fetch())
{
$arSection["TYPE"]="S";
$arResult[]=$arSection;
}
}
[/CODE]Что изменилось? Блок get sections перемещен "вниз", после блоков define $arSectionFilter и define $arElementFilter, и добавлена проверка условия empty($strFilterDiff). Если условие не выполняется список секций не формируется. В блоке define $arElementFilter в конце добавлен фрагмент:[CODE] $arFilterDiff = array_diff_key($arElementFilter,$arSectionFilter);
unset($arFilterDiff["SHOW_NEW"]);
unset($arFilterDiff["SHOW_BP_NEW"]);
$strFilterDiff = implode($arFilterDiff)[/CODE]Собственно все.
Повторяем эксперимент:
Форма [Фильтр] содержит поля свойств элементов.
Хочу найти элементы по значению этих свойств.
Указываю значения. Нажимаю кнопку [Найти]. Ожидаю увидеть список элементов... И вижу его! :)
2. Отмена
Форма [Фильтр].
Искал, искал, надоело, нажал кнопку [Очистить].
Ожидаю увидеть полный список секций и элементов... Вижу список секций верхнего уровня.
Ну здесь все просто (не буду описывать подробно). Достоинства и недостатки решения те-же, что и для случая 1.
Находим файл /bitrix/modules/iblock/admin/iblock_list_admin.php.
Меняем строку 325:[CODE]if(IntVal($find_section_section)<0 || strlen($find_section_section)<=0)[/CODE]на:[CODE]if(IntVal($find_section_section)<0 || strlen($find_section_section)<=0 || (isset($_REQUEST["del_filter"]) && $_REQUEST["del_filter"] = "Y")[/CODE]собственно и все.