1С-Битрикс Разработчикам — Использование гаджетов в админке.

1С-Битрикс Разработчикам - Использование гаджетов в админке. Гаджет

Что такое гаджет в понимании 1с-битрикс?

Продолжаю публиковать рецепты разработки «кирпичиков» Битрикс. Сегодня я хотел бы остановиться на разработке гаджета.Эта программная структура в Битрикс введена сравнительно недавно, но сразу же ей заинтересовались как разработчики, так и заказчики разработки сайтов на Битрикс.

Начиная с 8-й версии 1С-Битрикс в дистрибутив включен компонент Рабочий стол (bitrix:desktop). При помещении его на страницу публичной области сайта он выглядит таким образом:Мы можем выбирать гаджеты для отображения на рабочем столе, перетаскивать их и убирать, если они более не нужны.Наша задача на сегодня сделать простейший гаджет, который бы отображал текущее дату и время.

1с-битрикс разработчикам — использование гаджетов в админке.

Как-то на семинаре для партнёров услышал вопрос к Сергею Рыжикову из разряда «а когда можно будет использовать компоненты 2.0 в админке сайта». И действительно, это было бы удобнее и привычнее для разработчиков и т.д. Сергей ответил, что «рассматривается такой вариант» и на этом вопрос вроде как закончился. Хотя откуда возник такой вопрос у разработчика и почему Сергей ему не возразил, мне так и не стало понятно. А теперь по сути темы.

Мне достаточно часто приходится создавать страницы для админки и, честно говоря, не видел проблем с подключением самого компонента на странице. Другой вопрос, что это не совсем безопасно, так как функционал компонента другой разработчик может задействовать на публичной части сайта. Да и шаблон компонента надо будет копировать из инстала в папочку с компонентами (при установке модуля, например). Приходилось делать шаблон «.admin», чтобы все понимали, что это шаблон административного раздела. Хорошим тоном у нас считается проверить константу ADMIN_SECTION, чтобы точно знать, что компонент (шаблон) запущен в админке. И не забывать, что константа SITE_ID содержит совсем другой смысловой характер в административном разделе.

Самым большим неудобством в таком «нестандартном» использовании компонентов — постоянное ощущение неуверенности, что кто-либо из разработчиков не задействует случайно его (компонент) в публичке. Вот и получалось, что один компонент с шаблоном «.admin» использовался только раз и только на одной странице. А страниц таких уже с десяток и компоненты эти вперемешку с остальными. В общем некрасиво, «не по книжке» это как-то.

Совсем другой вопрос с гаджетами, которые все почему-то забыли и оставили как бесполезную фичу от разработчиков БУС-а. В принципе, если честно, и сами гаджеты — это не что иное, как вывод компонента bitrix:desktop внутри админки или в соцсетях. Документации по ним не было, на форуме редко кто отвечает. Кое-какое описание есть про сам рабочий стол, но оно для версии 8.5, а уже 12.0.6 во всю крутится. Что же это за зверь такой и как он выглядит с точки зрения разработчика, мало кто знает.

Вот я и решил чуток подразобраться и попробовать использовать этот механизм вместо привычных компонент.

Гаджеты как механизм управления вывода данными.
Да-да, я не описался, именно механизм. Полноценный механизм, который позволяет задавать параметры вывода информации и пользовательские параметры раздельно. Этот механизм  позволяет задавать разработчику параметры гаджета и отдельно предоставить набор свойств, которые пользователь выберет для себя сам.

Концепция, предложенная разработчиками БУС-а, достаточно проста. Всё тот же контейнер в виде папки в разделе /bitrix/gadgets/_namespace_/, где _namespace_ — ваша коллекция гаджетов. Всё те же файлы .parameters.php и .description.php. При чём они очень напоминают аналогичные файлы в компонентах 2.0 с небольшими дополнениями и нюансами.

Файл index.php выполняет роль скрипта вывода данных (в гаджетах нету раздельных шаблонов вывода и соответственно файлов template.php, result_modifier.php, component_epilog.php). Предполагается, что данных будет немного и весь файл займёт 500-1000 строк, поэтому можно встретить гаджеты в стандартной поставке, которые собирают данные, кэшируют их и тут же выводят. Как, например, гаджет admin_products (/bitrix/gadgets/bitrix/admin_products/).

Гаджет:  ▷ Купить корпуса ATX с E-Katalog - цены интернет-магазинов России на корпуса ATX - в Москве, Санкт-Петербурге

