Altbekanntes Problem: Für alles hat man eine “Box”, mal mehr, mal weniger kompliziert - aber für die “dicksten Knöppe” vom Shop muss man im Template teilweise ziemlichen Aufstand betreiben. Damit sie a) gegebenenenfalls als “aktiv” markiert werden oder einen b) zumindest nicht wieder aus dem Shop rausschmeißen (Session-ID nicht mitgeschleift o.ä.)

Üblicherweise sind diese “dicken Knöppe” Funktionen wie “Neues Konto”, “Anmelden”, “Newsletter”, “Ihr Konto”, “Warenkorb”, “Kasse” und ähnliche, die man möglichst prominent und - getrennt von den anderen Links - meistens im Kopfbereich des Shops unterbringen möchte.

Für einige dieser Funktionen gibt’s in der “index.html” schon ein paar Smarty-Tags, leider aber ohne direkte Möglichkeit, den momentan aktiven Bereich besonders hervorzuheben.

 

Unnötiges

Es kursieren ein paar putzige Lösungen, die sich z.B. “Current-Link-Hack” nennen, aber nichts weiter machen, als mit …

{php}
$cur_link = explode('/', $_SERVER['PHP_SELF']);
$cur_link = array_pop($cur_link);
if (strpos($cur_link, '?') === true ) {
	$pos = strpos($cur_link, '?', 1);
	if ($pos) {
		$cur_link = substr($cur_link, 0, $pos);
	}
}
{/php}

… genau das herauszufinden, was man ebensogut mit
$cur_link = basename($_SERVER['SCRIPT_NAME']); hätte hinbekommen können.

Dieser Aufstand bloß, damit man nachher in den HTML-Dateien wieder via eingebundenem PHP überprüfen darf, ob $cur_link grad aktiv ist oder nicht.

Tolle Idee.

Desweiteren müsste man auch nicht einmal darauf ausweichen, es gibt auch noch {$smarty.server.SCRIPT_NAME} - da steht das selbe drin. Nur mit Slash vornedran.

 

Althergebrachtes

Dieser hier ist (dank xtc4-Standard-Template) wahrscheinlich am weitesten verbreitet:

{if $account}
	{php} if (isset($_SESSION['customer_id'])) { {/php}
		<a href="{$logoff}">{#link_logoff#}</a> |
	{php} } {/php}
{/if}
{if $account}
	<a href="{$account}">{#link_account#}</a> |
{/if}

…hä?

Sollte man gemerkt haben, dass $account eigentlich immer gefüllt ist und einmal ein bisschen in der Smarty-Doku gestöbert, reduziert sich der Aufwand zwar schon mal ein wenig …

{if $smarty.session.customer_id}
	<a href="{$logoff}">{#link_logoff#}</a> |
{/if}
<a href="{$account}">{#link_account#}</a> | 

… aber bei Klick auf “Ihr Konto” ist der Link immer noch nicht als “aktiv” gekennzeichnet.

 

Hoppla?

Man wundert sich ja manchmal. Aber ab und zu staunt man nur noch. Aktuell räume ich ein Template auf, in dem die üblichen “Funktions-Links” (Original!!) so drin stehen …


<td><a href="shop_content.php?coID=4&XTCsid=83d9a3cc215249e97425ef02e5e1533f"><img src="{$tpl_path}buttons/{$language}/nav/header_bottom_nav_imprint.png" alt="Impressum" width="99" height="38" border="0" /></a></td>
<td><a href="http://www.lalalashopname.de/shop_content.php?coID=0&XTCsid=83d9a3cc215249e97425ef02e5e1533f"><img src="{$tpl_path}buttons/{$language}/nav/header_bottom_nav_contact.png" alt="Kontakt" width="99" height="38" border="0" /></a></td>

Och nö!

Und damit sich so etwas nicht laufend weiter verbreitet - als Abhilfe hier meine persönlichen “Fünf Freunde” für xt:Commerce-Links …

 

Installation

  1. Dem Shop beibrigen, Smarty-Plugins, -Functions und -Modifier auch im Template zu suchen. Eine Anleitung dazu finden Sie » hier
  2. Dieses » zip-Archiv downloaden und entpacken
  3. Sofern noch nicht vorhanden, einen Ordner “smarty” im Template erstellen
  4. Die fünf Dateien dort hineinladen

 

Anwendung

Freund 1) Modifier “link”

Eigentlich ein ganz banales Ding. Spart aber schon mal Tipp-Arbeit

Statt <a href="{$URL}">{$TEXT}</a> … schreibt man nur noch: {$TEXT|link:$URL}

Das funktioniert (Smarty ist manchmal echt praktisch) übrigens auch mit “Sprach-Fitzeln”: Konstruktionen à la {#link_account#|link:$account} machen keine Probleme.


Freund 2) Function “ScriptLink”

Diese Funktion macht Folgendes: “Tu Script-Adresse rein, kommt Script-Link raus.” Natürlich mit Session-ID.

  • Das Script, auf das gelinkt werden soll, wird über den Parameter “script” bestimmt
  • Der Text, den der Link haben soll, wird über den Parameter “text” bestimmt
  • Die CSS-Klasse, die der Link (im Falle von “aktiv”) haben soll, wird über den Parameter “active” bestimmt

Gibt man bei “text” keinen Wert an, wird als verlinkter Text der Name des Scripts angenommen. Gibt man bei “active” keinen Wert an, bekommt der Link (wenn “an”) die CSS-Klasse “Current”.

Ein Beispiel?

{ScriptLink script=$smarty.const.FILENAME_SPECIALS text=Sonderangebote active=BinAktiv}

Hier würde zur “specials.php” verlinkt werden. Text: “Sonderangebote”. Wenn Aktiv, dann hat der ausgegebene HTML-Link die CSS-Klasse “BinAktiv”


Freund 3) Function “AccountLink”

… verhält sich mit zwei Ausnahmen exakt so wie “ScriptLink”.

  • Wenn kein Wert für “script” festgelegt ist, wird als Link die “account.php” angenommen
  • Als “aktiv” gilt alles, was irgendwie mit den eigenen Daten im Bezug zum Shop zu tun hat. Also nicht nur die “account.php”, sondern auch das Adressbuch, die Passwort-Geschichte, Newsletter-Anmeldung und so weiter


Freund 4) Function “CheckoutLink”

… ähnlich der “AccountLink” - nur eben für den “Bezahlprozess” zuständig

  • Wenn kein Wert für “script” festgelegt ist, wird als Link die “checkout_shipping.php” angenommen
  • Als “aktiv” gilt alles, was irgendwie mit dem Bezahlprozess im Shop tun hat. Also auch “Ändern der Lieferadresse”, “Auswahl der Zahlungsweise” und so weiter …


Freund 5) Function “ContentLink”

