Schleifen und If

Schleifen und If-Abfragen
Schleifen und If-Abfragen für Fortgeschrittene am Beispiel des Produkt-Listings (Kategorieübersicht)
Das Produktlisting ist der Teil der Kategorieübersichtsseite, in der die Produkte der Kategorie in einer Schleife ausgegeben werden. An diesem
Beispiel werden einige grundlegende Techniken zur besseren Gestaltung gezeigt. Einige Screenshots zeigen das Firefox Plugin FireBug, das die
Arbeit am Design des Shops sehr erleichtert. Weitere Informationen zu dem Plugin finden Sie unter http://getfirebug.com/. Auch den CSS-Code
werden wir hier nicht ausführen, da er zu individuell wäre.
Aufgabenstellung 1:
Es sollen vier Produkte pro Reihe angezeigt werden. Jedes Produkt soll eine individuelle CSS-Klasse erhalten. Das letzte Produkt soll immer die
Klasse last erhalten.
{php}
$i = 0;
{/php}
{foreach name=aussen item=module_data from=$product_listing}
{php}
$i++;
if ($i % 4 == 0){ echo '<div class="prod_nr_'.$i.' fourcolms last">';}
else { echo '<div class="prod_nr_'.$i.' fourcolms">'; }
{/php}
<table class="productPreview" width="160" border="0" cellspacing="0"
cellpadding="0">
<tr>
{if
$module_data.products_image!=''}<td
class="productPreviewImage"><a
href="{$module_data.products_link}">{img img=$module_data.products_image
type=m_thumb class="productImageBorder"
alt=$module_data.products_name}</a></td>{/if}
</tr>
<tr>
<td><a href="{$module_data.products_link}"
style="text-decoration:none">{$module_data.products_name}</a></td>
</tr>
<tr>
<td>{if $smarty.const._CUST_STATUS_SHOW_PRICE eq '1'}
<p
class="price"><strong>{$module_data.products_price.formated}</strong></p>
<p
class="taxandshippinginfo">{$module_data.products_tax_info.tax_desc}{if
$module_data.products_shipping_link}<br /><a
href="{$module_data.products_shipping_link}" target="_blank"
rel="nofollow">{txt key=TEXT_EXCL_SHIPPING}</a>{/if}</p>
{if $module_data.base_price}<p
class="vpe">{$module_data.base_price.price} {txt
key=TEXT_SHIPPING_BASE_PER} {$module_data.base_price.vpe.name}</p>{/if}
{/if}</td>
</tr>
<tr>
<td width="233">{if $module_data.allow_add_cart eq 'true'}
{form type=form name=product action='dynamic'
link_params=getParams method=post}
{form type=hidden name=action value=add_product}
{form type=hidden name=product value=$module_data.products_id}
<div class="addtobasketlisting">
<div align="center">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td>{form type=hidden name=qty value=1
style='width:50px;'}{button text=$smarty.const.BUTTON_ADD_CART
file='button_in_cart.gif' type='form' btn_template='tpl_button_2.gif'
space_left='25'}</td>
</tr>
</table>
</div>
</div>
{form type=formend}
{/if}</td>
</tr>
</table>
</div>
{php}
if ($i % 4 == 0){
echo '<hr class="listing" />';
}
{/php}
{/foreach}
Erklärung:
Innerhalb der PHP-Blöcke ({php}code{/php}) kann php-Code ausgeführt werden. Das machen wir uns zu Nutze, um die Schleifendurchläufe zu
zählen und in die Variable $i zu speichern.
Zuerst wird vor der Schleife die Variable $i auf 0($i=0) gesetzt. Danach beginnt die Schleife ({foreach...). Innerhalb der Schleife wird als nächstes
$i um 1 erhöht ( $i++; ). Dieses geschieht bei jedem Durchlauf, d. h. mit Abfrage von $i können wir jederzeit abfragen, welche Anzahl von
Produkten bereits ausgegeben wurde.
In der darauf folgenden Zeile wird abgefragt, ob $i beim Teilen durch 4 gleich 0 ist ($i % 4 == 0). Ist das Ergebnis true (bei 4,8,12,16 usw.) wird
als nächstes das letzte Produkt jeder Reihe ausgegeben und wir müssen das DIV-Element mit der last ausgeben.
Außerdem haben wir dem Element der Klasse prod_nr_$i (prod_nr_1, prod_nr_2, prod_nr_3, usw.) eingefügt, indem wir den Klassennamen mit
unserer Variable verketten.
(Bedenken Sie, dass CSS-Klassen niemals mit einer Zahl anfangen dürfen, "1_prod", "2_prod", usw. würden zu Fehlern führen)
Aufgabenstellung 2:
Die ersten beiden Produkte sollen mit doppelter Größe angezeigt werden. Zusätzlich sollen alle Anforderungen der ersten Aufgabenstellung erfüllt
bleiben.
{php}
$i = 0;
{/php}
{foreach name=aussen item=module_data from=$product_listing}
<div class="fourcolms
{php}
$i++;
echo 'prod_nr_'.$i;
if ($i == 1 || $i == 2){
echo ' big ';
}
if ( ($i+2) % 4 == 0){
echo ' last ';
}
{/php}
">
<table class="productPreview" border="0" cellspacing="0" cellpadding="0">
{if $module_data.products_image!=''}
{php}
if ($i == 1 || $i == 2){
{/php}
<tr>
<td
class="productPreviewImage"><a href="{$module_data.products_link}">{img
img=$module_data.products_image type=m_popup class="productImageBorder"
alt=$module_data.products_name}</a></td>
</tr>
{php}
}else{
{/php}
<tr>
<td class="productPreviewImage"><a href="{$module_data.products_link}">{img
img=$module_data.products_image type=m_thumb class="productImageBorder"
alt=$module_data.products_name}</a></td>
</tr>
{php}
}
{/php}
{/if}
<tr>
<td><a href="{$module_data.products_link}"
style="text-decoration:none;color:#132b49">{$module_data.products_name}</a
></td>
</tr>
<tr>
<td>{if $smarty.const._CUST_STATUS_SHOW_PRICE eq '1'}
<p
class="price"><strong>{$module_data.products_price.formated}</strong></p>
<p
class="taxandshippinginfo">{$module_data.products_tax_info.tax_desc}{if
$module_data.products_shipping_link}<br /><a
href="{$module_data.products_shipping_link}" target="_blank"
rel="nofollow">{txt key=TEXT_EXCL_SHIPPING}</a>{/if}</p>
{if $module_data.base_price}<p
class="vpe">{$module_data.base_price.price} {txt
key=TEXT_SHIPPING_BASE_PER} {$module_data.base_price.vpe.name}</p>{/if}
{/if}</td>
</tr>
<tr>
<td width="233">{if $module_data.allow_add_cart eq 'true'}
{form type=form name=product action='dynamic'
link_params=getParams method=post}
{form type=hidden name=action value=add_product}
{form type=hidden name=product value=$module_data.products_id}
<div class="addtobasketlisting">
<div align="center">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td>{form type=hidden name=qty value=1
style='width:50px;'}{button text=$smarty.const.BUTTON_ADD_CART
file='button_in_cart.gif' type='form' btn_template='tpl_button_2.gif'
space_left='25'}</td>
</tr>
</table>
</div>
</div>
{form type=formend}
{/if}</td>
</tr>
</table>
</div>
{php}
if (($i+2) % 4 == 0 || $i == 2){
echo '<hr class="listing" />';
}
{/php}
{/foreach}
Erklärung:
In den ersten beiden Produkten wird die Klasse big eingefügt (if($i==1|| $i ==2){...}. Wenn $i 1 oder 2 ist.....
Damit der Code weiterhin lesbar ist (und um Ihnen einige mögliche Variantionen aufzuzeigen), wurde die Syntax leicht verändert. Nun wird in der
If-Anweisung nur noch die Klasse ausgegeben, nicht mehr das komplette DIV-Element.
Die Klasse last muss nun in den folgenden Elementen um +2 verschoben werden, daher hat sich die If-Anfrage hier auf if ( ($i+2) % 4 ...
geändert.
Außerdem soll in den ersten beiden Produkten nicht mehr das kleine Bild vom Typ m_thumb geladen werden, sondern der Typ m_popup. Daher
wurde eine weitere Abfrage um die weitere Bildausgabe hinzugefügt (Zeile 22).
Diese Beispiele lassen sich beliebig ausbauen:
Auch in smarty.get. sind noch einige Parameter die man abfragen könnte.
{$smarty.get.cat} (liefert den Namen der Kategorie)
{$smarty.get.page} liefert die "Art" der Seite (Categorie, index, product usw.)
Außerdem steht in produkt.html noch $smarty.get.info(ID) zur Verfügung.