Файл .parameters.php — параметры гаджета.
Параметры в гаджете — самый важный и интересный для разработчика набор данных. Он, в последствии, снимет кучу головной боли от просьб пользователей что-то показать, убрать, подсветить, поднастроить…..

Содержание файла не сильно отличается от аналогичного файла в компонентах, вряд ли что названия переменных другие. В файле должен быть определён массив всех параметров в переменной $arParameters. Доступны текущие параметры, если заданы, в переменной $arAllCurrentValues.

Структура массива:

$arParameters = Array(
«PARAMETERS»=> Array(
«PARAMETER» => array(
«NAME» => «PARAMETER»,          //GetMessage(«LANG_PARAMETER»),
«TYPE» => «LIST»,               // LIST, STRING, CHECKBOX
«VALUES» => array(«V1», «V2»),  // array, only for type LIST
«DEFAULT» => array(«V1»),       // string, array
«MULTIPLE» => «Y»,              // N, Y
«COLS» => 25,                   //numeric
«ADDITIONAL_VALUES» => «N»,     // N, Y
«REFRESH» => «Y»,               // N, Y
«HIDDEN» => «N»,                // N, Y
),
),
«USER_PARAMETERS»=> Array(
«USER_PARAMETER» => Array(
«NAME» => «USER_PARAMETER»,     //GetMessage(«LANG_USER_PARAMETER»),
«TYPE» => «LIST»,               // LIST, STRING, CHECKBOX
«VALUES» => array(«V1», «V2»),  // array, only for type LIST
«DEFAULT» => array(«V1»),       // string, array
«MULTIPLE» => «Y»,              // N, Y
«COLS» => 25,                   //numeric
«ADDITIONAL_VALUES» => «N»,     // N, Y
«REFRESH» => «Y»,               // N, Y
«HIDDEN» => «N»,                // N, Y
)
)
);

Поля HIDDEN и COLS еще не успел проверить, но о них речь и не идёт. Главное в массиве разделить поля для параметров гаджета (PARAMETERS) и пользовательские параметры (USER_PARAMETERS). Разница в том, что первые пользователь поменять не может и на странице настроек не видит их. В остальном гаджет работает с параметрами так же, как компонент.

Файл .descrtiption.php — описание гаджета.
Файл описания совсем малюсенький и имеет примерно такой вид:

<?if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true)die();
$arDescription = Array(      
«LANG_ONLY» => «ru», //ограничение для языка панели
«NAME» =>GetMessage(«MY_GADGET_NAME»),
«DESCRIPTION» =>GetMessage(» MY_GADGET_ DESC»),
«ICON» =>»», //полный путь к иконке или название файла иконки в папке гаджета
«GROUP» => Array(«ID»=>»admin_store»),
«TITLE_ICON_CLASS» => «bx-gadgets-no-padding», //дополнительный CSS-класс для вывода содержимого    
«AI_ONLY» => true //только в админке
);?>

Тут вроде как всё ясно, кроме группы «GROUP». Дело в том, что можно использовать только определённые заранее группы, свою группу мне так и не удалось создать (выводится надпись «undefined» в меню подключения гаджета). Полный список групп можно подсмотреть в файле «bitrix/components/bitrix/desktop/component.php» в массиве $arGroups.

Можно также передать параметр, чтобы отключить заголовок гаджета, как в гаджетах монитора производительности и резервного копирования.

Файл index.php — вывод данных.
Файл вывода данных содержит всю логику гаджета. Заменяет собой шаблон вывода (по аналогии с template.php в компонентах), подключает скрипты и файлы стилей по необходимости. Особенностью работы скрипта в файле является то, что вывод происходит в буфер, который потом подставляется в определённую ячейку рабочего стола. Это больше связано с реализацией компонента bitrix:desktop и не вызывало особых трудностей (в компонентах 2.0 вывод происходит в буфер глобальной переменной $APPLICATION и сброс можно сделать через $APPLICATION->RestartBuffer(), поэтому в гаджетах может немного изменится код для вывода, например, в AJAX-режиме).

Гаджет:  23 крутых гаджета, которые пригодятся на кухне. Они не только практичные, но и стильные

Внутри скрипта доступны две переменные: $arGadgetParams и $arParams. Тут первая переменная будет содержать актуальные параметры гаджета (с установленными пользовательскими парамертами), а $arParams — служебные параметры гаджета.

