[simpleTAL] Tabellen mit unterschiedlichen Farben erzeugen..

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab ein wenig mit TAL experimentiert und nach einer einfachen Variante gesucht, damit die Tabellen-Zeilen abwechselnd in einer anderen Farbe dargestellt wird:

Code: Alles auswählen

         from simpletal import simpleTAL, simpleTALES

         template = """
         <table>
         <tr tal:repeat="data example"
         tal:attributes="class string:color${'repeat/data/odd'}">
             <td tal:content="repeat/data/number"></td>
             <td tal:content="data/char"></td>
         </tr>
         </table>
         <style type="text/css">
             .color0 {background-color:#EEEEEE;}
             .color1 {background-color:#DDDDDD;}
         </style>
         """
         data = [{"char":chr(i)} for i in range(65, 91)]

         context = simpleTALES.Context()
         context.addGlobal("example", data)

         template = simpleTAL.compileHTMLTemplate(template)
         template.expand(context, sys.stdout)
Es funktioniert bei mir genau richtig:
<table>
<tr class="color0">
<td>1</td>
<td>A</td>
</tr><tr class="color1">
<td>2</td>
<td>B</td>
</tr><tr class="color0">
<td>3</td>
<td>C</td>
</tr><tr class="color1">
<td>4</td>
<td>D</td>
</tr><tr class="color0">

...

</table>
<style type="text/css">
.color0 {background-color:#EEEEEE;}
.color1 {background-color:#DDDDDD;}
</style>
aber macht man es wirklich so?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:...aber macht man es wirklich so?
Hi Jens!

Die Styles noch in den HEAD-Bereich der HTML-Seite, dann sieht das Ganze nicht mehr schlecht aus. :)

Unter Zope kann man die Funktion "test" einsetzen um nicht unbedingt auf die Zahlenwerte zugreifen zu müssen. Ob es diese Funktion auch für simpleTAL gibt, weiß ich leider nicht. Evt. kann man selbst so eine Funktion schreiben und an die Vorlage weiterreichen.

Code: Alles auswählen

<table>
  <tal:block tal:repeat="row python:['a','b','c']">
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="repeat/row/item">
        [Hier steht etwas]
      </td>
    </tr>
  </tal:block>
</table>    
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Jens!
gerold hat geschrieben:

Code: Alles auswählen

  <tal:block tal:repeat="row python:['a','b','c']">
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
Noch eine Erklärung zu dieser Struktur:
tal:define wird immer vor tal:repeat ausgeführt.

Wenn ich tal:define im selben Tag verwenden würde, könnte es noch nicht auf die Variable row zugrifen.

tal:block ist ein für TAL *nicht* existierendes Tag. Deshalb wird es im Zope vom Parser nicht angezeigt. Damit spart man sich das Ausblenden der Begin- und End-Tags mit tal:omit-tag="".

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

test kennt simpleTAL wohl schon, aber anscheinend kein tal:block... Zumindest geht das hier nicht:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<tal:block tal:repeat="data example"
<tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
    <td tal:content="repeat/data/number"></td>
    <td tal:content="data/char">
        [Hier steht etwas]
    </td>
</tr>
</tal:block>
</table>
<style type="text/css">
    .color0 {background-color:#EEEEEE;}
    .color1 {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 70)]

context = simpleTALES.Context()
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
traceback:
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:test kennt simpleTAL wohl schon, aber anscheinend kein tal:block... Zumindest geht das hier nicht:
[...]

Code: Alles auswählen

<tal:block tal:repeat="data example"
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.
Hi Jens!

Tag nicht geschlossen?

lg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 14. Oktober 2005, 14:58, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

gerold hat geschrieben:Tag nicht geschlossen?
OK, oben war noch ein Fehler drin, aber so geht's auch nicht:

Code: Alles auswählen

<table>
<tal:block tal:repeat="data example">
<tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
    <td tal:content="repeat/data/number"></td>
    <td tal:content="data/char">
        [Hier steht etwas]
    </td>
</tr>
</tal:block>
</table>
simpletal.simpleTAL.TemplateParseException: [</tal:block>] Close tag encountered with no corresponding open tag.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:OK, oben war noch ein Fehler drin, aber so geht's auch nicht:
Hi Jens!

Dann werde ich mir mal simpleTAL herunterladen :)

