FAQ

FTP/SSH (0)

Работа с модулем инфоблоков

  • Как создать меню, выбираемое из инфоблоков?
  • Как выбрать все элементы подгрупп инфоблоков, принадлежащих какой-либо группе?
  • Как выбрать подгруппы всех уровней инфоблоков, принадлежащие какой-либо группе?
  • Как создать и подключить собственные шаблоны для модификации элементов инфоблоков?
  • Как установить через АПИ значение свойства типа строка и text/html элемента инфоблока?
  • Как получить значения списка пользовательских полей?
  • Как работать со значениями пользовательских полей через АПИ?

  • Как создать меню, выбираемое из инфоблоков?
    Вот пример подобного решения:
      
    <?
    // Вызов меню типа "left"
    echo $APPLICATION->GetMenuHtml("left", true);

    // true - флаг необходимости использования дополнительных файлов меню вида
    //.left.menu_ext.php (позволяет манипулировать меню - выбирать его из базы,
    //включать массивы меню из других файлов и т.д.)

    // пример меню типа "left" (.left.menu_ext.php):
    Как дополнить "обычное" меню пунктами, выбранными с использованием информационных блоков?

    Ответ

    Вот пример подобного решения:

       
    <?
    // Вызов меню типа "left"
    echo $APPLICATION->GetMenuHtml("left", true);

    // true - флаг необходимости использования дополнительных файлов меню вида
    //.left.menu_ext.php (позволяет манипулировать меню - выбирать его из базы,
    //включать массивы меню из других файлов и т.д.)

    // пример меню типа "left" (.left.menu_ext.php):

    <?
       include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
       include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/public_tools.php");
       $arrPath = pathinfo($_SERVER["REQUEST_URI"]);

       $rsIblock = GetIBlockList("iblocktypename", Array("iblockcode"));
       $arIblock = $rsIblock->Fetch();
       $rsSection = GetIBlockSectionList($arIblock["ID"], false, Array("SORT"=>"DESC", "NAME" => "DESC", "ID"=>"DESC"));
       $aMenuLinksNew = array();
       while ($arSection = $rsSection->Fetch())
       {
          $SECTION_URL = "/dirname/".$arSection["CODE"].".php";
          $arrAddLinks = array();

          $aMenuLinksNew[] = array(
             $arSection["NAME"],
             $SECTION_URL,
             $arrAddLinks);
       }

       $aMenuLinks = array_merge($aMenuLinksNew, $aMenuLinks);

    // Это меню будет дополнять уже созданное файлом left.menu_template.php template.
    ?>



    Как выбрать все элементы подгрупп инфоблоков, принадлежащих какой-либо группе?
    Да, можно.
    Для этого добавьте в массив фильтра ключ

    "INCLUDE_SUBSECTIONS"=>"Y"
    Есть группа G1, которая содержит подгруппы SG1, SG2, SG3.
    Каждая из подгрупп содержит элементы.

    Можно ли сразу выбрать все элементы, задав в фильтре группу G1?

    Ответ

    Да, можно.
    Для этого добавьте в массив фильтра ключ

       
    "INCLUDE_SUBSECTIONS"=>"Y"

    Например:

       
    $items = GetIBlockElementListEx("news", Array(), Array(), Array("ACTIVE_FROM"=>"DESC", "SORT"=>"ASC", "NAME"=>"DESC"), 10, Array("SECTION_ID"=><id группы G1>, "INCLUDE_SUBSECTIONS"=>"Y"));



    Как выбрать подгруппы всех уровней инфоблоков, принадлежащие какой-либо группе?
    Да, можно.
    Для этого используйте в фильтре свойства LEFT_MARGIN и RIGHT_MARGIN, не задавая ID родительской группы
    Есть группа G1, которая содержит подгруппы SG1, SG2, SG3.
    Каждая из подгрупп содержит, в свою очередь подгруппы: SG11, SG12, SG21, SG32, и т.д.

    Можно ли сразу выбрать все подгруппы, задав в фильтре группу G1?
    Ответ

    Да, можно.
    Для этого используйте в фильтре свойства LEFT_MARGIN и RIGHT_MARGIN, не задавая ID родительской группы:

       
    $sections = GetIBlockSectionList(<id инфоблока группы G1>, false, Array(), false, Array("LEFT_MARGIN"=><значение свойства LEFT_MARGIN группы G1>, "RIGHT_MARGIN"=><значение свойства RIGHT_MARGIN группы G1>));



    Как создать и подключить собственные шаблоны для модификации элементов инфоблоков?
    Собственные файл для модификации полей перед сохранением и файл формы для редактирования можно подключить для конкретного типа инфоблока в настройках типа информационных блоков.

    В файле, который вы определяете, как файл для обработки данных формы перед сохранением, вы можете выполнять, если это необходимо, любые операции над данными формы, которые затем будут переданы на дальнейшую стандартную обработку.
    Собственные файл для модификации полей перед сохранением и файл формы для редактирования можно подключить для конкретного типа инфоблока в настройках типа информационных блоков.

    В файле, который вы определяете, как файл для обработки данных формы перед сохранением, вы можете выполнять, если это необходимо, любые операции над данными формы, которые затем будут переданы на дальнейшую стандартную обработку.

    Примеры файлов и описание их настройки приведены в документации: http://www.bitrixsoft.ru/help/source/iblock/help/ru/developer/custom.php.html

    Дополнение: В обновлении 7.0.8 модуля "Информационные блоки" выпущена функциональность, позволяющая устанавливать признак обязательности для полей и свойств инфоблока, значения полей по умолчанию, а также реализована возможность масштабирования картинки для анонса и картинки для детального описания.
    Это позволит в ряде случаев отказаться от использования собственных шаблонов. См. вкладку "Поля" в форме редактирования настроек инфоблока и форму редактирования настроек каждого из свойств.

    Как установить через АПИ значение свойства типа строка и text/html элемента инфоблока?
    Если в настройках информационного блока тип свойства установлен "строка", тогда код выглядит так    
    $value="text";
    CIBlockElement::SetPropertyValueCode("IE ", "code", $value);
    Если в настройках информационного блока тип свойства установлен "строка", тогда код выглядит так    
    $value="text";
    CIBlockElement::SetPropertyValueCode("IE ", "code", $value);
    Если в настройках информационного блока тип свойства установлен "HTML/text" используйте код вида    
    $value="text";
    CIBlockElement::SetPropertyValueCode("IE ", "code", array("VALUE"=>array("TEXT"=>$value, "TYPE"=>"html")));


    Как получить значения списка пользовательских полей?
    Можете использовать следующий код в качестве примера:
       
    $arFields = $USER_FIELD_MANAGER->GetUserFields("IBLOCK_33_SECTION");
    $obEnum = new CUserFieldEnum;
    $rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID" => $arFields["UF_MY_LIST"]["ID"]));
    while($arEnum = $rsEnum->GetNext())
    {
    }
    Я использовал пользовательские поля типа список для разделов. Но при выборке, получил только массив id значений списка.

    Ответ

        Можете использовать следующий код в качестве примера:

       
    $arFields = $USER_FIELD_MANAGER->GetUserFields("IBLOCK_33_SECTION");
    $obEnum = new CUserFieldEnum;
    $rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID" => $arFields["UF_MY_LIST"]["ID"]));
    while($arEnum = $rsEnum->GetNext())
    {
    }

    Для получения строкового значения пользовательского свойства типа "список" используйте следующий код:
       
    $rsEnum = CUserFieldEnum::GetList(array(), array("ID" =>$ENUM_ID)); // $ENUM_ID - возвращаемый ID значения
    $arEnum = $rsEnum->GetNext();
    echo $arEnum["VALUE"];

    Чтобы не использовать API классов пользовательских полей для получения значений, Вы можете поступить проще, используя компонент bitrix:system.field.view:
       
    $arUserFields = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("IBLOCK_30_SECTION", 144, LANGUAGE_ID);        
    foreach ($arUserFields as $FIELD_NAME => $arUserField):

        $APPLICATION->IncludeComponent(
            "bitrix:system.field.view",
            $arUserField["USER_TYPE"]["USER_TYPE_ID"],
            array("arUserField" => $arUserField), null, array("HIDE_ICONS"=>"Y"));

    endforeach;

    где IBLOCK_30_SECTION - объект (группа инфоблока 30)
    144 - ID группы



    Как работать со значениями пользовательских полей через АПИ?
    Для объекта IBLOCK_<IBLOCK_ID>_SECTION
    в Update() и Add() значения пользовательских полей передаются так же, как и "обычных" полей, например:
       
    "UF_TEXT_1"=>"xxx"

    в CIBlockSection::GetList() для получения значений полей используйте четвертый, пока недокументированный параметр arSelect, в котором передавайте коды необходимых к выборке ПП в следующем виде:
       
    $arSelect = array("UF_TEXT_1", ...);
    Ответ

        Для объекта IBLOCK_<IBLOCK_ID>_SECTION
    в Update() и Add() значения пользовательских полей передаются так же, как и "обычных" полей, например:
       
    "UF_TEXT_1"=>"xxx"

    в CIBlockSection::GetList() для получения значений полей используйте четвертый, пока недокументированный параметр arSelect, в котором передавайте коды необходимых к выборке ПП в следующем виде:
       
    $arSelect = array("UF_TEXT_1", ...);

    или
       
    $arSelect = array("UF_*");

    для выборки всех полей.
    Фильтрация - так же, как и по "обычным" полям.
    Один важный момент: в случае работы с ПП групп инфоблока обязательно в фильтре для CIBlockSection::GetList() указывайте IBLOCK_ID.

        Для объекта USER:
    в Update() и Add() значения пользовательских полей передаются так же, как и "обычных" полей, например:
       
    "UF_TEXT_1"=>"xxx"

    в CUser::GetList() для получения значений полей используйте четвертый, пока недокументированный параметр arParams, в котором передавайте коды необходимых к выборке ПП в следующем виде:
       
    $arParams["SELECT"] = array("UF_TEXT_1", ...);

    или
       
    $arParams["SELECT"] = array("UF_*");

    для выборки всех полей.
    Фильтрация - так же, как и по "обычным" полям.