Для того чтобы реализовать кэширование, достаточно воспользоваться внутренним классом CPHPCache из API, как, например, в гаджете admin_products:

$obCache = new CPHPCache;
$cache_id = «admin_products_».md5(serialize($arFilter)).»_».$arGadgetParams[«LIMIT»];
if($obCache->InitCache($cache_time, $cache_id, «/»))
{
$arResult = $obCache->GetVars();
}
else
{
/* Вызов функций, обращение к БД. */
}

if($obCache->StartDataCache())
{
$obCache->EndDataCache($arResult);
}

/** Вывод данных **/

Если программирование — это такая себе увлекательная кухня, тогда свой гаджет мы бы уже сварили. Осталось только его подключить.

Ну во-первых, мой гаджет уже будет доступен на рабочем столе админ панели. Можно также подключить свой гаджет на странице редактирования некой сущности, чтобы создать более удобный интерфейс для оператора. Например, у меня есть гаджет для вывода профайла пользователя (user_profile) и гаджет для зачисления или перевода бонусов (user_bonus). Тогда админстраница выглядела бы вот так:

/**** Заголовок страницы, проверка уровней прав доступа и т.д. *****/
?>

<?$APPLICATION->IncludeComponent(
«bitrix:desktop»,
«admin»,
Array(
«MODE» => «AI»,
«ID» => «my_page_id», //ID собственной страницы админ панели
«MULTIPLE» => «Y»,    //разрешено использовать несколько рабочих столов
«CAN_EDIT» => «Y»,    //пользователю разрешено изменять параметры, менять местами и т.д.
«COLUMNS» => «2»,    //количество колонок на странице
«COLUMN_WIDTH_0» => «50%», //ширина первой калонки в % или в px
«COLUMN_WIDTH_1» => «50%»,
«GADGETS» => Array(«USER_PROFILE», «USER_BONUS»),  //список разрешенных гаджетов на странице или «ALL» для всех
«G_USER_PROFILE_USER_ID» => $MY_USER_ID,
«GU_USER_PROFILE_FIELDS» => Array(«FULL_NAME», «LOGIN», «EMAIL»),
«G_USER_BONUS_USER_ID» => $MY_USER_ID,
«G_USER_BONUS_PAY_SYSTEM» => Array(«WEBMONEY», «RBK», …),  
),
false,
array(
«HIDE_ICONS» => «Y»
)
);?>

/**** Завершение страницы, вывод списка данных или полей для редактирования, или табы другой формы и т.п. *****/

Подключение компонента приведено для версии 12.0.6.

Некоторые замечания и пояснения, которые могут пригодиться.
1. Ключ «MODE» указывает режим подключения и ограничивает список гаджетов. Например, подключены будут только те, у которых в .description.php указано «AI_ONLY»=>true.

2. В массиве с ключом «GADGETS» можно перечислить все допустимые гаджеты (будет наложено ограничение из пункта 1). Или указать Array(«ALL»), чтобы подключить все.

3. В ключах по шаблону G_#GADET_ID#_#PARAM# можно указать свои параметры. Например, для гаджетов user_profile и user_bonus в параметре USER_ID я указал переменную $MY_USER_ID, а для гаджета user_bonus в переменной PAY_SYSTEM я указал список доступных платёжных систем. Пользователь не сможет поменять эти настройки, что позволяет ограничивать им действия (в данном примере, платёжные системы) и передавать уже вычисленные данные.

4. Также можно передавать предварительно и пользовательские параметры по шаблону GU_#GADET_ID#_#PARAM#, где #GADGET_ID# — название гаджета в верхнем регистре, #PARAM# — параметр гаджета. Например, я задал заранее список полей, которые будут отображены оператору, и которые он сможет дополнить или поменять.

5. Особым плюсом является возможность определить ID рабочего стола (в моём примере это my_page_id). Это позволяет создавать кастомизированные страницы управления с возможностью настройки рабочего стола пользователем. Двигает куда хочет, включает, выключает. В общем, если операторы и админы часто работают в админке и им постоянно приходится видеть списки каких-либо данных, а разработчику дополнять вывод служебной информацией, то гаджеты тут незаменимы (каждый оператор создаст под себя рабочий стол, настроит поля, а если надо добавит заготовки для быстрого переключения).

Одно плохо. На 25.12.2021 параметр ID рабочего стола в компоненте bitrix:desktop при сохранении постоянно равен admin_index. Думаю, разработчики скоро это поправят (я исправил минут за 15 у себя на дев-сервере). Так что будем подождать чуток.

