Настраиваемая головка с нагрузкой-хамелеоном

При использовании хамелеона я могу заменить элемент из базового шаблона, используя концепцию слота. Где вы определяете слот и заполняете его другим тегом. Поскольку в голове нет элемента-контейнера, как можно добавлять элементы в голову? :

Файл макета

<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>

Но в голове нет тега контейнера, так как же определить слот для добавления материала в голову?


person Kristian Benoit    schedule 09.12.2013    source источник


Ответы (2)


Существует альтернатива использованию tal:omit-tag (которую я нахожу раздражающе запутанной - не раз я тратил много минут, пытаясь понять, почему определенный тег не отображается в выводе, когда он явно присутствует в шаблоне, только для того, чтобы найти tal:omit-tag аккуратно заправленный в дальнем углу): если вы используете теги xml с пространствами имен 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="..." />
person Sergey    schedule 09.12.2013
comment
Я поднял вас, потому что считаю, что исчезающие div сбивают с толку. Альтернатива тегу пространства имен намного чище. - person umeboshi; 23.12.2013

Чтобы удалить тег, нужно использовать 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 не является частью результата. Прочитать документ.

person Kristian Benoit    schedule 09.12.2013