Bereiche abhängig von der Anzahl an Elementen ausblenden
31. Januar 2012
bereich block ausblenden div elemente anzahl
Blenden Sie Bereiche aus, wenn diesen keine Inhalte zugewiesen wurden, um z.B. leere DIV-Container zu vermeiden.
Anhand der BASE Projektbasis wird Ihnen die Möglichkeit beschrieben, wie Sie den DIV-Container mit der id="blockBefore" ausblenden, falls sich darin keine Elemente befinden.
In diesem Block können globale oder navigationsabhängige Inhalte gesetzt bzw. zugewiesen werden. Ist kein globaler Inhalt und auch kein navigationsabhängiger Inhalt zugewiesen, würde der DIV-Container mit der id="blockBefore" ohne Inhalt generiert werden. Dies kann je nach Projektumsetzung zu Darstellungsproblemen führen.
Für die Abfrage, wieviel Elemente in einem Bereich eingelesen wurden, greifen Sie auf die Framework-Funktionen der Framework-Klasse wOutput zurück (setNumberItemsDisplayed und getNumberItemsDisplayed).
Über WSL können Sie dann abhängig von der Anzahl an Elementen (wd:item) den gewünschten Bereich anzeigen oder ausblenden. wsl:ifGlobalValue liefert Ihnen hierzu das Instrument zur Abfrage des gesetzten globalen Wertes.
Um in der Bearbeitung trotz ausgeblendetem Bereich Elemente hinzufügen zu können, versehen Sie die Abfrage mit der Prüfung auf den Editor ($wIsInEditor).
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/standard.wDocument.php zu blockBefore
... <xsl:value-of select="php:functionString('wOutput::setNumberItemsDisplayed', '0')"/> <wsl:ifGlobalValue key="hideBlockBefore" operator="!=" term="1" debug="0"> <div id="blockBefore"> <div id="blockBeforeInner"> <div id="areaContent3Global"> <!-- Globale Inhalte oben--> <xsl:call-template name="content3Global" wd:pathTemplate="misc/includes.global.php#content3Global"/> </div> </div> </div> </wsl:ifGlobalValue> <xsl:if test="php:functionString('wOutput::getNumberItemsDisplayed')< 3 and not($wIsInEditor)"> <xsl:value-of select="php:functionString('wEnv::setGlobalValue', 'hideBlockBefore', '1')"/> </xsl:if> <!--<xsl:value-of select="php:functionString('wOutput::getNumberItemsDisplayed')"/>--> ...
Erläuterungen zur Umsetzung
Beachten Sie, dass über die Framework-Funktion wOutput::getNumberItemsDisplayed die Anzahl an sichtbaren und somit eingelesenen Elementen hochgezählt wird, die bis zum Aufruf dieser Funktion in der Seite generiert wurden!
Um sicherzustellen, dass für einen Block die Anzahl korrekt ermittelt werden kann, sollten Sie über die Framework-Funktion wOutput::setNumberItemsDisplayed den Wert vor dem betreffenden Block auf Null setzen.
Weiterhin sollten Sie beachten, dass in einem Bereich auch Elemente bestehen können, die nur zum Einlesen anderer Elemente verwendet werden. Im Beispiel sind dies im blockBefore die beiden Elemente für das Einlesen von navigationsabhängigen Inhalten (content.includeContentNavigation) und für zusätzliche Inhalte der jeweiligen Seite (content.includeContentCurrentPage), welche nachfolgend auszugsweise zur default.php angeführt sind.. Diese Anzahl müssen Sie also von der gewünschten zu prüfenden Anzahl abziehen. Im Beispiel wird aus diesem Grund wOutput::getNumberItemsDisplayed auf einen Wert kleiner 3 geprüft und dann der globale Wert hideBlockBefore zur Steuerung der Abfrage gesetzt.
Beispiel: Auszug aus /[IHR-INHALTS-PROJEKT]/wGlobal/content/contentPortal/default.php zu content3
... <wd:group id="content3"> <wd:item type="content.includeContentNavigation" uid="22add89e80a6bff0bf5d1e2ec8d1372f"> <wd:fragment id="title" type="char.text"/> <wd:fragment id="display" type="char.display"/> </wd:item> <wd:item type="content.includeContentCurrentPage" uid="4a285188d80eda4eccd631e8f65ac804"> <wd:fragment id="title" type="char.text"/> <wd:fragment id="display" type="char.display"/> </wd:item> </wd:group> ...
- Warum sollten Bereiche abhängig von der Anzahl an Elementen ausgeblendet werden?
- Um leere DIV-Container zu vermeiden und so mögliche Darstellungsprobleme zu verhindern, wenn einem Bereich keine Inhalte zugewiesen wurden.
- Wann wird der DIV-Container mit der id="blockBefore" ohne Inhalt generiert?
- Wenn in dem Bereich kein globaler Inhalt und auch kein navigationsabhängiger Inhalt zugewiesen wird, würde der DIV-Container mit der id="blockBefore" ohne Inhalt generiert werden.
- Wie kann ich prüfen, wie viele Elemente in einem Bereich eingelesen wurden?
- Dazu greifen Sie auf die Framework-Funktionen der Klasse wOutput zurück: setNumberItemsDisplayed (zum Zurücksetzen) und getNumberItemsDisplayed (zum Abfragen der Anzahl).
- Wie steuere ich das Anzeigen oder Ausblenden eines Bereichs abhängig von der Elementanzahl?
- Über WSL: Nutzen Sie wsl:ifGlobalValue zur Abfrage globaler Werte und setzen Sie z.B. abhängig von der Anzahl an Elementen einen globalen Schalter wie hideBlockBefore, um den Bereich ein- oder auszublenden.
- Welche Rolle spielt wOutput::setNumberItemsDisplayed?
- Damit die Anzahl korrekt ermittelt werden kann, sollten Sie den Wert vor dem jeweiligen Block mit wOutput::setNumberItemsDisplayed auf Null setzen.
- Was bedeutet es, dass wOutput::getNumberItemsDisplayed nur die bis dahin generierten Elemente hochzählt?
- Die Anzahl der sichtbaren und eingelesenen Elemente wird hochgezählt, die bis zum Aufruf von getNumberItemsDisplayed auf der Seite bereits generiert wurden.
- Warum müssen bei der Prüfung auf die Elementanzahl zusätzliche Einlese-Elemente berücksichtigt werden?
- In einem Bereich können auch Elemente existieren, die nur zum Einlesen anderer Elemente dienen. Diese zählen bei der Ermittlung der Anzahl mit, müssen daher von der gewünschten Prüfanzahl abgezogen werden (z.B. im Beispiel blockBefore: content.includeContentNavigation und content.includeContentCurrentPage).
- Wie kann ich trotz ausgeblendeten Bereichen Elemente im Editor hinzufügen?
- Versehen Sie die Abfrage mit der Prüfung auf den Editor, z.B. mit $wIsInEditor, sodass das Ausblenden im Editor unterbleibt bzw. das Hinzufügen von Elementen möglich bleibt.
- Wie wird im Beispiel blockBefore der globale Schalter hideBlockBefore gesetzt?
- Im Beispiel wird geprüft, ob die Elementanzahl unterhalb eines Schwellenwerts liegt und nicht im Editor gearbeitet wird. Dann wird via wEnv::setGlobalValue der globale Wert hideBlockBefore auf '1' gesetzt, um den Container blockBefore über wsl:ifGlobalValue später auszublenden.