1с-битрикс разработчикам — пишем гаджет для кор. портала под майонезом 😉

Всем доброго времени суток!

Гаджет:  Полупланшет на полувинде. Обзор Microsoft Surface RT —

Данной статьёй попытаюсь решить две задачи:

  • Научить (научиться) создавать гаджеты для кор. портала.
  • А логика состоит в том, что выводить для текущего пользователя (чаще редактора сайта или администратора) элементы инфоблоков в различных статусах (черновик, готов, опубликовано, а также пользовательские статусы).

Показать скрытое содержимое

Расскажу немного о структуре гаджета.

Физически они располагаются в папке

/bitrix/gadgets/

. Системные гаджеты расположены во вложенной папке

/bitrix/

, трогать их структуру не рекомендуется, поэтому для своего гаджета мы создадим папку

/custom/workflow/

.

Что ещё нужно для нашего гаджета?

  • Файл описания .description.php:

    Т.е. мы в стандартный массив $arDescription передаём название гаджета и его описание.

  • Файл с настройками .parameters.php:
    $arParameters = Array(
          "PARAMETERS"=> Array(
             "IBLOCK_TYPE" => Array(
                "PARENT" => "BASE",
                "NAME" => GetMessage("GD_WORKFLOW_LIST_TYPE"),
                "TYPE" => "LIST",
                "VALUES" => $arTypes,
                "DEFAULT" => "news",
                "REFRESH" => "Y",
             ),
             "IBLOCK_ID" => Array(
                "PARENT" => "BASE",
                "NAME" => GetMessage("GD_WORKFLOW_LIST_ID"),
                "TYPE" => "LIST",
                "VALUES" => $arIBlocks,
                "DEFAULT" => '',
                "ADDITIONAL_VALUES" => "Y",
                "REFRESH" => "Y",
             ),
             "ELEMENT_COUNT" => array(
                "PARENT" => "BASE",
                "NAME" => GetMessage("GD_WORKFLOW_ELEMENT_COUNT"),
                "TYPE" => "STRING",
                "DEFAULT" => '5',
             ),
             "SITE_ID" => array(
                "PARENT" => "BASE",
                "NAME" => "test111",
                "TYPE" => "STRING",
                "DEFAULT" => $_REQUEST["src_site"],
                "HIDDEN" => 'Y',
             ),
          ),
          "USER_PARAMETERS"=> Array(
             "USER_STATUS_ID" => array(
                "PARENT" => "BASE",
                "NAME" => GetMessage("GD_WORKFLOW_STATUS_ID"),
                "TYPE" => "LIST",
                "VALUES" => $arStatus,
             ),
          ),
       );

    В данном случае стоит обратить внимание на ключи «PARAMETERS» и «USER_PARAMETERS» массива $arParameters. В первый ключ записываются параметры, которые будут выводиться в настройках компонента bitrix:desctop, а второй предназначен для настроек, которые может задать конкретный пользователь.

    1С-Битрикс Разработчикам - Использование гаджетов в админке.

  • И собственно файл index.php, который собственно и содержит код, реализующий нашу задачу.
    $arGadgetParams["USER_STATUS_ID"] = ($arGadgetParams["USER_STATUS_ID"] ? $arGadgetParams["USER_STATUS_ID"] : 2);
    
    if (intval($arGadgetParams["ELEMENT_COUNT"]) <= 0)
       $arGadgetParams["ELEMENT_COUNT"] = 5;
    
    $arGadgetParams["IBLOCK_TYPE"] = trim($arParams["IBLOCK_TYPE"]);
    if(strlen($arGadgetParams["IBLOCK_TYPE"])<=0)
        $arGadgetParams["IBLOCK_TYPE"] = "news";
    $arGadgetParams["IBLOCK_ID"] = trim($arGadgetParams["IBLOCK_ID"]);
    
    $arNavParams = array(
          "nPageSize" => $arGadgetParams["ELEMENT_COUNT"],
       );
    
    $obCache = new CPageCache;
    $life_time = 30*60; //30 минут
    $cache_id = $arGadgetParams["IBLOCK_TYPE"].$arGadgetParams["IBLOCK_ID"].$USER->GetGroups();
    
    
    if($obCache->StartDataCache($life_time, $cache_id, "/")):
       if(!CModule::IncludeModule("iblock"))
       {
          ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
          return;
       }
       elseif (!CModule::IncludeModule("workflow"))
       {
          ShowError(GetMessage("WORKFLOW_MODULE_NOT_INSTALLED"));
          return;
       }
       $rsIBlock = CIBlock::GetList(array(), array(
          "ACTIVE" => "Y",
          "ID" => $arGadgetParams["IBLOCK_ID"],
          "SITE_ID" => $arGadgetParams["SITE_ID"],
       ));
       if($arResult = $rsIBlock->GetNext())
       {
          $arSelect = array(
             "ID",
             "IBLOCK_ID",
             "NAME",
             "DATE_CREATE",
             "PREVIEW_PICTURE",
          );
          $arFilter = array (
             "IBLOCK_ID" => $arResult["ID"],
             "IBLOCK_LID" => $arGadgetParams["SITE_ID"],
             "ACTIVE" => "Y",
             "CHECK_PERMISSIONS" => "Y",
             "SHOW_HISTORY" => "Y",
             "WF_STATUS_ID" => $arGadgetParams["USER_STATUS_ID"],
          );
          $arSort = array("SORT"=>"ASC");
    
          //Execute
          $rsElement = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect);
          echo "<table border=0>";
          while($obElement = $rsElement->GetNext())
          {?>
             <tr>
    <td valign="top" style="padding: 10px 0px 10px 0px;"><?=CFile::ShowImage($obElement['PREVIEW_PICTURE'], 60, 40);?></td>
                
    <td style="color:gray; padding:10px 0px 10px 0px;" ><?=GetMessage("GD_WORKFLOW_CREATE").": ".$obElement["DATE_CREATE"]?><br><a href="<?="/bitrix/admin/iblock_element_edit.php?WF=Y&ID=".$obElement["ID"]."&type=".$arResult["IBLOCK_TYPE_ID"]."&IBLOCK_ID=".$arResult["ID"]?>"><?=$obElement['NAME']?></a></td>
    
             </tr>
          <?}
          echo "</table>";
       }
       $obCache->EndDataCache();
    endif;

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

    1С-Битрикс Разработчикам - Использование гаджетов в админке.

  • Языковые файлы в папке /lang/
    Думаю Вы без труда разберётесь с данным разделом.

