Reduzierung von IF-ELSE-Konstrukten durch die Verwendung eines Smart-Parameters bei einer FS-Ausgabe

Hallo,

in unserem jetztigen Projekt, kam es bei der Umsetzung von Templates sehr oft vor, dass wir bei fast jeder Textausgabe einen IF....END_IF-Konstrukt um die Ausgabe des Textes bauen mussten, um sicher zu stellen, dass der dazugehörige HTML-Container nur ausgegeben wird,  wenn der Text tatsächlich existiert. Damit sichert man die Ausgabe von unnötigen Fehlermeldungen in Ausgabenkanälen.

Das folgende Beispiel soll es verdeutlichen:

----------------------------------------------

Code 1: HTML-Ausgabe vor der Prüfung (vorher):

<div class="contact-bar">

   <div class="row content">

      <div class="large-6 columns">

         <h1 class="fancy"><span>$CMS_VALUE(gc_contact_headline_footer)$</span></h1>

         <p>$CMS_VALUE(gc_contact_text_footer)$</p>

         <button class="button"> <span>$CMS_VALUE(gc_contact_buttontext_footer)$</span> </button>

      </div>

     <div class="large-6 columns">

         <h1 class="fancy"><span>$CMS_VALUE(gc_newsletter_headline_footer)$</span></h1>

         <p>$CMS_VALUE(gc_newsletter_text_footer)$</p>

         <button class="button"> <span>$CMS_VALUE(gc_newsletter_buttontext_footer)$</span> </button>

      </div>

   </div>

</div>

----------------------------------------------

Code 2: Lösungsansatz mit Hilfe von IF-ELSE-Konstrukten (nachher):

<div class="contact-bar">

   <div class="row content">

      <div class="large-6 columns">

         $CMS_IF(!gc_contact_headline_footer__ikam.isEmpty)$

         <h1 class="fancy"><span>$CMS_VALUE(gc_contact_headline_footer)$</span></h1>

         $CMS_END_IF$

        $CMS_IF(!gc_contact_text_footer.isEmpty)$

         <p>$CMS_VALUE(gc_contact_text_footer)$</p>

         $CMS_END_IF$

         $CMS_IF(!gc_contact_buttontext_footer.isEmpty)$

         <button class="button"> <span>$CMS_VALUE(gc_contact_buttontext_footer)$</span> </button>

         $CMS_END_IF$

      </div>

     <div class="large-6 columns">

         $CMS_IF(!gc_newsletter_headline_footer__ikam.isEmpty)$

         <h1 class="fancy"><span>$CMS_VALUE(gc_newsletter_headline_footer)$</span></h1>

         $CMS_END_IF$

        $CMS_IF(!gc_newsletter_text_footer.isEmpty)$

         <p>$CMS_VALUE(gc_newsletter_text_footer)$</p>

         $CMS_END_IF$

         $CMS_IF(!gc_newsletter_buttontext_footer.isEmpty)$

         <button class="button"> <span>$CMS_VALUE(gc_newsletter_buttontext_footer)$</span> </button>

         $CMS_END_IF$

      </div>

   </div>

</div>

----------------------------------------------

Kommentar

Wie man sehen kann, hat sich die Anzahl der Codezeilen wegen der zahlreichen IF-ELSE-Konstrukte fast verdoppelt (siehe Code-2), nur damit der auszugebende Text (hier <span ...>...</span>) und seinen Container gesichert ist. Was ist, wenn man 100 solche Texte im Code hat, möchte man wirklich für jeden Ausdruck, den man anzeigen möchte, einen IF.... ELSE-Block um diesen Audruck bauen?

Könnte man das nicht so lösen, dass man bei jeder Ausgabe (also an der Stelle, wo der Text ausgegeben wird)  prüft, was man gerne ausblenden möchte, wenn dieser Text nicht existiert, oder wenn irgendeine Bedingung nicht erfüllt ist? Dafür schlage ich folgendes Konzept vor:

###############################################

################# Lösungskonzept ################

a- Grundidee

Das oben geschilderte Problem könnte durch die Erweiterung des FirstSpirit $CMS_VALUE()$-Konstrukts gelöst werden, z.B. durch die Definition einer neuen Methode removeBlock(), die die folgenden Parameter nehmen könnte:

scope - gibt an welchen HTML-Block (Parent, Child) ausgeblendet werden soll.

condition - irgendeine Bedingung

