Trip2g: htmlInjections в HTML layouts

Кастомный HTML/Jet layout в Trip2g должен сам вывести HTML-инъекции сайта. Иначе скрипты из Admin → HTML Injections — аналитика, пиксели, SEO-теги, кастомный <head> — не попадут на страницу с кастомным layout.

Связано: Wiki, iiminion layout README, официальная документация Trip2g.

Правильная вставка

Внутри полного HTML layout добавляй обе зоны:

<head>
  ...
  {{ range i, injection := htmlInjectionsHead }}{{ injection.Content | unsafe }}{{ end }}
</head>
<body>
  ...
  {{ range i, injection := htmlInjectionsBodyEnd }}{{ injection.Content | unsafe }}{{ end }}
</body>

Где ставить:

  • htmlInjectionsHead — перед </head>.
  • htmlInjectionsBodyEnd — перед </body>.

Важный синтаксис Jet

Используй две переменные в range:

{{ range i, injection := htmlInjectionsHead }}{{ injection.Content | unsafe }}{{ end }}
{{ range i, injection := htmlInjectionsBodyEnd }}{{ injection.Content | unsafe }}{{ end }}

Не используй однопеременную форму:

{{ range injection := htmlInjectionsHead }}{{ injection.Content | unsafe }}{{ end }}

Почему: в Jet однопеременный range item := slice даёт индекс, а не значение. Пока список пустой, ошибки может не быть. Когда в Admin появится реальная инъекция, injection станет числом, и injection.Content даст runtime error.

Пример из iiminion

В _layouts/iiminion/_blocks.html схема такая:

<head>
  ...
  {{ range index, injection := htmlInjectionsHead }}{{ injection.Content | unsafe }}{{ end }}
</head>
<body>
  {{ yield content }}
  <script defer src="{{ asset("scripts.js") }}"></script>
  {{ range index, injection := htmlInjectionsBodyEnd }}{{ injection.Content | unsafe }}{{ end }}
</body>

Смысл: layout остаётся полностью кастомным, но глобальные скрипты сайта подключаются автоматически.

Когда это обязательно

Добавляй htmlInjections в каждый layout, который сам рисует полный документ:

  • есть <!doctype html> / <html>;
  • есть собственные <head> и <body>;
  • используется для лендингов, публичных страниц, форм, промо-страниц;
  • нужно, чтобы GA4, Яндекс.Метрика, пиксели или другие инъекции работали на странице.

Если layout только блок/partial и вставляется внутрь другого shell-layout, htmlInjections должен выводить внешний shell, а не каждый блок.

Проверка

После синка проверь live-страницу:

  1. HTTP 200 и нет Layout Error.
  2. В HTML есть ожидаемый код инъекции из Admin.
  3. Нет Runtime Error из-за неправильного range.
  4. Инъекция из head находится до </head>, а body_end — перед </body>.

Правило: любой полный custom HTML layout в Trip2g должен явно выводить htmlInjectionsHead и htmlInjectionsBodyEnd двухпеременным range.