main.sidepanel — это клиентское JavaScript-расширение Bitrix Framework для открытия страниц и содержимого в боковой панели. В API такую панель называют слайдером. Используйте расширение, когда нужно показать пользователю объект или форму без перехода с текущей страницы: карточку элемента, форму редактирования или настройки.
Основной API доступен через глобальный объект BX.SidePanel.Instance. PHP-код только загружает расширение на страницу, а открытие и управление боковой панелью выполняет JavaScript в браузере.
Подключить расширение
Если вы подключаете боковую панель из PHP, загрузите расширение main.sidepanel.
После загрузки расширения используйте объект BX.SidePanel.Instance в JavaScript-коде страницы.
Если вы работаете в модульном JavaScript, импортируйте объект SidePanel из расширения.
import { SidePanel } from 'main.sidepanel';
SidePanel.Instance.open('/crm/deal/details/15/', {
width: 900,
});
Открыть панель
Метод BX.SidePanel.Instance.open(url, options) открывает слайдер по URL.
Возвращаемое значение:
-
true— слайдер начал открываться; -
false— слайдер не открылся. Возможные причины: URL пустой, сверху уже открыт слайдер с таким же URL или обработчик события запретил действие.
Если последний закрытый слайдер был кэширован и его URL совпадает с новым вызовом open(), менеджер использует этот экземпляр повторно.
BX.SidePanel.Instance.open('/crm/deal/details/15/', {
width: 900,
cacheable: false,
allowChangeHistory: false,
});
url должен быть непустой строкой.
Не добавляйте в url параметры IFRAME и IFRAME_TYPE. Компонент сам передаст их при загрузке страницы в iframe.
Передать содержимое без iframe
Если панель должна показать содержимое текущей страницы, передайте contentCallback. В этом режиме слайдер не загружает iframe, а использует результат функции как содержимое.
BX.SidePanel.Instance.open('settings-panel', {
width: 620,
contentCallback: () => {
const content = document.createElement('div');
content.textContent = 'Настройки доступны без перехода на отдельную страницу.';
return content;
},
cacheable: false,
});
Параметр contentCallback получает текущий слайдер и может вернуть DOM-узел, строку, объект с полем html или Promise, который завершится одним из этих значений.
В этом сценарии url остается идентификатором слайдера. Используйте стабильное значение, чтобы затем найти или закрыть слайдер через менеджер.
Передать параметры слайдера
Параметр options в open(url, options) — объект настроек слайдера. Передавайте только те параметры, которые нужны конкретному сценарию.
Размеры и отображение
|
|| Параметр | Тип | Описание ||
|| width | number | Ширина панели в пикселях. Если значение не передано, ширину рассчитывает компонент. ||
|| startPosition | right bottom top | Сторона, с которой появляется слайдер. По умолчанию right. ||
|| animationDuration | number | Длительность анимации открытия и закрытия в миллисекундах. По умолчанию 200. ||
|| overlayOpacity | number | Прозрачность затемнения от 0 до 100. По умолчанию 40. ||
|| overlayBgColor | string | Цвет затемнения в формате #RRGGBB. По умолчанию #000000. ||
|| hideControls | boolean | Скрывает стандартные элементы управления слайдера. ||
|#
Загрузка содержимого
|
|| Параметр | Тип | Описание ||
|| contentCallback | Function | Возвращает содержимое слайдера без загрузки iframe. Функция получает текущий слайдер. ||
|| requestMethod | get post | Метод загрузки iframe. Значение post включает POST-запрос, остальные значения работают как GET. По умолчанию get. ||
|| requestParams | object | Параметры POST-запроса, если requestMethod: 'post'. ||
|| allowCrossOrigin | boolean | Включает загрузку кросс-доменного iframe при открытии слайдера. В этом режиме слайдер не обращается к содержимому iframe напрямую и обменивается с ним сообщениями через window.postMessage. ||
|| loader | string HTMLElement | Индикатор загрузки. Передайте DOM-элемент или строку с именем загрузчика. ||
|| skeleton | string | Имя скелетона, который будет показан во время загрузки. ||
|| cacheable | boolean | Сохраняет слайдер после закрытия. По умолчанию true. Передайте false, если при следующем открытии нужно заново загрузить страницу или содержимое. ||
|#
История, заголовок и фокус
|
|| Параметр | Тип | Описание ||
|| title | string | Заголовок слайдера. Компонент может использовать его как заголовок страницы при включенном allowChangeTitle. ||
|| autoFocus | boolean | Переводит фокус в слайдер после открытия. По умолчанию true. ||
|| allowChangeHistory | boolean | Управляет изменением URL текущей страницы через History API. Если параметр не передан, слайдер с iframe меняет URL. URL не меняется для страниц /bitrix/components/, /bitrix/tools/ и кросс-доменных iframe. ||
|| allowChangeTitle | boolean | Управляет изменением document.title. Если параметр не передан, заголовок меняется при наличии title или при включенном изменении URL. ||
|#
Действия и данные
|
|| Параметр | Тип | Описание ||
|| printable | boolean | Показывает кнопку печати. По умолчанию false. ||
|| newWindowLabel | boolean | Показывает кнопку открытия в новом окне, если слайдер может определить URL. ||
|| newWindowUrl | string | URL для кнопки открытия в новом окне. ||
|| copyLinkLabel | boolean | Показывает кнопку копирования ссылки, если слайдер может определить URL. ||
|| data | object | Пользовательские данные слайдера. Доступен через slider.getData(). Метод возвращает объект Dictionary; читайте значения через slider.getData().get('key') ||
|| events | object object[] | Обработчики событий слайдера. ||
|#
Настроить загрузку через POST
Передайте requestMethod: 'post' и requestParams, если страницу внутри панели нужно открыть POST-запросом.
BX.SidePanel.Instance.open('/reports/detail/', {
width: 760,
requestMethod: 'post',
requestParams: {
reportId: 42,
mode: 'preview',
},
});
Добавить действия в панель
Чтобы показать в слайдере кнопку печати, открытия в новом окне или копирования ссылки, передайте параметры printable, newWindowLabel или copyLinkLabel.
BX.SidePanel.Instance.open('/company/policy/', {
width: 800,
printable: true,
newWindowLabel: true,
copyLinkLabel: true,
});
Кнопка открытия в новом окне и кнопка копирования ссылки используют URL слайдера или значение newWindowUrl.
Обработать события
Передайте обработчики в параметре events. Обработчик получает объект SliderEvent: event.getSlider() возвращает текущий слайдер, event.denyAction() запрещает открытие или закрытие.
BX.SidePanel.Instance.open('/crm/deal/details/15/', {
width: 900,
events: {
onLoad: (event) => {
const slider = event.getSlider();
console.log(slider.getUrl());
},
onClose: (event) => {
if (window.hasUnsavedChanges === true)
{
event.denyAction();
}
},
onCloseComplete: () => {
window.hasUnsavedChanges = false;
},
},
});
Событие onClose вызывается до начала закрытия и может запретить действие. Для кода после фактического закрытия используйте onCloseComplete.
Основные события:
-
onOpen— вызывается перед открытием. Обработчик может вызватьdenyAction(). -
onOpenStart— вызывается при начале открытия. -
onOpening— вызывается при запуске анимации открытия. -
onLoad— вызывается после загрузкиiframeили содержимого изcontentCallback. -
onReload— вызывается после повторной загрузкиiframe. -
onBeforeOpenCompleteиonOpenComplete— вызываются при завершении открытия. -
onClose— вызывается перед закрытием. Обработчик может вызватьdenyAction(). -
onCloseStart— вызывается при начале закрытия. -
onClosing— вызывается при запуске анимации закрытия. -
onBeforeCloseCompleteиonCloseComplete— вызываются при завершении закрытия. -
onDestroyиonDestroyComplete— вызываются при уничтожении слайдера. -
onEscapePress— вызывается при нажатииEscвнутри слайдера. -
onFrameFocus— вызывается при переходе фокуса вiframeслайдера. -
onMaximizeStart— вызывается при начале разворачивания свернутого слайдера. -
onMinimizeStart— вызывается при начале сворачивания слайдера. -
onLayout— вызывается при пересчете раскладки слайдера. -
onFullScreenEnter— вызывается при переходе слайдера в полноэкранный режим. -
onFullScreenExit— вызывается при выходе слайдера из полноэкранного режима.
Клавиша Esc закрывает слайдер только когда текущий слайдер находится поверх всплывающих окон и обработчики не запретили закрытие.
Открывать ссылки автоматически
Метод bindAnchors({ rules }) добавляет правила, по которым обычные ссылки открываются в боковой панели. Правило содержит массив условий condition и параметры options.
BX.SidePanel.Instance.bindAnchors({
rules: [
{
condition: [
'/crm/deal/details/[0-9]+/',
],
options: {
width: 900,
cacheable: false,
allowChangeHistory: false,
},
},
],
});
Строковые условия преобразуются в регулярные выражения без учета регистра. Если ссылка подходит под правило, компонент отменяет обычный переход и вызывает open(link.url, rule.options).
Параметр stopParameters исключает ссылки с указанными query-параметрами.
BX.SidePanel.Instance.bindAnchors({
rules: [
{
condition: [
'/tasks/task/view/[0-9]+/',
],
stopParameters: [
'IFRAME',
'print',
],
options: {
width: 820,
},
},
],
});
Чтобы временно отключить автоматическую обработку ссылок, вызовите disableAnchorBinding(). Правила с forceAnchorBinding: true продолжат работать.
Ссылка не откроется в боковой панели в трех случаях:
-
ссылка кросс-доменная, а в правиле автопривязки не передано
allowCrossDomain: true; -
страница открыта в мобильном браузере, а в правиле нет
mobileFriendly: true; -
функция
validate(link)вернулаfalse.
Управлять открытыми панелями
BX.SidePanel.Instance хранит стек открытых слайдеров. Верхний слайдер считается текущим.
Основные методы менеджера:
|
|| Метод | Что делает ||
|| open(url, options) | Открывает слайдер. ||
|| maximize(url, options) | Открывает слайдер из свернутого состояния, если используется минимизация. ||
|| close(immediately, callback) | Закрывает верхний слайдер. ||
|| closeAll(immediately) | Закрывает все открытые слайдеры сверху вниз. ||
|| minimize(immediately, callback) | Сворачивает верхний слайдер, если заданы настройки минимизации. ||
|| reload() | Перезагружает верхний слайдер. ||
|| destroy(url) | Уничтожает слайдер по URL. ||
|| getTopSlider() | Возвращает верхний слайдер или null. ||
|| getSlider(url) | Возвращает открытый слайдер по URL или null. ||
|| getOpenSliders() | Возвращает массив открытых слайдеров. ||
|| getOpenSlidersCount() | Возвращает количество открытых слайдеров. ||
|| hide() и unhide() | Скрывают и возвращают открытые слайдеры без уничтожения. ||
|| enterFullScreen() | Переводит браузер в полноэкранный режим для верхнего слайдера. ||
|| exitFullScreen() | Выходит из полноэкранного режима. ||
|#
Метод close() работает с верхним слайдером. Если нужно закрыть конкретный слайдер, получите его через getSlider(url) и вызовите close() у самого слайдера.
const slider = BX.SidePanel.Instance.getSlider('/crm/deal/details/15/');
if (slider)
{
slider.close();
}
Передавать сообщения между слайдерами
Менеджер передает сообщения между слайдерами и основной страницей. Источником может быть URL слайдера, объект Window или экземпляр Slider.
Методы принимают три аргумента: источник сообщения, идентификатор события и объект с данными.
|
|| Метод | Куда отправляет сообщение ||
|| postMessage(source, eventId, data) | В предыдущий слайдер. Если предыдущего слайдера нет, сообщение получает основная страница. ||
|| postMessageAll(source, eventId, data) | Во все открытые слайдеры, кроме слайдера-источника, и на основную страницу. ||
|| postMessageTop(source, eventId, data) | На основную страницу. ||
|#
const slider = BX.SidePanel.Instance.getTopSlider();
if (slider)
{
BX.SidePanel.Instance.postMessageTop(slider, 'deal-updated', {
id: 15,
});
}
Используйте сообщения, когда содержимое внутри панели должно уведомить внешнюю страницу или соседние слайдеры об изменении данных.
Связанные материалы
-
main.popup — всплывающее окно или выпадающее меню рядом с элементом страницы.
-
Расширения — подключение JavaScript-расширений Bitrix Framework.