Diese Funktion ist für das “mittendrin einbauen” von ContentManager-Seiten.

Beispiel “Impressum” - In der Standard-Installation hat diese CM-Seite die “Sprachgruppe 4″. Um einen “Impressum”-Link zu erzeugen (funktioniert auch mehrsprachig) schreibt man im Template einfach {ContentLink id=4} - und erhält auf Deutsch ein verlinktes “Impressum”, auf Englisch ein verlinktes “Imprint” …

  • Welche CSS-Klasse der Link im Fall von “aktiv” haben soll, kann hier ebenfalls über den Parameter “active” festgelegt werden
  • Möchte man einen anderen Text als den Seiten-Namen verlinken, geht das (wie oben) genauso über den Parameter “text”

… Das hier {ContentLink id=4 text=#sprachvariable# active=Moin} würde demnach einen Link zum Impressum erzeugen, verlinkter Text wäre das, was in {#sprachvariable#} drin ist - und wenn man sich grad das Impressum anschaut, hätte der Link die CSS-Klasse “Moin”.

Alles soweit klar?

 

Nee, Kästchen - Die Praxis

Als Anregung zum produktiven Einsatz hier zwei Screenshots-Schnippsel aus einem Shop, bei dem ich diese Funktionen benutzt habe.

Shop-Funktionen xt:Commerce
Screenshot “Fünf Freunde”

So etwas mit den mitgelieferten Werkzeugen umzusetzen, kann schon mal in Fummelkram ausarten. Mit Ihren neuen “fünf Freunden” ist das aber alles gar nicht mehr so wild.

Der Code zum oberen Teil sieht so aus:


<ul id="TopFunctions">
<li class="Account">{AccountLink text=#link_account#}</li>
<li class="Cart">{ScriptLink script=$smarty.const.FILENAME_SHOPPING_CART text=#link_cart#}</li>
<li class="Checkout">{CheckoutLink text=#link_checkout#}</li>
</ul>
	

Der zum unteren so:


<ul id="ShopFunctions">
{if $smarty.session.customer_id}
<li>{ScriptLink script=$smarty.const.FILENAME_LOGOFF text=LOGOFF}</li>
{else}
<li>{ScriptLink script=$smarty.const.FILENAME_LOGIN text=LOGIN}</li>
{/if}
<li>{ContentLink id=4}</li>
<li>{ContentLink id=12}</li>
<li>{ContentLink id=3}</li>
</ul>
	

Ich wünsche viel Spaß beim Basteln

:-)


Ja, Richtig - “AccountLink”, “CheckoutLink” und “ScriptLink” hätte man eigentlich auch in einer einzigen function zusammenfassen können. Hatte ich sogar schon mal so. Aber ich wollte Tipparbeit und nicht Dateien sparen. Noch weitere Parameter à la type=Account type=Checkout etc. einzuführen, fand ich dann schließlich doch zu unübersichtlich.