Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Добавление своих элементов в админку Битрикс на уже существующие страницы
Получился такой сложный заголовок, но простая история. После публикации модуля для рассылок приходило несколько писем с вопросом — как же так внедрить свои настройки на уже созданную, системную страницу Битрикс?
Сначала хочется сказать, что модуль бесплатный. Его можно скачать и посмотреть код. Но все же попробую рассказать.
Сделав небольшое отступление, выскажусь про модули и настройки в админке Битрикс. Во-первых, я считаю, что использование контролов со своим дизайном это отвратительно и удивляюсь, что при модерации такие модули попадают в 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 не будет выполнено и ваше значение опции не станет пустым, как вы хотели.
Посмотреть в действии и поковырять страшненький код можно в уже упомянутом модуле для рассылок.