Die API-Funktion ZMSObject.getBodyContent() prüft beim Erzeugen des HTML-Strom, ob im Kontext ein Objekt bzw. eine Methode namens getCustomBodyContent() existiert und übergibt dieser abschließend ggf. den HTML-Ausgabestrom (sog. "hook"). Wenn man ein entsprechendes Python-Script oder eine DTML-Methode getCustomBodyContent auf Template-Ebene einsetzt, kann man die HTML-Ausgabe verändern. Im folgenden Beispiel (Python-Script) werden inline-Links in die deklarative Syntax umgewandelt.

Screenshot

Aus Peformance-Gründen werden Inline-Links primär nicht transformiert - auch bei aktivierter Option 'Deklarative URLs'. Man kann diese per getCustomBodyContent-Hook ex-post syntaktisch korrigieren.

 

Der folgende Code stammt von T. Kraemer : [zms-developers] Declarative URL's - Workaround:

# Parameter List: html, REQUEST #

try:
    start = 'href=\"./'
    end = '\"'    
    while True:
        i = html.find(start)
        j = html.find(end, i+len(start))
        if i < 0 or j < 0:
            break
        href = html[i+len(start):j]
        ids = href.split('/')
        ids[-1:] = ids[-1].split('#')
        # ob = REQUEST['ZMS_THIS']
        ob = context.this()
        for id in ids:
            if not id or id.startswith('index'):
                continue
            if id == '..':
                ob = ob.getParentNode()
            else:
                ob = getattr(ob, id, None)
                html = html
            if not ob:
                # Invalid href
                href_new = href
                break
        else:
            href_new = ob.getHref2IndexHtml(REQUEST)
        html = html.replace('./'+href, href_new)

    return html

except Exception, err:
    return err

Erstellt von: Dr. Frank Hoffmann , SNTL Publishing , erstellt am:  15.09.2010 , zuletzt geändert: 22.09.2011