Архивы с гаджетами:

Спасибо за внимание и заранее приношу извинения за возможные ошибки (отводилось немного времени на разработку).

Пример разработки гаджета

Рассмотрим пример, сделаем гаджет, показывающий текущее время. Для упрощения задачи будем считать, что гаджет не имеет настроек и не имеет локализации для других языков.Для начала нужно создать папку в папке /bitrix/gadgets/ , в которой будут хранится гаджеты, которые мы будем писать. Назовем эту папку dv. Далее нужно создать папку для нашего гаджета — show_date.

Таким образом получим такую структуру папок:/bitrix/gadgets/dv//bitrix/gadgets/dv/show_date//bitrix/gadgets/dv/show_date/.description.php/bitrix/gadgets/dv/show_date/.parameters.php/bitrix/gadgets/dv/show_date/index.php

Пишем описание гаджета:файл .description.php< ? if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true)die(); $arDescription = Array(
«NAME»=>«Текущее время»,«DESCRIPTION»=>»Показываем текущее время»,«ICON»=>»»,«GROUP»=> Array(«ID»=>»personal»),«NOPARAMS»=>»Y»,«SU»=> true,«SG»=> true); ?>

Файл с параметрами гаджета:файл .parameters.php< ?if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true)die();?>

Поскольку параметров у нас нет, то в файле только одна строка.

Структура гаджета

Как и всегда, сначала мы рассмотрим структуру гаджета. Все гаджеты находятся в папке /bitrix/gadgets/ , системные гаджеты в папке /bitrix/gadgets/bitrix/. Название папки гаджета как и в случае компонента, является идентификатором гаджета.

В таблице ниже описание всех файлов гаджета.

ФайлОписание
.description.phpФайл описания гаджета. В нем задается название гаджета, его описание и место в структуре гаджетов.
.parameters.phpФайл с параметрами гаджета. Параметры разделены на те, которые может настраивать пользователь и те, которые может настраивать только администратор.
Index.phpИсполняемый код гаджета.
lang/Папка, служащая для локализации гаджета.

В итоге

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

статья опубликована в журнале Веб-Аналитик.ИНФО, (№4) июль 2021 год

Оцените статью
GadgetManiac
Добавить комментарий