Screenshot kinderkrebsinfo.de
Autor: R. Herold, F. Hoffmann, 23.07.2003
Das KPOH-Projekt ist einer der wichtigen Ausgangspunkte von ZMS 2.0. Die bedeutsamsten Merkmale sind die LDAP-Integration, der defaultmässige EPOZ-Editor, ein angepasstes Metaset und diverse, teilweise sehr komplexe Spezielle Objekte (Kalender). Zudem existiert eine ZMS-Aktion zum Erzeugen von DOI-Codes. In der folgenden Dokumentation werden die wichtigsten Eckpunkte der Konfiguration genannt.
Screenshot kinderkrebsinfo.de
Die User werden über das ZMS-Root-Menü "Zugriff" erreicht; in diesem Menü werden Nutzer und Rollen separat generiert. Auf der Übersichtsseite wird jeder "Nutzer" wird zunächst ohne Rolle initialisiert (Login-Name, Passwort, E-Mail, Hyperlink auf Profildaten). In einem Nutzer-spezifischen Sub-Menü werden beliebig viele Content-Knoten ausgewählt, auf denen der Nutzer unterschiedliche Rechte bzw. Rollen haben kann. Für das Zuweisen der Zugriffs-Knoten ('local roles') sind folgende Eigenschaften obligatorisch zu definieren: Sprache(n), URL des Content-Knotens (über ein Sitemap-Popup) und zugehörige Rolle(n). Per default existieren die bekannten Rollen: Admin, Redakteur, Autor und Abonnent.
(Hinweis: seit der CVS-Version des LDAPUserFolder 2.2+, neuer als 08.08.03, wird dn korrekt übergeben; zudem wurden Sicherheitslücken bei zertifikatsbedingter Authentifizierung bearbeitet.)
ZMS-Zugangsverwaltung mit LDAP-Interface; als Authentisierungs-Name wird derjenige verwendet, der in der Zope-LDAPUserFolder-Konfiguration als 'Login Name Attribute' spezifiziert ist.
Spezifikation der individuellen Rechte; für jeden Konten können Rollen und Sprachen zugewiesen werden.
Konfiguration des LDAPUserFolders für die Kommunikation mit dem LDAP-Service; das Produkt ist unbedingt erforderlich.
Zur Indexierung von Binärformaten kommt das Zope-Produkt TextIndexNG 2.0 zum Einsatz und erweitert ZCatalog. In die Entwicklung von TextIndexNG 2.0 wurde ausgenommen, das zukünftig die ZMS-Objekte stets mitindexiert werden (so daß Anpassungen bei Update entfallen). Weiterhin wurde eine 'CatalogAware'-Funktion eingeführt, die eine inkrementelle Indexierung für jede Objektmodifikation erlaubt; damit ist der Index stets aktuell.
Das differenzierte Suchinterface besteht aus einem Textabschnitt, der DTML-Code (Download s. Teaser oben rechts) für die Spezifikation der Suche enthält.
<a title="Edit!" <dtml-if "REQUEST.get('preview','')=='preview'">target="_parent"</dtml-if> href="manage?lang=<dtml-var lang>" style="color:red;text-decoration:none"> ·&bsp;</a><dtml-with "getSelf(['ZMSRubrik'])">
<dtml-in "filteredChildNodes(REQUEST,['ZMSRubrik'])">
<dtml-if
"getObjProperty('attr_dc_type',REQUEST)!='Resource'">
<p><i><a
href="<dtml-var "getHref2IndexHtml(REQUEST,deep=0)">"
style="text-decoration:none">
<dtml-var "getTitle(REQUEST)"></a></i></p>
<ol>
<dtml-in "filteredChildNodes(REQUEST,PAGES)">
<li>
<a href="<dtml-var "getHref2IndexHtml(REQUEST,deep=0)">"
><dtml-if "getObjProperty('attr_dc_date',REQUEST)">
[<dtml-var
"getLangFmtDate(getObjProperty('attr_dc_date',
REQUEST),lang,'DATE_FMT')">]
</dtml-if>
<dtml-var "getTitle(REQUEST)"></a>
<br /></li>
</dtml-in>
</ol>
</dtml-if>
</dtml-in>
</dtml-with>
Da die initiale Seite unter einem der primären Channel-Knoten liegt exitiert eine start.dtml, die Apache adressiert, wenn der Rquest auf das Root geht:
<!-- BO start.html -->
<dtml-call
"RESPONSE.redirect(content.e1664.absolute_url())">
<!-- EO start.html -->
Die Website ist bilingual (ger, eng) konfiguriert; für die Sprachvarianten exitiert ein Dictionary, der die Mehrsprachkeit der Navigations-Strings gewährleistet. Der Sprachselektor in bodyContent_FunctionTranslate funktioniert ohne JS.
Falls der User das finale "index+morphem" nicht in der URL aufruft, wird zur vom Browser identifizierten Sprache geleitet.
Neben der normalen Druckversion von Einzelseiten mit der üblichen Funktion:
<a href="index_print_ger.html" target="_blank"><dtml-var "getLangStr('ATTR_PRINTVERSION',lang)"></a>
ist es möglich, längere Druckwerke zu erzeugen. Über eine Abfrage nach 'attr_dc_type'='Chapter' wird im bodyContent_Copyright-Template eine optionale Kapiteldruck-Option eingeblendet. Der Kapiteldruck erzeugt durch rekursive Assemblierung einen Contentstrom, der als PDF-Datei ausgegeben wird. Dafür kommt über einen vergleichbaren Aufruf <a href="index_print.pdf?lang=<dtml-var lang>" target="_blank"><dtml-var "getLangStr('PRINTCHAPTER',lang)"></a> folgende DTML-Methode zum Einsatz:
<!-- BO index_print.pdf -->
<dtml-call "REQUEST.set('l',[])">
<dtml-call "l.append('<html>\n')">
<dtml-call "l.append('<body>\n')">
<dtml-call "REQUEST.set('obs',[getSelf()])">
<dtml-call "obs.extend(getTreeNodes(REQUEST))">
<dtml-let level="obs[0].getLevel()">
<dtml-in obs>
<dtml-if "isPage()">
<dtml-call "l.append('<h%i>'%(getLevel()-level+1)+
getTitle(REQUEST)+'</h%i>'%(getLevel()-level+1)+'\n')">
<dtml-elif "isPageElement()">
<dtml-call "l.append(getBodyContent(REQUEST)+'\n')">
</dtml-if>
</dtml-in>
</dtml-let>
<dtml-call "l.append('</body>\n')">
<dtml-call "l.append('</html>\n')">
<dtml-call "RESPONSE.setHeader('Content-Type',
'application/pdf')">
<dtml-return "html2pdf(''.join(l))">
<!-- EO index_print.pdf -->
Das zentrale DTML-Template newsfeed.xml erzeugt einen RSS-Strom mithilfe der Attributwerte aus den Kalendereinträgen. Die Referenzierung des Kalenders geschieht über die DTML-Methode 'objMap'; dort sind diverse IDs in Form einer Mapping-Tabelle hinterlegt:
'calendar':content.e2331.e54,
'suche':content.e2379,
Hinweis: Mehr über RSS finden Sie hier.