Bis dahin sollte als Ersatz tal:omit-tag="" funktionieren.

Code: Alles auswählen

<table>
  <span tal:repeat="row python:['a','b','c']"
        tal:omit-tag=""
  >
    <tr tal:define="odd repeat/row/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="repeat/row/item">
        [Hier steht etwas]
      </td>
    </tr>
  </span>
</table>    
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

gerold hat geschrieben:Bis dahin sollte als Ersatz tal:omit-tag="" funktionieren.
Das tut's auch nicht so richtig:
No handlers could be found for logger "simpleTALES.Context"
Naja, vielleicht bleib ich auch einfach bei meiner Variante? Geht ja damit schon... Oder meinst du das es nicht wirklich glücklich gelöst ist? Doof ist schon das man dann CSS Angaben mit "0" oder "1" am Ende, aber es geht...

Zum testen mußt du simpleTAL auch nicht "richtig" installieren, es reicht, wenn du es irgendwo auspackst. Es gibt ein Verz. \lib\ darin gibt es das Verz. simpletal... Du packst ein Test-Skript in \lib\ und kannst dann, wie ich, mit from simpletal import simpleTAL, simpleTALES arbeiten.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:Das tut's auch nicht so richtig:
Hi Jens!
Das könnte mit einigen Einschränkungen zu tun haben, die unter dieser Url aufgezählt sind: http://www.owlfish.com/software/simpleTAL/notes.html

Probiere mal "compileXMLTemplate" aus. Ich komme jetzt leider nicht mehr zum Testen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:
No handlers could be found for logger "simpleTALES.Context"
Hi Jens!

Das mit dem <tal:block> funktioniert anscheinend wirklich nicht.
tal:omit-tag="" funktioniert aber bestens. Damit kannst du, ohne den Inhalt zu löschen, jeden Tag ausblenden und damit zweckentfremden.
So kannst du z.B. einen Span-Tag für die Schleife verwenden, ohne diesen in der HTML-Datei angezeigt zu bekommen :-)

Da ist irgend ein Fehler beim Logging im Modul "simpleTALES.py". Damit möchte ich mich aber nicht weiter beschäftigen.

Wenn man den Import von "logging" unterbindet, dann funktioniert es bei mir.

Code: Alles auswählen

