Normalerweise braucht man sie ja nur in der linken und rechten Spalte - die “Boxen” in xt:Commerce-Templates. Es gibt aber durchaus Fälle, in denen es praktisch wäre, eine “Box” beispielsweise innerhalb der “categorie_listing.html” anzeigen zu können. Oder auf der Startseite in der “main_content.html”.

Das funktioniert allerdings nicht so ohne Weiteres. Die “index.html” eines xt:Commerce-Templates sieht in etwa so aus …


<div id="Alles" class="clearfix">

<div id="MittelSpalte">
<p id="BreadCrumb">{$navtrail}</p>
{$main_content}
</div>

<div id="LinkeSpalte">
{$box_SEARCH}
{$box_CATEGORIES}
{$box_WHATSNEW}
....
</div>

<div id="RechteSpalte">
{$box_CART}
{$box_ADMIN}
{$box_INFOBOX}
...
</div>

</div>
	

… und ist es so, dass alle {$box_IRGENDWAS} ausschließlich in der “index.html” bekannt sind. Wie so ziemlich alles, was aus der “boxes.php” heraus (im Falle der Boxen über includes) generiert wird.

Auch wenn man dort z.B. $smarty->assign('Test','Test'); eingibt, ist {$Test} in so ziemlich allen Template-Dateien (außer der “index.html”) leer.

Soweit, so gut. Aber wozu genau könnte man “überall einsetzbare” Boxen gebrauchen?

 

Vorteile von “Boxen”

Kein Systemgefummel: Der Hauptvorteil liegt für mich darin, dass man nicht an Systemdateien oder überhaupt irgendwie im System-Ordner herumbauen muss - Bloß weil man beispielsweise 3 Zufallsprodukte o.ä. in der Mittelspalte sehen möchte.

Es wäre deutlich schöner, wenn man sich im Template nach Lust und Laune seine eigenen Spezialboxen basteln und diese ebenso nach Lust und Laune dort ausgeben lassen könnte, wo man sie grad braucht.

Performance-Gründe: Der Smarty-Cache ist eine feine Sache, kann man sich so doch etliche Datenbank-Abfragen sparen. Wenn man ihn aber global für den gesamten Shop anschaltet, gibt’s in den meisten Fällen Ärger. Und vieles läuft nicht mehr richtig. Das liegt daran, dass in xt:Commerce $cache_id an vielen Stellen reichlich unkorrekt gebildet wird.

Weitaus weniger “gefährlich” ist es, das Smarty-Caching nur für einzelne (leistungshungrige) Boxen zu “erzwingen” und nicht gleich den gesamten Shop damit zu bedenken. So bleiben etwaige Fehlerquellen noch überschaubar. Mehr Infos dazu im » eComBASE-Forum

Und manchmal - Geht’s einfach kaum anders.

 

Zwei Beispiele aus der Praxis:

1) Muso Koroni

Bei » Muso Koroni gibt es eine zweigeteilte Kategorien-Navigation: horizontal die Hauptkategorien, vertikal die Unterkategorien.

Zu lösen war das Problem, dass die Links in der linken Spalte ursprünglich gar keine “Kategorien-Box” à la {$box_SUB_CATEGORIES} oder Ähnliches WAREN - Der Template-Bauer hatte dazu (eine gute Idee, wie ich finde) die Kategorien-Liste, die in der “categorie_listing.html” aufgebaut wird, benutzt.

Also Inhalte, die - von der “index.html” aus gesehen - in {$main_content} stecken. Unpraktisch an diesem Trick für eine zweigeteilte Navi ist jedoch: Sobald man eine der Unterkategorien angewählt hat, verschwinden die anderen aus der linken Spalte. Und wenn’s noch weitere Unterkategorien geben soll, “verläuft” man sich leicht.

Daher musste eine neue {$box_SUB_CATEGORIES} her - und aus gestalterischen Gründen war es erforderlich, diese neue Box auch in der “categorie_listing.html” und der “product_listing_vXy.html” anzuzeigen. Man hätte sonst das halbe Template umschreiben müssen.


2) Magic and Arts

Auf der Startseite von » Magic and Arts sieht man zwei Boxen zum “Durchblättern” - Eine mit den neuesten 30 Artikeln, eine mit Empfehlungen. Diese Bereiche erscheinen nicht nur ausschließlich auf der Startseite, sondern auch innerhalb des Startseiten-Textes “Willkommen in unserem Onlineshop …”

