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

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