#try:
#	import logging
#except:
#	import DummyLogger as logging
import DummyLogger as logging
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du hast recht, die Fehlermeldung ist damit weg. Allerdings klappt dein Beispiel bei mir dennoch nicht :(
Ich hab es 1zu1 von dir übernommen und dann entsteht überhaupt keine Schleite ich erhalte nur <table></table>.
Ich hab das ganze mal angepasst:

Code: Alles auswählen

def test_simpletal():
    data = [{"char":chr(i)} for i in range(65, 91)]

    from simpletal import simpleTAL, simpleTALES

    template = """<table>
    <span tal:repeat="data example"
        tal:omit-tag=""
    >
    <tr tal:define="odd repeat/data/odd"
        tal:attributes="class python:str(test(odd, 'odd', 'even'))"
    >
      <td tal:content="data/char">
        [Hier steht etwas]
      </td>
    </tr>
    </span>
    </table>"""

    context = simpleTALES.Context()
    context.addGlobal("example", data)

    template = simpleTAL.compileHTMLTemplate(template)
    template.expand(context, sys.stdout)

if __name__=="__main__":
    test_simpletal()
Die Daten sehe ich, aber es ist immer class="0" :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:Die Daten sehe ich, aber es ist immer class="0" :(
Hi Jens!

:D Ich habe die Lösung gefunden -->

Code: Alles auswählen

context = simpleTALES.Context(allowPythonPath=True)
Ohne dieses allowPythonPath arbeitet simpleTAL sehr eingeschränkt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hey, super :lol: Aber sag mal, warum komm ich da nicht drauf :oops:

Ich frag mich nur, warum das per default ausgeschaltet ist? Könnte das eine "Sicherheitslücke" sein? Von wegen blos keinen Python-Code im Template oder so?

EDIT: Hier ist die Antwort:
By default Python TAL paths (e.g. 'python: 1 + 2') are not allowed. If you require them, and you completely trust the authors of the templates, they can be enabled by passing in allowPythonPath=1.
Nun frag ich mich, ob ich mir vertrauen kann :roll:

Ich sollte mal schauen, ob ich nicht irgendwie die Log Funktion nutzten kann, dann hätte ich einen Hinweis bekommen.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

gerold hat geschrieben:Da ist irgend ein Fehler beim Logging im Modul "simpleTALES.py". Damit möchte ich mich aber nicht weiter beschäftigen.

Wenn man den Import von "logging" unterbindet, dann funktioniert es bei mir.
Ich glaube es lag nicht am Dummy-Logging Modul, sondern nur am fehlenden allowPythonPath=True ;)

Naja, wie dem auch sei, ich glaube die einfachere String-Variante ist besser/kürzer... Hier mal ein vergleich:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<div tal:repeat="data example" tal:omit-tag="">
<tr tal:define="odd repeat/data/odd"
        tal:attributes="class python:str(test(odd, 'css_odd', 'css_even'))"
    >
    <td tal:content="repeat/data/number">Aufzählung</td>
    <td tal:content="data/char">Buchstaben</td>
</tr>
</div>
</table>
<style type="text/css">
    .css_odd {background-color:#EEEEEE;}
    .css_even {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 91)]

context = simpleTALES.Context(allowPythonPath=True)
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
Einfachere String-Variante:

Code: Alles auswählen

import sys
from simpletal import simpleTAL, simpleTALES

template = """
<table>
<tr tal:repeat="data example"
    tal:attributes="class string:color${'repeat/data/odd'}"
>
    <td tal:content="repeat/data/number">Aufzählung</td>
    <td tal:content="data/char">Buchstaben</td>
</tr>
</table>
<style type="text/css">
    .color0 {background-color:#EEEEEE;}
    .color1 {background-color:#DDDDDD;}
</style>
"""
data = [{"char":chr(i)} for i in range(65, 70)]

context = simpleTALES.Context()
context.addGlobal("example", data)

template = simpleTAL.compileHTMLTemplate(template)
template.expand(context, sys.stdout)
Natürlich hat, deine Variante Vorteile, weil man den CSS-Klassennamen vollkommen frei wählen kann...
Die String-Variante ist dafür allerdings einen Tick schneller ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Jens!
jens hat geschrieben:Ich glaube es lag nicht am Dummy-Logging Modul, sondern nur am fehlenden allowPythonPath=True ;)
Das es an allowPythonPath=True gescheitert ist, das glaube ich sofort, aber kommt jetzt statt der richtigen, aussagekräftigeren Fehlermeldung immer No handlers could be found for logger "simpleTALES.Context"? Ich weiß nicht, was man tun muss, damit der Logger richtig funktioniert.
jens hat geschrieben: Naja, wie dem auch sei, ich glaube die einfachere String-Variante ist besser/kürzer...
[...]
Natürlich hat, deine Variante Vorteile, weil man den CSS-Klassennamen vollkommen frei wählen kann... Die String-Variante ist dafür allerdings einen Tick schneller ;)
Es tut mir leid, dass ich dich damit unnötig aufgehalten habe. Ich würde auch eher deine ursprüngliche Variante :!: verwenden -- mir ging es nur darum, aufzuzeigen, dass TAL nicht so extrem eingeschränkt ist wie es aus deinem Beispiel hervor zu gehen schien.

Wenn du auch noch METAL einsetzt, dann hast du ein ziemlich mächtiges Vorlagensystem in der Hand. Da ich dein pyLucid noch nicht kenne, weiß ich aber nicht ob der Einsatz von METAL überhaupt zur Struktur von pyLucid passt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

gerold hat geschrieben:Es tut mir leid, dass ich dich damit unnötig aufgehalten habe.
Das ist ja wohl ein Scherz :shock: oder? Ich meine du hast mir immerhin geholfen und mich nicht aufgehalten!
Ich verstehe TAL nun etwas besser.
gerold hat geschrieben:Wenn du auch noch METAL einsetzt, dann hast du ein ziemlich mächtiges Vorlagensystem in der Hand. Da ich dein pyLucid noch nicht kenne, weiß ich aber nicht ob der Einsatz von METAL überhaupt zur Struktur von pyLucid passt.

