+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Добавление своих элементов в админку Битрикс на уже существующие страницы

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

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

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

Бывает так, что настроек очень мало и часто они имеет достаточно прямое отношение к уже существующему модулю. Так и было в моем примере. Этот модуль позволяет добавить получателей в рассылку. Зачем создавать другую страницу? Пусть пользователь тут же и использует этот функционал. Единственный минус такого подхода — некоторые пользователи просто не могут найти новый функционал после установки модуля. Многие просто не умеют читать.

Перейдем к программированию.
Для получения доступа к содержимому вкладки используем событие OnAdminTabControlBegin

Вопроса тут три:
1. Как формировать HTML код для вставки во вкладку.
2. Как вставить данные в конкретное место среди существующих элементов.
3. Как получить свои значения для их сохранения и последующего использования.

public static function OnAdminTabControlBegin(&$obTabControl){
   //Проверяем, что мы находимся на нужной странице. Той, где будем вставлять элементы
   if($GLOBALS["APPLICATION"]->GetCurPage() == "/bitrix/admin/posting_edit.php"){
      //Подключим jQuery. По желанию.
      CJSCore::Init(array("jquery"));
      //Начали буферизацию
      ob_start();?>
      <sc ript type="text/javascript">
         //Эта строка может быть (и будет) очень большой по длине
         var HTMLString = '<input type="text" name="NAME_SPACE_INPUT_NAME" value="Текст в инпуте">';
         
         //Ответ на второй вопрос. Просто пример:
         $(f unction(){
            $('textarea[name="BCC_FIELD"]').parent().prev().before(HTMLString);
         });
      </sc ript>

      <?
      $sContent = ob_get_clean();
      $GLOBALS['APPLICATION']->AddHeadS tring($sContent);
      }
   }
}


Что тут происходит?
Начали буферизацию, формируем HTML строку, но пишем ее код в JS переменную.
По событию загрузки страницы вставляем наш код в нужное место на странице. В этом нам поможет JQuery Traversing, дай бог ему здоровьица. Получаем все из буфера и вставляем это в шапку страницы.

И последнее: как получить теперь эти данные?
Используем событие OnBeforeProlog

public static function OnBeforeProlog(){
   //Проверяем, что мы на нужной странице и массив POST не пустой. Значит что-то сохраняли.
   if($GLOBALS['APPLICATION']->GetCurPage() == '/bitrix/admin/posting_edit.php' && !empty($_POST)){
      //В этом массиве есть наш инпут?
      if(isset($_POST["NAME_SPACE_INPUT_NAME"]))
         //Сохраним его
         COption::SetOptionS tring("module.name", "NAME_SPACE_INPUT_NAME", $_POST["NAME_SPACE_INPUT_NAME"]);

   }
}


Учитывайте один момент: допустим, вы сохранили в input "test", а потом решили ничего не сохранять. Это значит, что вашего инпута не будет в массиве POST, SetOptionString не будет выполнено и ваше значение опции не станет пустым, как вы хотели.

Посмотреть в действии и поковырять страшненький код можно в уже упомянутом модуле для рассылок.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA