Skip to content

Модуль View

Фасад библиотеки. Делает четыре вещи: читает и выставляет заголовки htmx, экранирует значения модели, отдаёт htmx и Alpine.js как статику и создаёт объекты рендеринга и защиты форм.

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

bsl
#Использовать winow-view

Справочник заголовков: htmx headers.

Состав

ГруппаМетоды
Заголовки запросаЭтоHxЗапрос, ЭтоHxBoosted, ЦельHx, ТриггерHx, ИмяТриггераHx, ТекущийАдресHx, ЭтоЗапросИсторииHx, ЗапросПодтвержденияHx, ЗначениеЗаголовка
Заголовки ответаУстановитьТриггер, УстановитьТриггерПослеЗамены, УстановитьТриггерПослеУстановки, Перенаправить, Обновить, ЗаменитьАдрес, ПротолкнутьАдрес, ПереопределитьЦель, ПереопределитьСпособЗамены, ПереопределитьВыборку
ЭкранированиеЭкранироватьHtml, ЭкранироватьАтрибут
СтатикаПутьКСтатике, ФайлБиблиотеки, СодержимоеБиблиотеки, ТегиПодключения, ВерсииБиблиотек
ОбъектыСоздатьОтображения, СоздатьЗащитуCSRF

Заголовки запроса

Все функции группы принимают один параметр:

ПараметрТипОписание
ЗаголовкиСоответствие, СтруктураЗаголовки запроса, в winow это Запрос.Заголовки

Регистр имён заголовков не важен: HTTP/2 передаёт их только в нижнем регистре, а прокси нормализуют по-своему. Отсутствующий заголовок даёт Ложь для проверок и пустую строку для значений.

МетодВозвращаетЗаголовокСмысл
ЭтоHxЗапрос(Заголовки)БулевоHX-RequestЗапрос отправлен htmx, а не обычным переходом браузера
ЭтоHxBoosted(Заголовки)БулевоHX-BoostedЗапрос вызван ссылкой или формой с hx-boost
ЭтоЗапросИсторииHx(Заголовки)БулевоHX-History-Restore-Requesthtmx восстанавливает страницу из истории
ЦельHx(Заголовки)СтрокаHX-TargetИдентификатор элемента, в который подставится ответ
ТриггерHx(Заголовки)СтрокаHX-TriggerИдентификатор элемента, вызвавшего запрос
ИмяТриггераHx(Заголовки)СтрокаHX-Trigger-NameАтрибут name этого элемента
ТекущийАдресHx(Заголовки)СтрокаHX-Current-URLАдрес страницы, с которой отправлен запрос
ЗапросПодтвержденияHx(Заголовки)СтрокаHX-PromptОтвет пользователя на hx-prompt

Основное применение - решение, чем отвечать. Фрагмент отдаётся только на обычный hx-запрос: hx-boost и восстановление истории заменяют содержимое body, поэтому им нужна страница целиком.

bsl
Если View.ЭтоHxЗапрос(Запрос.Заголовки) И Не View.ЭтоHxBoosted(Запрос.Заголовки) Тогда
	Ответ.ТелоТекст = Отображения.Фрагмент("задачи/список", Модель);
Иначе
	Ответ.ТелоТекст = Отображения.Страница("задачи/список", Модель);
КонецЕсли;

Сообщить(View.ЦельHx(Запрос.Заголовки));         // задачи
Сообщить(View.ИмяТриггераHx(Запрос.Заголовки));  // название

ЗначениеЗаголовка

bsl
Функция ЗначениеЗаголовка(Знач Заголовки, Знач Имя, Знач ЗначениеПоУмолчанию = "") Экспорт

Возвращает произвольный заголовок независимо от регистра его имени.

Параметры

ПараметрТипОписание
ЗаголовкиСоответствие, СтруктураЗаголовки запроса
ИмяСтрокаИмя заголовка
ЗначениеПоУмолчаниюПроизвольныйЧто вернуть, если заголовка нет

Возвращаемое значение: Строка, Произвольный - значение заголовка.

bsl
Язык = View.ЗначениеЗаголовка(Запрос.Заголовки, "Accept-Language", "ru-RU");

Заголовки ответа

Все функции группы возвращают то же Соответствие, что получили, поэтому вызовы можно ставить подряд. Если передать Неопределено, Соответствие создаётся.

ПараметрТипОписание
ЗаголовкиСоответствиеЗаголовки ответа, в winow это Ответ.Заголовки. Неопределено создаёт новое
МетодЗаголовокЧто делает клиент
Перенаправить(Заголовки, Адрес)HX-RedirectПереходит по адресу
Обновить(Заголовки)HX-RefreshПерезагружает страницу целиком
ЗаменитьАдрес(Заголовки, Адрес)HX-Replace-UrlЗаменяет адрес в строке браузера без записи в историю
ПротолкнутьАдрес(Заголовки, Адрес)HX-Push-UrlДобавляет адрес в историю, кнопка «назад» вернёт состояние
ПереопределитьЦель(Заголовки, Селектор)HX-RetargetПодставляет ответ в другой элемент
ПереопределитьСпособЗамены(Заголовки, Способ)HX-ReswapМеняет способ подстановки: значения те же, что у hx-swap
ПереопределитьВыборку(Заголовки, Селектор)HX-ReselectБерёт из ответа только часть, перекрывая hx-select

Параметр Адрес - Строка с адресом перехода, Селектор - Строка с CSS-селектором, Способ - Строка вида innerHTML, outerHTML, beforeend, none.

bsl
// Ошибку валидации показываем в общем блоке сообщений, а не в элементе,
// который просил ответ
View.ПереопределитьСпособЗамены(View.ПереопределитьЦель(Ответ.Заголовки, "#ошибки"), "outerHTML");

// Код 302 для hx-запроса не работает: браузер подставил бы результат
// в целевой элемент
View.Перенаправить(Ответ.Заголовки, "/задачи/список");

Триггеры

bsl
Функция УстановитьТриггер(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) Экспорт
Функция УстановитьТриггерПослеЗамены(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) Экспорт
Функция УстановитьТриггерПослеУстановки(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) Экспорт

Просят htmx вызвать событие на клиенте. Три метода различаются моментом вызова:

МетодЗаголовокКогда событие вызывается
УстановитьТриггерHX-TriggerСразу после получения ответа
УстановитьТриггерПослеЗаменыHX-Trigger-After-SwapПосле подстановки ответа в DOM
УстановитьТриггерПослеУстановкиHX-Trigger-After-SettleПосле анимаций и досылки атрибутов

Параметры

ПараметрТипОписание
ЗаголовкиСоответствиеЗаголовки ответа
ИмяСтрокаИмя события, например задачаДобавлена. Пустое имя даёт исключение
ДанныеСтруктура, Соответствие, Строка, Число, БулевоПодробности события, попадают в detail на клиенте

Возвращаемое значение: Соответствие - заголовки ответа с соответствующим заголовком.

Повторные вызовы накапливаются. Единственное событие без данных передаётся простым именем - так заголовок читается в отладчике браузера. Как только появляются данные или второе событие, заголовок становится объектом JSON.

bsl
View.УстановитьТриггер(Ответ.Заголовки, "задачаДобавлена");
// HX-Trigger: задачаДобавлена

View.УстановитьТриггер(Ответ.Заголовки, "счётчикИзменён", Новый Структура("всего", 3));
// HX-Trigger: {"задачаДобавлена":null,"счётчикИзменён":{"всего":3}}

Экранирование

Шаблонизатор подставляет значения как есть, поэтому всё, что пришло от пользователя, экранируется явно.

bsl
Функция ЭкранироватьHtml(Знач Текст) Экспорт
Функция ЭкранироватьАтрибут(Знач Текст) Экспорт
МетодКуда безопасно вставлятьДополнительно к ЭкранироватьHtml
ЭкранироватьHtmlТекстовое содержимое элемента-
ЭкранироватьАтрибутЗначение атрибута в кавычкахСнимает обратную кавычку

Параметры

ПараметрТипОписание
ТекстПроизвольныйВыводимое значение. Числа и Неопределено допустимы

Возвращаемое значение: Строка - значение, безопасное для вставки.

bsl
Модель.Вставить("Название", View.ЭкранироватьHtml(Задача.Название));
Модель.Вставить("Подсказка", View.ЭкранироватьАтрибут(Задача.Комментарий));
html
<li title="{{ Модель.Подсказка }}">{{ Модель.Название }}</li>

