Willkommen auf dem TF-Infoportal Wiki.

Hier finden Sie alle Informationen über das TF-Infoportal, das Support-System OTRS und das Electures-Portal an der Technischen Fakultät.
Eine globale Navigation finden Sie im Menu links, zur Startseite geht es hier.

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
tf-infoportal:dokumentation:plone:plone-erweiterte-projektliste-nach-stichwort [2012/09/20 16:06] – angelegt ch59tf-infoportal:dokumentation:plone:plone-erweiterte-projektliste-nach-stichwort [2013/11/04 15:47] (aktuell) ch59
Zeile 1: Zeile 1:
-====== Projektliste nach parametrisierbarem Stichwort filtern (XSLTrans, Dynamic Documents) ======+====== Projektliste nach parametrisierbarem Stichwort filtern (XSLTrans, Dynamic Documents) (ALT) ======
 Vorausgesetzte Kenntnisse: HTML, TAL, Python Vorausgesetzte Kenntnisse: HTML, TAL, Python
  
-Im folgenden wird ein Workaround vorgestellt, mit dem es möglich ist, mit Hilfe eines XSLTrans Dokuments, sowie eines Dynamic Documents Projektlisten auszugeben, die mittels eines Parameters (keywords) nach dem Stichwort in der Forschungsdatenbank gefiltert werden können.+Im folgenden wird ein Workaround vorgestellt, mit dem es möglich ist, mit Hilfe eines XSLTrans Dokuments, sowie eines Dynamic Documents Projektlisten auszugeben, die mittels eines Parameters (''keyword'') nach dem Stichwort in der Forschungsdatenbank gefiltert werden können.
  
 Zuerst muss man wie üblich ein XSLTrans Dokument anlegen mit den üblichen Parametern, um eine Projektliste auszugeben. Zuerst muss man wie üblich ein XSLTrans Dokument anlegen mit den üblichen Parametern, um eine Projektliste auszugeben.
Zeile 19: Zeile 19:
       <div tal:define='additionalparams python:(str("LfdNr=") + projectid,str("xql=Stichwort~~\"") + keyword + str("*\""))[len(projectid) == 0]'>       <div tal:define='additionalparams python:(str("LfdNr=") + projectid,str("xql=Stichwort~~\"") + keyword + str("*\""))[len(projectid) == 0]'>
  <!-- Comment in to show debug output <div tal:content="python:str(additionalparams)">XQL goes here</div>-->  <!-- Comment in to show debug output <div tal:content="python:str(additionalparams)">XQL goes here</div>-->
- <div tal:define='Parameters python:("image_float=right","Ausgabeart=xml", "Sprache=D", "dokumentart=Projekt", "Kostenstelle=" + kostenstelle, "Lfdnr=" + projectid, "language=D", "image_float=right", additionalparams); foo python:context.xsltrans_master_forschungsthemen.setParam(Parameters)'> + <div tal:define='Parameters python:("Jahr=alle", "Ausgabeart=xml", "Sprache=D", "dokumentart=Projekt", "Kostenstelle=" + kostenstelle, "Lfdnr=" + projectid, "language=D", "image_float=right", additionalparams); foo python:context.xsltrans_master_forschungsthemen.setParam(Parameters)'> 
    <div tal:content="structure python:context.xsltrans_master_forschungsthemen.get_result()" />     <div tal:content="structure python:context.xsltrans_master_forschungsthemen.get_result()" /> 
  </div>   </div> 
  <!-- reset der Parameter von xsltrans -->   <!-- reset der Parameter von xsltrans --> 
- <div tal:define='Parameters python:("image_float=right","Ausgabeart=xml", "Sprache=D", "dokumentart=Projekt", "Kostenstelle=" + kostenstelle, "language=D", "image_float=right"); foo python:context.xsltrans_master_forschungsthemen.setParam(Parameters)' />+ <div tal:define='Parameters python:("Jahr=alle", "Ausgabeart=xml", "Sprache=D", "dokumentart=Projekt", "Kostenstelle=" + kostenstelle, "language=D", "image_float=right"); foo python:context.xsltrans_master_forschungsthemen.setParam(Parameters)' />
       </div>        </div> 
     </div>     </div>
