Wenn man mit xt:Commerce die Preis-Anzeige nach eigenen Wünschen umgestalten und dabei keine System-Dateien ändern möchte, kann man sein Template um einige Zusatzfunktionen erweitern. Hier ein entsprechendes Funktions-Set zum Downloaden und “Einbauen”, das u.a. die Ausgabe von Preisnachlässen als Prozentwert ermöglicht.

 

Das Problem

Folgendes Szenario: Im Shop sollen Artikel, die es zum reduzierten Preis gibt, einen Button “Sonderpreis!” neben der Überschrift haben. Außerdem soll der Prozentwert, um den reduziert wurde, zusammen mit der Ersparnis in Euro gezeigt werden.

Mit den in xt:Commerce vorgegebenen “Methoden” kommt man nicht weiter. Wenn man einen Preis ausgibt, gibt man ihn “komplett” aus. Also (sofern vorhanden) den “alten” Artikelpreis, darunter den aktuellen Preis, bei gültigem Artikelrabatt zusätzlich der Hinweis “Sie sparen soundsoviel Prozent”.

Aber eine Möglichkeit, diese Angaben irgendwie “aufzusplitten”, so dass man besondere Hinweise in extra Kästchen oder Buttons platzieren kann, gibt es nicht. Alles was “zum Preis” gehört, wird (bis auf die Staffelpreis-Tabelle) in einem Rutsch wiedergegeben - und Ende.

Auch die HTML-Formatierung der Preise lässt nicht sonderlich viel Spielraum: Der “Sie sparen”-Hinweis (der z.B. bei einem Artikelrabatt auftaucht) erscheint nicht einmal in einem neuen Absatz, sondern nach einem Zeilenumbruch - womit alle schönen Ideen, den “eigentlichen Preis” mit einer anderen Farbe als den Rabatt-Text zu markieren - nicht wirklich funktionieren können. Ebensowenig wie “Textbausteine” oder “Währungssymbole” in einer anderen Größe als die Zahl wiederzugeben.

 

Die Lösung

Das Template muss um einige Funktionen erweitert werden, an die der “komplette Preis” - so wie er normalerweise ausgegeben werden würde - aus $this->_tpl_vars übergeben und entsprechend aufbereitet werden kann.

Mit dem Funktions-Set “gunnartPricing();” sind dann Wünsche à la “Von Sonderangeboten die Überschriften bitte rot” oder “Der reduzierte Preis soll direkt in der Überschrift stehen” bis hin zu “Prozente Anzeigen” kein Problem mehr.

Eine ausführliche Beschreibung wie das Ganze programmiert ist, finden Sie in diesem Beitrag. Dort geht’s um Beispiele für die Realisierung “Template spezifischer” Sonder-Funktionen.

 

Download und “Installation”

  1. Download: “xtc_gunnartPricing.zip”
  2. Entpacken, öffnen und Code in die Zwischen-Ablage kopieren
  3. Öffnen der Datei “xtc_show_category.inc.php”
    Zu finden im Ordner “ihr_shop.de/templates/ihr_template/source/inc/”
  4. Kompletten Code ans Ende der Datei einfügen Sorry, das war uneindeutig formuliert:
    Den kompletten Code ohne <?php und ?> kopieren und vorm letzten ?> einfügen
  5. Abspeichern - und los geht’s!

 

Beschreibung “gunnartPricing();”

Die Benutzung ist aus jeder Template-Datei möglich. Die Funktion muss mit dem “gefüttert werden”, was xt:Commerce als “PRICE” ausgibt - und danach ist man recht flexibel:

1) Layout-Funktion:

“gunnartPricing();” extrahiert aus dem eingegebenen Preis den “Normal-Preis” und - sofern vorliegend - den “Sonderpreis”. So kann man speziellere Layouts realisieren, falls man beispielsweise den Angebotspreis mit in der Artikel-Überschrift haben möchte oder Ähnliches.

2) Berechnung von Preisnachlässen:

Bei Sonderpreisen oder anderen Preisnachlässen wird der Preisvorteil gegenüber dem normalen Artikelpreis berechnet:

  • Ausgabe des Preisvorteils möglich als Prozentwert und als Differenz
  • Anzeige unformatiert (als “Zahlenwert zum Weiterrechnen”) oder formatiert (unter Berücksichtigung aller für den Shop gültigen Einstellungen in Sachen “Zehnerkomma”, “Tausenderpunkt”, “Währungssymbol” etc.)
  • Eigenes “Styling” möglich, da alle Werte ohne umschließende HTML-Tags erzeugt werden

3) Aus- oder Rückgabe:

Es ist möglich, die Ergebnisse in PHP zurückgeben zu lassen, wenn man mal keine HTML-Ausgabe braucht, beispielsweise weil man die Werte in irgendeiner Weise “weiterverarbeiten” möchte.

 

