[jinja] extends und zentral definierte blocks...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. März 2006, 07:11

Jinja hat ja diesen "extends"-Tag: http://wsgiarea.pocoo.org/jinja/docs/inheritance.html

Ich benutzte das auch schon. Nun frage ich mich allerdings, wie ich einen Block zentral in einer seperaten Datei definieren kann. Diesen möchte ich dann in zwei anderen Templates einbinden???

Das klappt mit dem "extends" Tag nicht wirklich, oder? Es müßte viel mehr sowas wie ein import/include Tag geben, oder sehe ich da was falsch?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 29. März 2006, 12:39

Wenn du Blöcke von anderen Dateien reinladen willst kannst du in der SVN Version das Prepare Tag verwenden:

"blocks.html"

Code: Alles auswählen

{% prepare "dialog" accepting title, text %}
<div id="dialog">
  <h2>{{ title|escapexml }}</h2>
  {{ text|escapexml|nl2pbr }}
{% endprepare %}
"myfile.html"

Code: Alles auswählen

{% require "blocks" %}

{% for dialog in dialogs %}
  {% call "dialog", dialog.title, dialog.text %}
{% endfor %}
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. März 2006, 12:48

Hm. Also irgendwie erscheint mir das etwas unübersichlich... Kann man es nicht so machen:

"shared_blocks.html"

Code: Alles auswählen

{% block "dialog" %}
<div id="dialog">
  <h2>{{ title|escapexml }}</h2>
  {{ text|escapexml|nl2pbr }}
{% endblock %}
"template.html"

Code: Alles auswählen

{% import "shared_blocks.html" %}

Der Dialog:
{% marker "dialog" %}
...blabla...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 29. März 2006, 13:12

Das hat ein Problem und einen Nachteil :-)

Zuerst das Problem. Blöcke und marker gegen in beide Richtungen. Das heißt sie können sowohl überschrieben werden oder selber überschreiben.

Der Nachteil ist, das man solche Blöcke meist für Dialoge oder ähnliches verwendet. Und da hat es wenig Sinn direkt den Context zu übergeben. Sowas wie die Schleife bekommst du mit deiner Lösung nicht hin.

Du kannst aber statt {% require %} auch {% include %} verwenden, der unterschied ist nur, dass require selbst nichts ausgibt, include aber das includierte Template erst mal rendert. Resultat könnten einige Leerstellen sein.
TUFKAB – the user formerly known as blackbird
Antworten