5202

ein Blog über technische Fragen zu Blogger

Blogger: new conditional tags

von

Blogger hat die Syntax für seine Layouts erweitert beziehungsweise verändert. Hier in dem Post versuche ich die wichtigsten Änderungen zusammenzufassen.

Die Änderungen sind mir erst seit ein paar Tage aufgefallen, das scheint mir alles sehr neu zu sein. Es kann sein, dass euch das Blog1 Widget abschmiert, falls ihr beim ausprobieren von der neuen Syntax etwas fehlerhaft formuliert. Setzt in dem Fall das Widget zurück und fangt von vorne an. Die falsche Syntax zu löschen reicht nicht aus!

if else

Blogger hat jetzt eine Kurzschreibweise für konditionale Bedingungen innerhalb von Tags. Die Schreibweise ist dabei identisch zu if else in Javascript:

Bedingung ? if : else

Beispiel - wir geben einem Element die Klasse foo auf der Indexseite und die Klasse bar auf allen anderen Seiten:

<div expr:class='data:blog.pageType == "index" ? "foo" : "bar" '/>

if else if

Wir können damit auch else if Bedingungen schreiben:

 Bedingung1 ? if : Bedingung2 ? else if : else

Besipiel - wir geben einem Element die Klasse foo auf der Indexseite, die Klasse bar auf der Postseite und auf allen anderen Seiten die Klasse foo-bar.

<div expr:class='data:blog.pageType == "index" ? "foo" : data:blog.pageType == "item" ? "bar" : "foo-bar"'/>

and

Blogger hat nun einen echten and Operator. Die alte Schreibweise ist obsolet:

<b:if cond='data:blog.pageType == "index"'>
  <b:if cond='data:blog.searchQuery'>
     <!--search_page AND index_page-->
  </b:if>
</b:if>

Die neue Schreibweise schaut so aus:

<b:if cond='data:blog.pageType == "index" and data:blog.searchQuery''>
  <!--search_page AND index_page-->
</b:if>

in

David Longley hat mich auf einen weiteren neuen Operator aufmerksam gemacht und zwar in. Damit können zwei oder mehr Seiten Typen zusammengefasst werden. Eine Bedingung für die Index.- und Postseite lies sich beispielsweise so formulieren:

<b:if cond='data:blog.pageType in { "index" "item"}
  <!--index_page AND item_page-->
</b:if>

or

Blogger hat nun einen echten or Operator. Die alte Schreibweise ist obsolet:

<b:if cond='data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/foo.html&quot;'> 
  <!-- static_site foo OR static_site bar -->
      <b:else/>
<b:if cond='data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/bar.html&quot;'> 
  <!-- static_site foo OR static_site bar -->
  </b:if>
</b:if>

Die neue Schreibweise:

<b:if cond='data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/foo.html&quot; or data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/bar.html&quot;'> 
  <!-- static_site foo OR static_site bar -->
</b:if>

Das ist sehr viel einfacher und übersichtlicher, oder?

and not

Neu dazu gekommen ist ein and not Operator, der bisher keine Entsprechung hatte.

Beispiel - die Bedingung ist für alle statische Seite true, die nicht die Seite foo ist:

<b:if cond='data:blog.pageType == "static_site" and not data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/bar.html&quot;'>
   <!-- all static pages except static_site foo -->
</b:if>

Verknüpfung logischer Operatoren

Ihr könnt die Operatoren and, or, in und and not in beliebiger Anzahl verknüpfen ... wobei das irgendwann unübersichtlich wird.

Beispiel - die Bedingung ist für die statische Seite foo, bar und foo-bar true:

<b:if cond='data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/foo.html&quot; or data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/bar.html&quot; or data:blog.url == data:blog.canonicalHomepageUrl + &quot;p/foo-bar.html&quot;'>·
  <!-- static_site foo OR static_site bar OR static_site foo-bar -->
</b:if>

Pseudo for

In der ersten Fassung von diesem Abschnitt habe ich mich unklar ausgedrückt, einen echter for Operator gibt es nicht. Wir können allerdings mit dem neuen and Operator eine Pseudo for Schleife formulieren.

Beispiel - wir geben dem loop, der die Posts ausliest, einen zusätzlichen Index i:

<b:loop values='data:posts' var='post' index='i'>

Wir lesen mit Hilfe dieses Index die ersten vier Posts aus:

<b:if cond='data:i &lt;=0 and data:i &gt; 4'>
  // do something
</b:if>

Die Schreibweise data:i <= 0 aus der Blogger Dokumentation funktioniert nicht. Ihr müsst named entities schreiben, ansonsten gibt es eine Fehlermeldung. Ich bin mir nicht sicher, ob das ein Bug oder Feature ist.

Mit Klammern könnt ihr zwei Bedingungen miteinander verknüpfen.

Beispiel: Wir wollen die ersten vier Posts und die Posts acht bis zehn manipulieren:

<b:if cond='( data:i &lt;=0 and data:i &gt; 4 ) or ( data:i &lt;=8 and data:i &gt; 10 )'>
  // do something
</b:if>

Es gibt weitere Änderungen, die imho hauptsächlich als Kurzschreibweise für bestehende Bedingungen gedacht sind. Falls ihr noch etwas findet, meldet euch doch in den Kommentaren!