URL-Parameter über WSL oder XSL ermitteln
30. Juli 2012
Am Beispiel des Veranstaltungskalenders zeigen wir Ihnen, wie Sie URL-Parameter im Zeilentemplate auslesen können.
Ausgehend vom Weblic® Veranstaltungskalender zeigen wir Ihnen, wie Sie einen Wert aus den Objektdaten über das Zeilentemplate aus der URL auslesen können.
Im Beispiel wurde das Objekt einer Veranstaltung zusätzlich zu den Termindaten (von, bis) um eine Statusangabe (frei, belegt, etc.) erweitert. Auf die Pflegemaske wird an dieser Stelle nicht weiter eingegangen, sondern lediglich der Inhalt der Objektdaten angeführt.
Innerhalb des wd:data Bereiches mit der id="dates" wird zu jedem Termineintrag ein Status gesetzt (z.B. status="frei"):
Beispiel: Auszug aus einer Veranstaltung (z.B. /de/veranstaltungen/termine/fruehjahrskonzert-2012.php)
...
<wd:object type="eventMulti">
<wd:data id="title" type="char.text"/>
<wd:data id="description" type="char.text"/>
<wd:data id="keywords" type="char.text"/>
<wd:data id="town" type="char.text"/>
<wd:data id="dates" type="entries.text">
<wd:entry from="2013-05-05 10:30:00" to="2013-05-05 12:00:00" status="frei" />
<wd:entry from="2013-05-19 10:30:00" to="2013-05-19 12:00:00" status="belegt" />
</wd:data>
<wd:data id="text" type="text.standard"><![CDATA[<p>Jeden zweiten Sonntag im Mai verzaubern wir Sie mit einem breiten Angebot an klassischen Stücken von Strauss, Schostakowitsch oder Wagner. Bei schlechtem Wetter ist das Gelände überdacht.</p>]]></wd:data>
<wd:data id="category" type="categories.default">
<wd:category>678677678377</wd:category>
<wd:category>647503647503</wd:category>
</wd:data>
<wd:data id="location" type="char.default">
<wd:category>678677678377</wd:category>
</wd:data>
<wd:data id="enableClickAnalyzer" type="char.default">no</wd:data>
<wd:data id="pageDisplayType" type="char.default"/>
</wd:object>
...Diesen Status lesen Sie über das Zeilentemplate des Veranstaltungskalenders aus. Den URL-Parameter können Sie entweder über wsl:php oder direkt über XSLT auslesen.
Beispiel (wsl:php): Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/lists/eventsMulti.wFilelist.php
... <p class="listEntryDate"> <wsl:php> $showTimeOnSingleDayDates= "<xsl:value-of select="/wFilelist/wData/data[@name = 'showTimeOnSingleDayDates']/text()"/>"; $param = "<xsl:value-of select="@param"/>"; $text_oClock = "<xsl:value-of select="php:functionString('wTexts::getText', 'o_clock')"/>"; // Status von Veranstaltungen auslesen: $path = "<xsl:value-of select="@path" />"; $from = wURL::getParameter($param, 'from'); $to = wURL::getParameter($param, 'to'); $status = wDocumentData::getData($path, "/wd:extension/wd:object/wd:data[@id = 'dates']/wd:entry[@from = '".$from."' and @to = '".$to."']/@status"); print "Status (wsl:php): ".$status; <![CDATA[ if(preg_match("/from=([^&]+)/", $param, $matches)){ $from = $matches[1]; print date("d.m.Y", strtotime($from)); } $isSingleDate = true; if(preg_match("/to=([^&]+)/", $param, $matches)){ $to = $matches[1]; if(substr($from, 0, 10) != substr($to, 0, 10)){ print " - ".date("d.m.Y", strtotime($to)); $isSingleDate = false; } } if($showTimeOnSingleDayDates == '1'){ if($isSingleDate){ if(preg_match("/from=([^&]+)/", $param, $matches)){ $from = $matches[1]; print ", ".date("H:i", strtotime($from))." ".$text_oClock; } if(preg_match("/to=([^&]+)/", $param, $matches)){ $to = $matches[1]; if($to != $from){ print " - ".date("H:i", strtotime($to))." ".$text_oClock; } } } } ]]> </wsl:php> <xsl:variable name="locationID"><xsl:value-of select="wd:extension/wd:object/wd:data[@id='location']/wd:category/text()"/></xsl:variable> <xsl:if test="$locationID != '' and php:functionString('wRepository::documentExists', /wFilelist/wData/data[@name = 'pathLocations']/text())">, <xsl:value-of select="document(concat($wDocumentRoot, /wFilelist/wData/data[@name = 'pathLocations']/text()))//category[@id = $locationID]/@text"/></xsl:if> </p> ...
Beispiel (xslt): Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/lists/eventsMulti.wFilelist.php
... <p class="listEntryDate"> <wsl:php> $showTimeOnSingleDayDates= "<xsl:value-of select="/wFilelist/wData/data[@name = 'showTimeOnSingleDayDates']/text()"/>"; $param = "<xsl:value-of select="@param"/>"; $text_oClock = "<xsl:value-of select="php:functionString('wTexts::getText', 'o_clock')"/>"; <![CDATA[ if(preg_match("/from=([^&]+)/", $param, $matches)){ $from = $matches[1]; print date("d.m.Y", strtotime($from)); } $isSingleDate = true; if(preg_match("/to=([^&]+)/", $param, $matches)){ $to = $matches[1]; if(substr($from, 0, 10) != substr($to, 0, 10)){ print " - ".date("d.m.Y", strtotime($to)); $isSingleDate = false; } } if($showTimeOnSingleDayDates == '1'){ if($isSingleDate){ if(preg_match("/from=([^&]+)/", $param, $matches)){ $from = $matches[1]; print ", ".date("H:i", strtotime($from))." ".$text_oClock; } if(preg_match("/to=([^&]+)/", $param, $matches)){ $to = $matches[1]; if($to != $from){ print " - ".date("H:i", strtotime($to))." ".$text_oClock; } } } } ]]> </wsl:php> <xsl:variable name="locationID"><xsl:value-of select="wd:extension/wd:object/wd:data[@id='location']/wd:category/text()"/></xsl:variable> <xsl:if test="$locationID != '' and php:functionString('wRepository::documentExists', /wFilelist/wData/data[@name = 'pathLocations']/text())">, <xsl:value-of select="document(concat($wDocumentRoot, /wFilelist/wData/data[@name = 'pathLocations']/text()))//category[@id = $locationID]/@text"/></xsl:if> <!-- Status von Veranstaltungen auslesen (xslt): --> <xsl:variable name="paramFrom"><xsl:value-of select="php:functionString('wURL::getParameter', @param, 'from')" /></xsl:variable> <xsl:variable name="paramTo"><xsl:value-of select="php:functionString('wURL::getParameter', @param, 'to')" /></xsl:variable> <xsl:variable name="statusEntry"><xsl:value-of select="wd:extension/wd:object/wd:data[@id = 'dates']/wd:entry[@from = $paramFrom and @to = $paramTo]/@status"/></xsl:variable> <xsl:variable name="statusCSS"> <xsl:choose> <xsl:when test="$statusEntry = 'frei'">green</xsl:when> <xsl:when test="$statusEntry = 'belegt'">red</xsl:when> <xsl:otherwise>grey</xsl:otherwise> </xsl:choose> </xsl:variable> Status: <span style="color:{$statusCSS}"><xsl:value-of select="$statusEntry" /></span> </p> ...
In der generierten Liste kann das z.B. wie folgt aussehen:
- Wie kann ich URL-Parameter im Zeilentemplate eines Veranstaltungskalenders auslesen?
- Im Veranstaltungskalender können Werte aus den Objektdaten über das Zeilentemplate aus der URL ausgelesen werden. Dazu werden die URL-Parameter (z. B. <code class="codeInline">from</code> und <code class="codeInline">to</code>) sowohl in <code class="codeInline">wsl:php</code> als auch direkt über XSLT verwendet.
- Ab welcher Version ist die Methode „URL-Parameter über WSL oder XSL ermitteln“ nutzbar?
- Die Anleitung ist „Nutzbar ab: Version 30. Juli 2012“ angegeben.
- Wo wird der Status von Veranstaltungsterminen in den Objektdaten gespeichert?
- Der Status wird innerhalb des <code class="codeInline">wd:data</code>-Bereichs mit der <code class="codeInline">id="dates"</code> gespeichert. Zu jedem Termineintrag existiert ein <code class="codeInline">wd:entry</code>, z. B. mit <code class="codeInline">status="frei"</code> oder <code class="codeInline">status="belegt"</code>.
- Wie lese ich den Status in <code class="codeInline">wsl:php</code> aus den URL-Parametern <code class="codeInline">from</code> und <code class="codeInline">to</code> aus?
- Beispielhaft wird in <code class="codeInline">wsl:php</code> zunächst der Parameterstring aus dem Template gelesen und dann die Werte mit <code class="codeInline">wURL::getParameter($param, 'from')</code> und <code class="codeInline">wURL::getParameter($param, 'to')</code> ermittelt. Anschließend wird per <code class="codeInline">wDocumentData::getData()</code> der passende <code class="codeInline">wd:entry</code> anhand von <code class="codeInline">@from</code> und <code class="codeInline">@to</code> gesucht und dessen <code class="codeInline">@status</code> ausgegeben.
- Wie lese ich den Status direkt in XSLT aus?
- In XSLT werden die URL-Parameter über <code class="codeInline">php:functionString('wURL::getParameter', @param, 'from')</code> und <code class="codeInline">php:functionString('wURL::getParameter', @param, 'to')</code> in Variablen (<code class="codeInline">paramFrom</code>, <code class="codeInline">paramTo</code>) übernommen. Danach wird der Status per XPath aus <code class="codeInline">wd:data[@id='dates']/wd:entry[@from = $paramFrom and @to = $paramTo]/@status</code> gelesen.
- Wie kann der Status in XSLT optisch (z. B. per Farbe) dargestellt werden?
- Im Beispiel wird anhand des ausgelesenen Status (<code class="codeInline">frei</code>, <code class="codeInline">belegt</code>, sonst <code class="codeInline">grey</code>) eine Variable <code class="codeInline">statusCSS</code> per <code class="codeInline"><xsl:choose></code> gesetzt (z. B. <code class="codeInline">green</code> für <code class="codeInline">frei</code>, <code class="codeInline">red</code> für <code class="codeInline">belegt</code>) und anschließend der Statuswert ausgegeben.
- Welche URL-Parameter werden im Beispiel für die Status-Ermittlung verwendet?
- Im Beispiel werden die Parameter <code class="codeInline">from</code> und <code class="codeInline">to</code> genutzt. Damit wird der relevante Termineintrag in <code class="codeInline">wd:entry</code> über <code class="codeInline">@from</code> und <code class="codeInline">@to</code> gefunden.
- Wie werden im Beispiel bei einzelnen Tagen zusätzlich Uhrzeiten ausgegeben?
- Zusätzlich wird geprüft, ob es sich um ein einzelnes Datum handelt, indem <code class="codeInline">from</code> und <code class="codeInline">to</code> hinsichtlich des Datumsanteils verglichen werden. Wenn <code class="codeInline">showTimeOnSingleDayDates == '1'</code> und es sich um ein einzelnes Datum handelt, wird die Uhrzeit aus <code class="codeInline">from</code> (und bei nicht identischen Werten aus <code class="codeInline">to</code>) formatiert ausgegeben.
- Wie kann ich im Zeilentemplate die Anzeige von Datum/Uhrzeit mit <code class="codeInline">showTimeOnSingleDayDates</code> steuern?
- Das Beispiel liest <code class="codeInline">showTimeOnSingleDayDates</code> aus den Listendaten aus und nutzt die Variable in der Template-Logik, um zu entscheiden, ob bei einem einzigen Tag zusätzlich die Uhrzeit angezeigt werden soll.