|
Допускается такой способ создания кнопки:
|
|---|
//создаем кнопку
var newButton = BX.create('span', {
html: 'Скачать как PDF'
});
|
Дата последнего изменения: 10.11.2023
Задачи добавления функционала в визуальную часть действующего проекта - частая просьба клиента. Например, просьба добавить кнопку в карточку задачи, группы или сотрудника. Для "1С-Битрикс: Управление сайтом" более приемлем классический способ копирования и кастомизации шаблона компонента. Кастомизация визуальной части проекта, реализованная с помощью JS, более практична для решения задач в коробочной версии Битрикс24, хотя может использоваться и в БУС тоже.
Использование для этих целей JS вместо кастомизации шаблона, имеет свои особенности:
В каждом конкретном случае разработчик самостоятельно решает какой способ добавления визуального функционала (JS или классический) предпочтителен.
Добавляемый JS-код хранится в рамках системы в нескольких местах, но при кастомизации визуальной части лучше использовать место для файлов по пути: /bitrix/js/<ваша уникальная папка>/file.js.
Заказчик поставил задачу: Поставить кнопку Скачать в PDF в карточке задачи.
После выбора места для кнопки находим конкретного "соседа" к которому нужно привязаться при внедрении кнопки. В нашем примере место для кнопки - рядом с кнопкой Редактировать, значит ищем класс элемента-соседа:
Далее используем код:
//код исполняем, только когда DOM загружен
BX.ready(function(){
var editButton = BX.findChild(//найти пасынков...
BX('task-view-buttons'),//...для родителя
{//с такими вот свойствами
tag: 'a',
className: 'task-view-button edit'
},
true//поиск рекурсивно от родителя
);
if (editButton)
{
var href = window.location.href, matches, taskId;
//узнаем id задачи из URL
if (matches = href.match(/\/task\/view\/([\d]+)\//i)) {
taskId = matches[1];
}
//создаем кнопку
var newButton = BX.create('a', {
attrs: {
href: href + (href.indexOf('?') === -1 ? '?' : '&') + 'task=' + taskId + '&' + 'pdf=1&sessid=' + BX.bitrix_sessid(),
className: 'task-view-button edit webform-small-button-link task-button-edit-link'
},
text: 'Скачать как PDF'
});
//вставляем кнопку
BX.insertAfter(newButton, editButton);
}
});
|
Допускается такой способ создания кнопки:
|
|---|
//создаем кнопку
var newButton = BX.create('span', {
html: 'Скачать как PDF'
});
|
Аналогичную команду Скачать как PDF внедряем в меню Ещё карточки задачи.

Задача решается с помощью обработчика:
//код исполняем, только когда DOM загружен
BX.ready(function(){
BX.addCustomEvent('onPopupFirstShow', function(p) {
var menuId = 'task-view-b';
if (p.uniquePopupId === 'menu-popup-' + menuId)
{
var menu = BX.PopupMenu.getMenuById(menuId),
href = window.location.href,
matches, taskId;
//узнаем id задачи из URL
if (matches = href.match(/\/task\/view\/([\d]+)\//i)) {
taskId = matches[1];
}
//добавляем пункт меню, полученному по id
menu.addMenuItem({
text: 'Скачать как PDF',
href: href + (href.indexOf('?') === -1 ? '?' : '&') + 'task=' + taskId + '&' + 'pdf=1&sessid=' + BX.bitrix_sessid(),
className: 'menu-popup-item-create'
});
}
});
});
Добавление пункта в меню предпочтительнее, чем использование кнопки. В этом случае при построении DOM не будет "миганий" и "дёрганий".
Узнать ID popup'а можно так:
Внедрение в меню - частный случай внедрения в popup. Общий пример выглядит так:
//код исполняем, только когда DOM загружен
BX.ready(function(){
BX.addCustomEvent('onPopupFirstShow', function(p) {
if (p.uniquePopupId === 'task-templates-popup-templateselector')
{
p.contentContainer.innerHTML = 'blabla';
}
});
});
Результат такого внедрения:

Например, при нажатии на кнопку Завершить должен появиться popup для введения обязательного комментария.
//метод, вызываемый при клике
var completeAction = function(){
var popup = new BX.PopupWindow('customComplete', BX.proxy_context, {
darkMode: true,
closeByEsc : true,
contentColor: 'white'
});
popup.setContent('Введите сначала комментарий: <input type="text">');
popup.show();
};
//селектор места вставки
var completeButton = BX.findChild(//найти пасынков...
BX('task-view-buttons'),//...для родителя
{//с такими вот свойствами
tag: 'span',
className: 'task-view-button complete'
},
true//поиск рекурсивно от родителя
);
if (completeButton)
{
//сначала вставляем свою кнопку
BX.insertAfter(BX.create('span', {
attrs: {
href: '#',
className: 'task-view-button complete webform-small-button webform-small-button-accept'
},
events: {
click: BX.proxy(completeAction, this)
},
text: 'Завершить'
}), completeButton);
//затем удаляем старую
BX.remove(completeButton);
}

При изменении визуальной части необходим контроль со стороны сервера так как: DOM может не успеть подгрузиться, задачу закрыли из другого места, другие ситуации. Это необходимо предусмотреть и вывести ошибку. Сделайте, например, так:
<?php
AddEventHandler('main', 'onProlog', function(){
$request = \Bitrix\Main\Context::getRequest();
if ($request->get('pdf_download'))
{
//
}
});