Anleitung “gunnartPricing();”

1) Eingabewert = Artikelpreis

Praktischerweise füllt man zunächst eine Variable mit dem “kompletten”, von xt:Commerce generierten Preis. Dazu braucht man in den Template-Dateien ein bisschen PHP. Die Anweisung sieht in der “product_info_v1.html” beispielsweise folgendermaßen aus:

{php}$PREIS = $this->_tpl_vars['PRODUCTS_PRICE'];{/php}

bzw. in der “box_best_sellers.html” entsprechend so:

{php}$PREIS = $this->_tpl_vars['box_data']['PRICE'];{/php}

Die nötigen Array-Keys passen also immer zu den jeweils benutzten Smarty-Tags in der jeweiligen Template-Datei. Danach kann man mit gunnartPricing($PREIS) plus den im nächsten Punkt beschriebenen Parametern weiterarbeiten.

 

2) Parameter

Die Funktion “gunnartPricing();” arbeitet mit dem weitergegebenen Preis und drei zusätzlichen Parametern. Dabei wird ein Muster gunnartPricing($Input,$Which,$How,$Echo); vorausgesetzt. Die Parameter im Einzelnen:

a) $Input

Hier den jeweiligen Artikelpreis übergeben, der von xt:Commerce ausgegeben werden würde. Der Wert ist über den jeweils passenden Key von $this->_tpl_vars zu erreichen.

b) $Which

Hier eintragen, was ausgegeben bzw. zurückgegeben werden soll. Mögliche Werte:

  1. ‘OldPrice’
    Aus- oder Rückgabe des “alten” Artikelpreises ohne umschließende HTML-Tags
  2. ‘NewPrice’
    Aus- oder Rückgabe des “aktuellen” Preises ohne umschließende HTML-Tags
  3. ‘SavedM’
    Aus- oder Rückgabe der Ersparnis als Differenz (”saved money”)
  4. ‘SavedP’
    Aus- oder Rückgabe der Ersparnis als Prozentwert (”saved money”)
  5. ‘check’ (oder keine Angabe)
    Keine HTML-Ausgabe, nur Rückgabe von ‘true’ bzw. ‘false’ - Dient zur kurzen Überprüfung, ob für den jeweiligen Artikel überhaupt ein Preisnachlass vorliegt

3) $How

Hier wird festgelegt, wie oder ob das Ergebnis “formatiert” sein soll.

  1. ‘TEXT’ (oder keine Angabe)
    Das Ergebnis wird so formatiert, wie es durch die aktuellen “Währungs-Einstellungen” im Shop vorgegeben wird. Also das welches Währungssymbol benutzt wird, ob dieses links oder rechts vom Preis steht etc.
  2. ‘WERT’
    Das Ergebnis völlig unformatiert und nicht gerundet. Für den Fall, dass man damit beispielsweise weitergerechnet muss.

d) $Echo

Ausgabe oder Rückgabe: Es wird grundsätzlich davon ausgegangen, dass eine HTML-Ausgabe erwünscht ist. Nur bei Angabe von ‘false’ findet keine Ausgabe statt, ansonsten kann der Parameter auch leer gelassen werden.

  1. ‘true’ (oder keine Angabe)
    Es erfolgt eine Ausgabe in HTML
  2. ‘false’
    Keine Ausgabe, Wert wird mit return in PHP zurückggeben

 

3) Code-Beispiele

gunnartPricing($PREIS,'OldPrice');

  • HTML-Ausgabe z.B. “129,99 €” oder “EUR 129.99″ - Immer in der gleichen Formatierung wie die anderen Preise im Shop
  • Parameter ‘TEXT’ muss nicht extra genannt werden, wenn nichts anderes angegeben ist, wird von ‘TEXT’ ausgegangen
  • ‘true’ muss ebenfalls nicht eingetragen werden, HTML-Ausgabe ist Voreinstellung

gunnartPricing($PREIS,'SavedP','WERT','false');

  • Gewählt ist die Ersparnis als Prozentwert
  • Keine Formatierung, kein Prozent-Zeichen, Nachkommastellen werden nicht abgeschnitten
  • Keine HTML-Ausgabe, da ‘false’ eingetragen ist

gunnartPricing($PREIS);

  • Ein Ausnahmefall: Keine HTML-Ausgabe, nur Rückgabe von ‘true’ bzw. ‘false’
  • So kann man (ohne viel Code schreiben zu müssen) schnell überprüfen, ob überhaupt ein Preisnachlass vorliegt

 

Anwendungs-Beispiele “gunnartPricing();”

1) Anzeige eines “Störers” mit Preisnachlass

Angenommen, in der Produkt-Info soll eine Box auftauchen, in der bei einem Sonderpreis die Ersparnis in Prozent und als Differenz gezeigt wird. Folgender Code wäre einzutragen:


