Varibable in Scriptbereich

  • Hallo mal wieder! :D

    Diesmal möchte ich eine Template-Variable in einem Script-Bereich einfügen. Dabei meckert aber der HTML-Parser:

    Zitat

    Compilation failed
    TAL.HTMLTALParser.NestingError: Open tags <html>, <body>, <div>, <script> do not match close tag </tal:block>, at line 29, column ...


    Zwar zurecht, was die Tags im template angeht (innerhalb von <script> sind ja keine Tags erlaubt). Allerdings werden die Tags ja für den Output eh entfernt.

    Konkret handelt es sich um ein Tracking-Tool, welchem Seitenname und Sprache für die Auswertung übergeben werden sollen. Mein Code bisher in etwa so:

    Code
    <script type="text/javascript">
    // Begin own parameters.
    <tal:block tal:replace="string: page_name='$page_title';"> PAGE NAME </tal:block>
    <tal:block tal:replace="string: group_name='$language';"> GROUP NAME </tal:block>
    // End own parameters.
    </script>


    EDIT: Variante 2 - frisst zwar der Parser, führt aber zu einem Traceback beim Seitenaufruf:

    Code
    <script type="text/javascript" tal:content="string: page_name='${page_title}';; group_name='${language}';;">
      // Inhalt des Script-Bereichs
    </script>


    Jemand eine Idee, wie ich den Parser überlisten kann, oder wie ich die Variableninhalte sonst an das Script übergeben kann?

    TIA
    marX

  • Was so ein wenig Try&Error alles bewirken kann... :roll:

    Ich bin fälschlicherweise davon ausgegangen, dass die in anderen Templates definierten Variablen auch im Footer gelten. So gehts jetzt jedenfalls:

    Code
    <script type="text/javascript"
            tal:define="page_title object_title; lang language;"
            tal:content="string: page_name='${page_title}'; group_name='${lang}';">
      // Inhalt des Script-Bereichs
    </script>
  • Ich mach jetzt mal kein neues Thema auf, weils hier noch recht gut passt.

    Dem Script (genauer dem noscript-Fallback) muss der Seitentitel urlencodet übergeben werden. Wie krieg ich das am besten hin?

    Code
    tal:define="pretty_title   python:urllib.quote(object_title);


    führt zu einem Trackeback: "NameError: name 'urllib' is not defined"
    Wahrscheinlich muss ich die urllib noch irgendwie importieren - nur wie? Über "modules['urllib']" statt "urllib" bekomme ich eine Zugriffsverletzung.

  • Richtig - es können nicht alle Py-Module importiert werden. Die Script (Python) laufen in einem Restriction-Mode. Z.B. kann man da auch nicht re importieren. Dies muss man für diese Zope-Instanz explizit zulassen bzw. eine externe Methode verwenden, da diese pure Python ist. :)

    Für deinen Fall würden sich jedoch die Methoden anbieten, die Zope/CMF/Plone selbst anbieten. Es gibt ja Plone-Tools und -Utilities, die jede Menge Funktionen und Methoden bereitstellen. Auch kann man direkt von den Zope-Modulen (Products) einige Methoden nutzen.

    Versuche also mal dies:

    Code
    ...
      tal:define="pss          modules/Products.PythonScripts.standard;
                  pretty_title python: pss.url_quote(object_title);"
    ...

    Torty

    "Carpe Diem" powered by positiv Feelings

  • Ja so gehts, danke! Jetzt muss ich nur noch sehen ob das externe Tool ein Problem damit hat, dass die Umlaute UTF8-codiert sind (d.h. z.B. 'ö' wird zu %C3%B6 statt %F6)

    Aber danke erstmal! :)