Wenn man diese Boxen einfach in die “index.html” vor {$main_content} gesetzt hätte, würden die (sofern man nicht ein bisschen herumtrickst) glatt auf jeder Seite vorm eigentlichen Inhalt (und vor der Seitenüberschrift) angezeigt werden.

Hier sollten die Boxen aber eben NUR auf der Startseite zu sehen sein, NACH der Seitenüberschrift - und nach Möglichkeit auch noch (beliebig platzierbar) innerhalb des Textes, den man über den ContentManager verwalten kann.

 

Anleitung am Beispiel Magic and Arts:

Die “main_content.html” ist für die Inhalte der Startseite zuständig. Und die sieht im Regelfall in etwa so aus:


{config_load file="$language/lang_$language.conf" section="index"}
<h1>{$title}</h1>
{$text}
{$MODULE_new_products}
{$MODULE_upcoming_products}
	

Unsere neuen Boxen heißen {$box_NEWPRODS_START} und {$box_INTERESSANTES} - Leider funktioniert (wie oben beschrieben) das hier schon mal nicht, die Boxen werden einfach nicht angezeigt.


{config_load file="$language/lang_$language.conf" section="index"}
<h1>{$title}</h1>
{$box_NEWPRODS_START}
{$box_INTERESSANTES}
{$text}
{$MODULE_new_products}
{$MODULE_upcoming_products}
	


Erster Trick: Die Globals benutzen

Es ist eigentlich ganz einfach - Wir holen uns das, was im Smarty-Objekt drin ist - Und weisen dem, was wir brauchen, ein neues Tag zu. Unser Glück dabei: So ziemlich alle xt:Commerce-Dateien includen die “boxes.php” so ziemlich als erstes, deshalb “weiß” das System an dieser Stelle schon von den Box-Inhalten.

Wir schreiben also in die “main_content.html” ein bisschen PHP …


{php}
global $smarty;
$this->assign('box_NEWPRODS_START',$smarty->_tpl_vars['box_NEWPRODS_START']);
$this->assign('box_INTERESSANTES',$smarty->_tpl_vars['box_INTERESSANTES']);
{/php}
	

… und ab dort “funktionieren” unsere beiden Boxen unter dem gleichen Smarty-Tag wie in der “index.html”.


Zweiter Trick: Smarty-Replace

Damit ist der zweite Teil der Aufgabe aber noch nicht gelöst, denn die beiden Boxen sollen ja innerhalb des ContentManager-Inhaltes {$text} platziert werden können.

Dazu benutzen wir den “replace”-Modifier von Smarty und denken uns zwei Platzhalter aus, die nachher durch die Box-Inhalte ersetzt werden sollen …


{config_load file="$language/lang_$language.conf" section="index"}

{php}
global $smarty;
$this->assign('box_NEWPRODS_START',$smarty->_tpl_vars['box_NEWPRODS_START']);
$this->assign('box_INTERESSANTES',$smarty->_tpl_vars['box_INTERESSANTES']);
{/php}

{$MODULE_error}
<h1>{$title}</h1>
{$text|replace:'%lalala%':$box_NEWPRODS_START|replace:'%lololo%':$box_INTERESSANTES}
{$MODULE_new_products}
{$MODULE_upcoming_products}
	

Jetzt werden alle %lalala% innerhalb von {$text} durch {$box_NEWPRODS_START} ersetzt, alle %lololo% durch {$box_INTERESSANTES} - Im ContentManager muss man halt dort, wo man diese Boxen haben möchte %lalala% oder %lololo% hinschreiben.

 

Weitere Ideen

Es ist recht interessant, was in global $smarty (oder überhaupt in den globals) so alles drin steckt. In vielen Fällen kann man sich damit größere Verrenkungen sparen.

Möchte man z.B. auf Produkt-Detail-Seiten Hersteller-Infos in der Mittelspalte (und nicht wie sonst meist üblich auf der rechten Seite) haben - Man greift sich die “product_info_v1.html”, setzt das hier an den Anfang …


{php}
global $smarty;
$this->assign('Dingsda',$smarty->_tpl_vars['box_MANUFACTURERS_INFO']);
{/php}
		

… und kann dann über {$Dingsda} das Hersteller-Logo etc. dort anzeigen lassen, wo man möchte.

Die “box_manufacturers_info.html” sollte man vorher natürlich noch so umarbeiten, dass sie nicht wie eine übliche “Box” aussieht. Aber das ist dann ja kein Problem mehr.