{php}
	$PREIS = $this->_tpl_vars['PRODUCTS_PRICE'];
	if (gunnartPricing($PREIS)) {
{/php}
<div class="SparBox">
<h4>Angebot</h4>
<p>Sie sparen: <strong>{php}gunnartPricing($PREIS,'SavedP');{/php}</strong></p>
<p>Das sind: <strong>{php}gunnartPricing($PREIS,'SavedM');{/php}</strong></p>
</div>
{php} } {/php}
	

 

2) Kennzeichnung aller Preise unterhalb von xx,- €

Angenommen, es soll ein dicker Hinweispfeil neben besonders günstige Angebote gesetzt werden. Dazu könnte man beispielsweise einen Schwellenwert für “besonders günstig” bestimmen … sagen wir mal “Alles unter 10 Euro” bekommt einen spezielles Bildchen:


{php} if (gunnartPricing($PREIS,'NewPrice','WERT','false')) < 10) { {/php}
<img src="{$tpl_path}images/besondersGuenstig_Pfeil.gif" alt="Zum Taschengeld-Preis!" />
{php} } {php}
	

 

Ein paar Hinweise:

1) Es funktioniert einfach nicht?

Diese Erweiterung rechnet nicht mit Werten, die aus der Datenbank geholt werden, sondern nimmt die HTML-Ausgabe der Preise als Grundlage. Dabei wird mit regulären Ausdrücken nach den passenden Zahlen gesucht.

Falls Sie die Preis-Ausgabe Ihres Shops umgeändert haben, kann es passieren, dass mit falschen Zahlen gerechnet wird. Dann wären Funktionen “get_productNewPrice($Input);” sowie “get_productOldPrice($Input)” Ihren Anforderungen entsprechend umzuändern.

2) Andere Ausgabe gewünscht?

Die “gesparten Prozente” werden so ausgegeben, wie es die Währungs-Einstellung in Ihrem Shop vorgibt. In den meisten Fällen wird also auf zwei Nachkommastellen gerundet.

Sollten Sie eine andere Anzeige benötigen, finden Sie die Formatierungs-Anweisungen in der Funktion “get_savedPercent($OldPrice,$NewPrice)” - Dort müssten dann die Parameter bei “number_format” angepasst werden.

3) Fehler gefunden?

Grundsätzlich ist das Thema “Preis-Ausgabe” in Shop-Systemen nie ganz unkompliziert - und es gibt bei xt:Commerce viele verschiedene Arten, Preisnachlässe anzuwenden und abzubilden. Da hierbei etliche Faktoren miteinander zusammenspielen und sich einige Angaben bzw. Voreinstellungen, Rabattsysteme etc. einander ausschließen können, kann’s gut sein, dass ich einige Eventualitäten und Kombinationen noch nicht bedacht oder bemerkt habe.

Daher bitte ich um Benachrichtung, wenn Sie Fehler gefunden haben oder wenn Sie “Spezialfälle” wissen, unter denen falsche Werte ausgegeben werden … Gerne auch als Kommentar zu diesem Beitrag.

4) Zu Ihrer Sicherheit

Ein BackUp Ihres Systems vorm “Ausprobieren” scheint mit übertrieben. Denn es werden weder System-Dateien umgeändert noch die Inhalte Ihrer Datenbank bearbeitet.

Bitte probieren Sie die Funktionen dennoch zunächst mit einem Test-Shop aus, bevor in Ihrem öffentlich zugänglichen Live-System eventuell falsche Angaben gezeigt werden!

5) Kompatibilität

Das hier angebotene Funktions-Set ist bis jetzt nur mit xt:Commerce Version 3.04 SP 2.1 getestet, müsste allerdings auch mit anderen Versionen korrekt laufen, da (wie gesagt) nicht mit System-Funktionen sondern mit der HTML-Ausgabe gearbeitet wird.

6) Sonstiges

In einem früheren Beitrag habe ich eine andere Möglichkeit beschrieben, wie man Prozentwerte von Preisnachlässen ausgeben kann.

Die dort vorgestellte Methode hat den Vorteil, dass diese Berechnungen dann automatisch bei jedem angezeigten Preis ausgegeben werden, ohne dass jede Template-Datei geändert werden muss. Nachteilig ist allerdings, dass damit a) eine System-Datei verändert wird und dass b) weiterhin der komplette Preis “in einem Rutsch” ausgegeben wird.

 

Screenshop - gunnART Pricing (Muscle24.de)
Screenshot von Muscle24.de

Nachtrag: In Aktion

Ein Beispiel für den Einsatz dieses Funktions-Set ist im Shop » Muscle24.de zu sehen - Einfach ein bisschen stöbern (die Sonderangebote sind dort nicht “zentral gesammelt”) - bei herabgesetzten Produkten wird die Ersparnis in Prozent berechnet und in einem “Störer” angezeigt.