Конфигурируемая головка с нагрузкой хамелеона
При использовании хамелеона я могу заменить элемент из базового шаблона, используя концепцию слота. Где вы определяете слот и заполняете его, используя другой тег. Поскольку в голове нет элемента контейнера, как можно добавить элементы в голову?:
Файл макета
<html>
<head>
<div metal:define-slot="extra_head"></div>
</head>
<body>
...
</body>
</html>
Шаблон контента, в котором нужно указать лишнюю голову.
<html metal:use-macro="load: main.pt">
<div metal:fill-slot="extra_head">
<script type="text/javascript" src="http://example/script.js"></script>
</div>
...
</html>
Это отображается в:
<html>
<head>
<div metal:fill-slot="extra_head">
<script type="text/javascript" src="http://example/script.js"></script>
</div>
</head>
<body>
...
</body>
</html>
Но в голове нет тега контейнера, так как можно определить слот для добавления вещей в голову?
2 ответа
Есть альтернатива использованию tal:omit-tag
(что я нахожу досадно сбивающим с толку - не раз я тратил много минут, пытаясь выяснить, почему определенный тег не появляется в выводе, когда он явно присутствует в шаблоне, только чтобы найти tal:omit-tag
аккуратно спрятан в дальнем углу): если вы используете tal:
а также metal:
пространства имен они не появятся в выводе:
<html>
<head>
<metal:my-slot define-slot="extra_head"></metal:my-slot>
</head>
<body>
...
</body>
</html>
и в дочернем шаблоне:
<metal:template use-macro="load: main.pt">
<metal:any-descriptive-name fill-slot="extra_head">
<script type="text/javascript" src="http://example/script.js"></script>
</metal:any-descriptive-name>
...
</metal:template>
Обратите внимание, что шаблон становится намного более читабельным и информативным и не содержит странных вещей, таких как <div>
внутри <head>
:)
Вы также можете опустить tal:
а также metal:
префиксы для атрибутов при использовании тегов пространства имен, так
<h1 tal:condition="..." tal:content="..." tal:omit-tag="">Hi there! Bogus content for added confusion!</h1>
становится
<tal:greeting condition="..." content="..." />
Для удаления тега нужно использовать tal:omit-tag:
В шаблоне контента используйте:
<html metal:use-macro="load: main.pt">
<div metal:fill-slot="extra_head" tal:omit-tag="">
<script type="text/javascript" src="http://example/script.js"></script>
</div>
...
</html>
Div не является частью результата. Прочитайте документ.