2009-02-03 5 views
5

Was ist eine gute, einfache Möglichkeit, alternierende Zeilenfarben mit freemarker zu haben?Alternierende Tabellenreihe Farben in Freimarker

Ist das wirklich der beste Weg?

<#assign row=0> 
<#list items as item> 
    <#if (row % 2) == 0> 
     <#assign bgcolor="green"> 
    <#else> 
     <#assign bgcolor="red"> 
    </#if> 
    <tr style='background-color: ${bgcolor}'><td>${item}</td></tr> 
    <#assign row = row + 1> 
</#list> 

Ich habe versucht, dies zu tun:

<#assign row=0> 
<#list items as item> 
    <tr style='background-color: ${(row % 2) == 0 ? "green" : "blue"}'><td>${item}</td></tr> 
    <#assign row = row + 1> 
</#list> 

Aber anscheinend kann man den ternären Operator Benutzer nicht drin.

Hinweis: Ich denke, ich hätte es früher erwähnen sollen, aber ich kann keine CSS-Klassen oder Javascript verwenden, da dieser HTML-Code in eine E-Mail-Nachricht eingeht.

Antwort

14

Wenn Sie eine Reihe von Tabellen haben, möchten Sie vielleicht eine kleine Funktion erfüllen.

<#function zebra index> 
    <#if (index % 2) == 0> 
    <#return "white" /> 
    <#else> 
    <#return "#efefef" /> 
    </#if> 
</#function> 

<#assign arr=["a","b","c","d"] /> 
<table> 
<#list arr as n> 
    <tr><td bgcolor=${zebra(n_index)}>${n}</td></tr> 
</#list> 
</table> 

und die _index builtin wenn Liste mit ersparen Sie sich eine Indexvariable selbst zu machen und zu erhöhen.

+0

Der _index ist ein netter Trick. Vielen Dank! – itsadok

+3

Und bitte verwenden Sie "clean" CSS: Fügen Sie die relevante Klasse bei Bedarf (class = "odd" oder class = "even") & dann in der CSS entsprechend (dh .even {Hintergrundfarbe: grau;} .odd {background-color: white;} –

+0

Wenn in 2.3.23 die Klassennamen 'even' und 'odd' sind, können Sie '' schreiben. – ddekany

3

Hmmm ... OK, das ist das Beste, was ich habe kommen mit:

<#assign row=0> 
<#list items as item> 
    <tr style='background-color: <#if (row % 2) == 0>green<#else>red</#if>'><td>${item}</td></tr> 
    <#assign row = row + 1> 
</#list> 

Von der ohrenbetäubenden Stille Ich leite es gibt keine schönere Art und Weise, dies zu tun.

+0

Sie erkennen, dass Sie CSS oder JavaScript verwenden könnte, das Gleiche zu tun: Es gibt keine Notwendigkeit Freemarker zu benutzen? –

0

Mit Freemarker gibt es begrenzte Möglichkeiten, diese Frage zu beantworten, aber wenn Sie CSS wollen, sind allein zu verwenden (was immer noch Trennung von Bedenken erlaubt), dann ist hier ein Weg:

gebe folgende in Ihrer Sheet:

tr.linea { 
    background-color: #CC9999; color: black; 
} 
tr.lineb { 
    background-color: #9999CC; color: black; 
} 

dann die folgenden tr Klasse verwenden abwechselnde Zeilen zu definieren:

<table> 
<tr class="linea"><td>One Fish</td></tr> 
<tr class="lineb"><td>Two Fish</td></tr> 
<tr class="linea"><td>Red Fish</td></tr> 
<tr class="lineb"><td>Blue Fish</td></tr> 
</table> 

Es gibt auch many resources zur Auswahl.

Bearbeiten: Wenn Ihr HTML in eine E-Mail geht, können Sie nicht sicher sein, dass der E-Mail-Client des Clients das HTML, das Sie einfügen möchten, erlaubt. Ihre beste Wette ist zu diesem Zeitpunkt, FreeMarker ähnlich wie Sie es verwenden, außer dass Sie das style Tag entfernen müssen, und Farben für jede Zeile verwenden, die bgcolor="color" in Ihren <tr> Tags verwenden.

+1

Jetzt brauche ich eine Möglichkeit, "linea" und "lineb" zu wechseln - ein sehr ähnliches Problem ... – itsadok

+0

+1 für den E-Mail-Tipp – itsadok

1

Eine Lösung kocht dann auf diese nach unten:

<style> 
.rowon { 
background-color:#dedede; 
} 

.rowoff{ 

} 
</style> 

in Ihrer Vorlage:

<#list items as item> 
    <tr class="<#if item_index % 2 ==0>rowon<#else>rowoff</#if>"><td>${item}</td></tr> 
</#list> 

jedoch, wie in einer vorherigen Antwort erwähnt, können Sie dies mit CSS, ohne diese Freemarker Lösung (siehe http://www.w3.org/Style/Examples/007/evenodd):

<style> 
.striped tr:nth-child(odd) {background: #eee} 
.striped tr:nth-child(even) {background: #fefefe} 
</style> 

Und dann benutzen Sie einfach eine normale Tabelle ohne classe s in den Zeilen:

<table class="striped"> 
<tr><td>hello</td></tr> 
<tr><td>hello</td></tr> 
<tr><td>hello</td></tr> 
<tr><td>hello</td></tr> 
</table> 

oder mit einem Freemarker generierten Tabelle:

<table class="striped"> 
<#list items as item> 
    <tr><td>${item}</td></tr> 
</#list> 
</table> 

So ist es in der CSS.

6

Mit Freemarker, können Sie mit dem string eingebaut:

<#list items as item> 
    <tr style='background-color: ${((item_index % 2)==0)?string("green", "blue")}'><td>${item}</td></tr> 
</#list> 
+0

Willkommen Vielen Dank für das Hinzufügen dieses tollen Tipp! –

25
class='${["odd", "even"][item_index%2]}' 
+1

Liebe dieses, viel einfacher als die angenommene Antwort. –

+0

Zustimmen, nice one. –

+1

Hinweis: Ersetzen Sie "Element" oben mit der Variablen für die Liste.Zum Beispiel, <#list Array als Linie> ... [Linie_Index% 2] ... Nathan

0

Sie können ternären Operator in Freemarker simulieren mit dem folgenden Aufbau: $ {? Zustand string (result_for_true, result_for_false)} .

<#assign arr=["a","b","c","d"] /> 
<table> 
<#list arr as n> 
    <tr><td bgcolor=${((index % 2) == 0)?string("white", "#efefef")}>${n}</td></tr> 
</#list> 
</table> 
1

In Freemarker 2.3.23:

<#list items as item> 
    <tr style='background-color: ${item?item_cycle('green', 'red')}'><td>${item}</td></tr> 
</#list>