Ehrlich gesagt, weiß ich nicht recht was METAL so genau ist :oops: Es hat irgendwas mit Macros zu tun???

In PyLucid hab ich zwei verschiedene Ebenen in den Templates sinnvoll sind. TAL hatte ich erstmal nur für die internen-Seiten gedacht. Das sind quasi nur die dynamischen Teile der gesammt Seite. z.B. das Login-Forumular, die Tabelle für die RSS-Daten oder auch das HTML-Forumlar zum editieren der CMS-Seiten und auch das HTML-Forumular zum editieren der internen Seiten selber ;)
Die andere Ebene sind die Seiten-Templates für die gesammte HTML-Seite mit lucid-Tags für die Postition des Menü's <lucidTag:main_menu/> oder den Seiteninhalt <lucidTag:page_body/>...

Ich überlege, ob ich vielleicht auch diese Ebene mit TAL machen sollte... Aber ich weiß nicht wie das gehen soll... Ich benötige dafür so eine Art call-back Funktion... Das System weiß nämlich nicht welche Tag's wirklich vorkommen (RSS-Feed <lucidFunction:RSS>...</lucidFunction> in der Seite?, Suchfunktion <lucidTag:search/> in der Seite? usw.).
Momentan mach ich das ganz einfach mit einer re-Suche:
lucidTag's:

Code: Alles auswählen

content = re.sub( "<lucidTag:(.*?)/?>", self.handle_tag, content )
lucidFunction's:

Code: Alles auswählen

content = re.sub( "<lucidFunction:(.*?)>(.*?)</lucidFunction>", self.handle_function, content )
Das funktioniert ganz gut. Ist das Tag keine allgemeine Methode, kommt der ModulManager und sucht nach einem passenden Modul, führt dieses aus und die Ergebnisse gehen dann wieder zu re.sub zurück...

Macht es Sinn das evtl. auch mit TAL zu machen???

EDIT: Hast du generell ein paar gute Links zum Thema TAL???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Jens!
jens hat geschrieben:Ich verstehe TAL nun etwas besser.
Das freut mich :D
jens hat geschrieben:Ehrlich gesagt, weiß ich nicht recht was METAL so genau ist :oops: Es hat irgendwas mit Macros zu tun???
TAL fügt dynamische Elemente (Variablen, Listen, ...) in den Text ein.
METAL fügt Text in Text ein und generiert dadurch eine kombinierte Seitenvorlage.

Mit METAL kannst du dir z.B. eine Haupt-Vorlage definieren. Diese Haupt-Vorlage kannst du dann von jeder Seite aus aufrufen.

In der Hauptvorlage definierst du so genannte Slots, das sind Positionsangaben, die du von der aufrufenden Vorlage aus mit Text befüllen kannst. So kannst du genau definieren, wo dein Menü und wo dein Hauptbereich liegen soll.

METAL wird immer vor TAL ausgeführt. Zuerst wird also mit Hilfe von METAL aus mehreren Seitenvorlagen (Haupt- und Seitenvorlage) eine einzige Vorlage. Diese wird dann mit TAL ausgeführt.
jens hat geschrieben:In PyLucid hab ich zwei verschiedene Ebenen in den Templates sinnvoll sind. TAL hatte ich erstmal nur für die internen-Seiten gedacht. Das sind quasi nur die dynamischen Teile der gesammt Seite.
Das finde ich super.
jens hat geschrieben:Die andere Ebene sind die Seiten-Templates für die gesammte HTML-Seite mit lucid-Tags für die Postition des Menü's <lucidTag:main_menu/> oder den Seiteninhalt <lucidTag:page_body/>...

Ich überlege, ob ich vielleicht auch diese Ebene mit TAL machen sollte...
[...]
Macht es Sinn das evtl. auch mit TAL zu machen???