Wie die folgenden Beispiele verdeutlichen:

Beispiel-1:

Falls die Variable "value" empty ist, soll der Block <span class="content"> nicht ausgegeben werden. Dafür gibt man als erster Parameter "nichts" und als zweiter Parameter die gewünschte Bedingung. Damit spart man sich einen IF-ELSE-Block um die Ausgabe herum.

<div class="pp">

    <div class="p">  

        <span class="content">$CMS_VALUE(value, removeBlock(, value.isEmpty))</span>

    </div>

<div>

Beispiel-2:

Ist die Variable "value" nicht gesetzt ist, dann soll der Parent-Block <div class="p"> nicht ausgegeben werden. Dafür gibt man "Parent" als erster Wert der Methode removeBlock.

<div class="pp">

    <div class="p">  

        <span class="content">$CMS_VALUE(value, removeBlock(Parent, (value.isEmpty)))</span>

   </div>

<div>

Beispiel-3:

Ist value=empty, dann soll der parent von parent, nämlich <div class="pp"> nicht ausgegeben werden. Der erste Parameter wäre dann hier wie folgt anzugeben:

<div class="pp">

    <div class="p">  

    <span class="content">$CMS_VALUE(value, removeBlock(Parent:Parent, value.isEmpty))</span>

    </div>

<div>

Beispiel-4:

Wie wäre es mit dem Löschen von Kinder-Elementen?

Vor der Ausgabe - Man könnte hier "Before" als erster Wert der Methode angeben - damit wird bei nicht Erfüllung der Bedingung (zweiter Parameter) den blauen Text nicht ausgegeben.

<div class="pp">

    <div class="p">  

         <div class="a">

             <div class="b"></div>

             <div class="c"></div>

        </div>

        <span class="content">$CMS_VALUE(value, removeBlock(Before, value.isEmpty))</span>      

    </div>

<div>

und für nachträgliche Blöcke könnte man "After" angeben - Damit wird der blaue Block nicht ausgegeben.

<div class="pp">

    <div class="p">  

        <span class="content">$CMS_VALUE(value, removeBlock(After, value.isEmpty))</span>

        <div class="a">

             <div class="b"></div>

             <div class="c"></div>

        </div>              

    </div>

<div>

----------------------------------------------------------------------

Konkretes Beispiel

Trägt man dieses Konzept auf das erste gezeigte Beispiel, dann ergibt sich folgende Ausgabe:

<div class="contact-bar">

   <div class="row content">

      <div class="large-6 columns">

         <h1 class="fancy"><span>$CMS_VALUE(gc_contact_headline_footer, removeBlock(gc_contact_headline_footer__ikam.isEmpty))$</span></h1>

         <p>$CMS_VALUE(gc_contact_text_footer, gc_contact_text_footer.isEmpty)$</p>

          <button class="button"> <span>$CMS_VALUE(gc_contact_buttontext_footer, gc_contact_buttontext_footer.isEmpty)$</span> </button>

      </div>

     <div class="large-6 columns">

         <h1 class="fancy"><span>$CMS_VALUE(gc_newsletter_headline_footer,              removeBlock(gc_newsletter_headline_footer__ikam.isEmpty))$</span></h1>

       ...

      </div>

   </div>

</div>

Wie man sehen kann, hat sich die Anzahl der Codezeilen kaum vergrößert. Zusätzlich wurde an der Stelle der Ausgabe entschieden, was man nicht angezeigt haben möchte, wenn der auszugebende Text nicht gesetzt ist.

Was denkt ihr darüber? Ist sowas überhaupt sinnvoll, machbar?

1 Comment
MichaelaReydt
Community Manager
Community Manager

Hallo Philippe,

vielen Dank für deine Idee zur Verbesserung von FirstSpirit. Es ist uns wichtig, aus den Erfahrungen unserer Kunden und Partner zu lernen. Aus diesem Grund schätzen wir Feedback und freuen uns über jede Anregung.

Wir haben das Thema noch einmal evaluiert, haben aber keine Pläne, es in absehbarer Zukunft zu bearbeiten. Daher können wir deinen Feature Request zum aktuellen Zeitpunkt leider nicht berücksichtigen.

Detaillierte Informationen bezüglich des Auswahlprozesses der Requests, die wir umsetzen, haben wir in unserer Features Policy zusammengefasst.

Viele Grüße

Michaela