Zeile 29: Zeile 29:
 </div> </div>
 </code> </code>
 +
 +Im folgenden möchte ich die einzelnen Bestandteile kurz erläutern, da einige Tricks notwendig sind.
 +Zuerst muss man sich überlegen, dass man der Forschungsdatenbank entweder den XQL Parameter ''xql=Stichwort~~"<MeinStichwort>"'' übergeben will, oder den Parameter ''LfdNr=42''. Beide Parameter zu kombinieren funktioniert nicht, da die Forschungsdatenbank dann anscheinend nur den XQL Parameter auswertet.
 +
 +Damit das funktioniert, muss man eine if-then-else Bedingung aufbauen. Das einfachste wäre nun mittels eines ternären Operators zu überprüfen, ob eine projektId übergeben wurde, und falls ja, das Projekt mit dieser laufenden Nummer abzufragen, anderenfalls Projekte mit dem angegebenen Stichwort abzufragen.
 +
 +Das sähe dann in etwa so aus: <code java>parameter = (<Bedingung>) ? "xql=Stichwort~~\"" + keyword + "\"" : "LfdNr=" + projectId</code>
 +
 +Nun gibt es in Python auch den ternären Operator, d.h. in Python sähe das so aus: <code python>"xql=Stichwort~~\"" + keyword + "\"" if <Bedingung> else "LfdNr=" + projectId</code>
 +
 +Das funktioniert in Plone/TAL auf dem CMS der Universität aber leider nicht (oder ich habe die Syntax nicht korrekt hinbekommen), weshalb man einen Trick mit einem Array anwenden muss.
 +
 +<code python>("a", "b")[<bedingung>]</code>
 +
 +Hier wird entweder ''"a"'' zurückgegeben, oder ''"b"'' in Abhängigkeit davon, ob ''<bedingung>'' zu true oder false, d.h. 1 oder 0 evaluiert. 
 +Das funktioniert an dieser Stelle nur, weil boolean eine Subklasse von int ist.
 +
 +Jetzt braucht man noch eine geeignete Bedingung, die allerdings schnell gefunden ist. Wir überprüfen einfach die Länge des Parameters projectId, nachdem wir diesen nach String konvertiert haben:
 +<code xml>
 +<div tal:define="projectid python:str(context.REQUEST.get('projectId',''));">
 +... len(projectid) == 0 ...
 +</div>
 +</code>
 +
 +Kurz rekapituliert, je nachdem wie diese Bedingung evaluiert, wollen wir entweder nach Stichwort filtern:
 +<code ptyhon>str("xql=Stichwort~~\"") + keyword + str("*\"")</code>
 +oder eben ein spezifisches Projekt ausgeben:
 +<code python>str("LfdNr=") + projectid</code>
 +
 +Weiterer Trick: Wir ergänzen hier an dieser Stelle bei der Stichwortabfrage noch einen ''*'' nach dem ''keyword'', falls kein Stichwort übergeben wurde, wird dann die Liste aller Projekte ausgegeben, anstatt keines. Damit das funktioniert, verwenden wir an dieser Stelle im HTML single Quotes, anstatt der Double Quotes, damit das Escapen einfacher wird, da wir für die Forschungsdatenbank ''xql=Stichwort~~"<Stichwort>"'' und nicht ''xql=Stichwort~~<Stichwort>'' übergeben müssen.
 +
 +Das kombinieren wir jetzt mit unserer Bedingung und unserem Array-Trick:
 +<code python>
 +(str("LfdNr=") + projectid, str("xql=Stichwort~~\"") + keyword + str("*\""))[len(projectid) == 0]
 +</code>
 +
 +und verpacken das ganze in eine TAL-Anweisung:
 +<code xml>
 +<div tal:define='additionalparams python:(str("LfdNr=") + projectid,str("xql=Stichwort~~\"") + keyword + str("*\""))[len(projectid) == 0]'>
 +</code>
 +
 +Damit kann dann in den Parametern der zusätzliche Parameter ''additionalparams'' eingebaut werden, der entweder das Stichwort abfragt, oder eben ein bestimmtes Projekt.
 +
 +Jetzt kann dann das Dynamic Document (nennen wir es ''forschungsthema-details-nach-stichwort'') mit folgenden Parameterkombinationen aufrufen: ''forschungsthema-details-nach-stichwort?keyword=Brennstoffzellen'' oder auch ''forschungsthema-details-nach-stichwort?projectId=8076''. Somit kann man auf einer HTML-Seite dann die erstgenannten Links einbindungen und Ergebnislisten, gefiltert nach Stichwort ausgeben.
 +
 + --- //[[hermann@informatik.uni-freiburg.de|Christoph Hermann]] 2012/09/20 16:20//
  
 {{tag>techniker plone tf-infoportal xsltrans parameter}} {{tag>techniker plone tf-infoportal xsltrans parameter}}
QR-Code
QR-Code tf-infoportal:dokumentation:plone:plone-erweiterte-projektliste-nach-stichwort (erstellt für aktuelle Seite)