Обратная кавычка в атрибуте без кавычек работает ограничителем значения в некоторых браузерах, поэтому ЭкранироватьАтрибут заменяет и её. Значение атрибута всё равно берите в кавычки.

Статика

ПутьКСтатике

bsl
Функция ПутьКСтатике() Экспорт

Каталог с библиотеками, поставляемыми в составе пакета. Его достаточно зарегистрировать в winow как каталог статики.

Возвращаемое значение: Строка - полный путь к каталогу.

bsl
Приложение.ДобавитьКаталогСтатики("/static", View.ПутьКСтатике());

ФайлБиблиотеки

bsl
Функция ФайлБиблиотеки(Знач Имя) Экспорт

Параметры: Имя - Строка "htmx" или "alpine", допускается и полное имя файла.

Возвращаемое значение: Строка - полный путь к файлу.

bsl
Сообщить(View.ФайлБиблиотеки("htmx"));  // ...\src\static\htmx.min.js

СодержимоеБиблиотеки

bsl
Функция СодержимоеБиблиотеки(Знач Имя) Экспорт

Возвращает содержимое поставляемой библиотеки. Нужно, когда файлы отдаёт сам обработчик, а не каталог статики winow.

Параметры: Имя - Строка "htmx" или "alpine", допускается и полное имя файла.

Возвращаемое значение: Строка - текст файла библиотеки.

Имя проверяется по закрытому списку: имя, пришедшее из запроса, не прочитает ничего, кроме двух поставляемых файлов, даже если в нём приедет ../.

bsl
&ТочкаМаршрута("static/{ИмяФайла}")
Процедура Библиотека(ИмяФайла, Ответ) Экспорт

	Ответ.УстановитьТипКонтента("js");
	Ответ.ТелоТекст = View.СодержимоеБиблиотеки(ИмяФайла);

КонецПроцедуры

ТегиПодключения

bsl
Функция ТегиПодключения(Знач Префикс = "/static") Экспорт

Теги подключения htmx и Alpine.js для вставки в макет. Завершающие слеши в префиксе отбрасываются.

Параметры: Префикс - Строка адрес, по которому раздаётся каталог статики.

Возвращаемое значение: Строка - два тега script, разделённые переводом строки.

bsl
Модель.Вставить("Скрипты", View.ТегиПодключения("/static"));
html
<script src="/static/htmx.min.js"></script>
<script src="/static/alpine.min.js" defer></script>

Alpine.js подключается с defer не для скорости: без него библиотека инициализируется раньше, чем разобран документ, и не находит разметку.

ВерсииБиблиотек

bsl
Функция ВерсииБиблиотек() Экспорт

Возвращаемое значение: Соответствие - "htmx" и "alpine" -> версия.

Версия проверяется тестом: объявленная здесь должна совпадать с версией внутри файла, иначе документация и то, что реально уходит браузеру, разъедутся.

bsl
Сообщить(View.ВерсииБиблиотек().Получить("htmx"));  // 2.0.10

Объекты

СоздатьОтображения

bsl
Функция СоздатьОтображения(Знач КаталогШаблонов, Знач Параметры = Неопределено) Экспорт

Создаёт объект рендеринга шаблонов.

Параметры

ПараметрТипОписание
КаталогШаблоновСтрокаКаталог с файлами шаблонов
ПараметрыСтруктура, СоответствиеНастройки, см. ViewRenderer

Возвращаемое значение: ViewRenderer - объект рендеринга.

bsl
Отображения = View.СоздатьОтображения("шаблоны", Новый Структура("Макет", "макет"));

СоздатьЗащитуCSRF

bsl
Функция СоздатьЗащитуCSRF(Знач Секрет, Знач СрокЖизни = 3600) Экспорт

Создаёт защиту форм от CSRF.

Параметры

ПараметрТипОписание
СекретСтрокаСекрет приложения для подписи токенов
СрокЖизниЧислоСрок жизни токена в секундах

Возвращаемое значение: CsrfGuard - объект защиты форм.

bsl
Защита = View.СоздатьЗащитуCSRF(ПолучитьПеременнуюСреды("APP_SECRET"));

Смотри также