METAL ist ideal dafür geeignet, eine komplette Website zu erstellen, da man einfach nur ein paar Vorlagen definiert und diese dynamisch mit Content befüllen kann. Das würde, glaube ich, dein komplettes pyLucid verändern. Ist es das Wert :?:

Falls du aber doch deine Hauptvorlage mit METAL umsetzt, dann sind auch solche Spielereien möglich, wie z.B. das Verändern des STYLE-Tags im Head von jeder Seite aus.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import sys
from simpletal import simpleTAL, simpleTALES

main_template = \
"""<div metal:define-macro="master" tal:omit-tag=""><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-15" />

  <!-- CSS-Slot BEGIN -->
  <div metal:define-slot="css_slot" tal:omit-tag="">
  </div>
  <!-- CSS-Slot END -->

</head>
<body>

<table border="1" width="90%" align="center">
  <tr>
   
    <!-- Menü-Slot BEGIN -->
    <td>
      <div metal:define-slot="menu" tal:omit-tag="">
         <b>Menü 1</b><br />
         <b>Menü 2</b>
      </div>
    </td>
    <!-- Menü-Slot END -->
   
    <!-- Haupt-Slot BEGIN -->
    <td>
      <div metal:define-slot="main" tal:omit-tag="">
        <p>
          Hier steht der Haupttext.<br />
          Hier steht der Haupttext.
        </p>
      </div>
    </td>
    <!-- Haupt-Slot END -->
   
  </tr>
</table>

</body>
</html>
</div>
"""

page1_template = \
"""<html metal:use-macro="main_template/macros/master"
      xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"
>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-15" />
  
  <!-- Stylebereich BEGIN -->
  <style metal:fill-slot="css_slot">
    .abc {
      color: Green;
    }
  </style>
  <!-- Stylebereich END -->
  
</head>
<body>

  <!-- Hauptbereich BEGIN -->
  <p metal:fill-slot="main" class="abc">
    Dieser Text ist jetzt grün.
  </p>
  <!-- Hauptbereich END -->

</body>
</html>
"""

page2_template = \
"""<div metal:use-macro="main_template/macros/master" tal:omit-tag>

  <!-- Der Seitencontent muss nicht unbedingt eine gültige -->
  <!-- HTML-Seite sein. -->
 
  <!-- Stylebereich BEGIN -->
  <style metal:fill-slot="css_slot">
    .abc {
      color: Red;
    }
  </style>
  <!-- Stylebereich END -->

  <!-- Hauptbereich BEGIN -->
  <p metal:fill-slot="main" class="abc">
    Dieser Text ist jetzt rot.
  </p>
  <!-- Hauptbereich END -->

</div>
"""

context = simpleTALES.Context(allowPythonPath = True)
main_template = simpleTAL.compileHTMLTemplate(main_template)
context.addGlobal("main_template", main_template)

print
print "SEITE 1   " * 5
print
page1 = simpleTAL.compileHTMLTemplate(page1_template)
page1.expand(context, sys.stdout)
print
print
print "SEITE 2   " * 5
print
page2 = simpleTAL.compileHTMLTemplate(page2_template)
page2.expand(context, sys.stdout)
jens hat geschrieben:EDIT: Hast du generell ein paar gute Links zum ThemaTAL???
http://dzug.org/dokumentation/entwicklung/zpt

Du musst beim Lesen nur bedenken, dass du keinen Zugriff auf zope-zypische Variablen wie z.B.
- container
- template
- context oder here
- request
- user
hast.

lg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 29. September 2006, 10:42, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Danke für das Beispiel. Nun weiß ich was METAL so bietet... Das könnte ich für PyLucid schon verwenden, weil die CSS-Erweitern geht bei mir nicht so nicht.
Damit ich aber nicht die Haupt CSS-Angabe mit allen möglichen Angaben zuballer, an die ein normal User überhaupt nicht ran kommt (intene Seiten für eingeloggte User) behelfe ich mir mit mehreren <style>-Tags... Zwar sind die eigentlich nur im <head> Bereich zulässig, aber es klappt im Browser...

Aber du hast schon recht, wenn ich überall TAL benutzten würde, wäre das ein ziemlich großer Umbau... Ich fang erstmal klein an ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten