Werde das später mal zusammenfassen. Wer sich schonmal vorab informieren möchte, hier ist der Link: http://www.gunnart.de/tipps-und-tri...dkostenfrei-freeshippingdata-fuer-xtcommerce/ Ist aus alten xtc-Zeiten, in Gambio funktionierts aber auch...
Screenshots 1 Hier schonmal die Screenshots, die Umsetzung folgt... Produkt > 400 Euro: Produktseite / Produktliste / Warenkorb-Dropdown / Warenkorb
Screenshots 2 Weitere Screenshots: Produkt < 400 Euro: Produktseite / Warenkorb-Dropdown / Warenkorb Produkt < 400 Euro, aber würde mit dem vorhandenen Warenkorb-Inhalt die VSK-Grenze überschreiten: Produktseite
Lösung So, hier meine Einbau-Anleitung für den Hinweis auf VSK-freie Lieferung. Ich mache dies am Beispiel EyeCandy, wer ein anderes Template hat, muss möglicherweise anpassen. Bei mir läufts auch im MobileCandy, durch smarty ja alles möglich. Das Ganze ist NICHT updatesicher!!! Screenshots sind in den Beiträgen zuvor (aufgrund der max. Anzahl Dateianhänge). 1. Zuerst bitte folgende Datei herunterladen: http://www.gunnart.de/wp-uploads/xtc-tools/gunnart_FreeShippngData_v12c.zip Die enthaltene function.FreeShippingData.php bitte in das Verzeichnis templates/EyeCandy/usermod/smarty/ packen. Das Verzeichnis vorher erstellen. 2. /includes/classes/Smarty/Smarty.class.php nach PHP: define('SMARTY_PHP_PASSTHRU', 0);define('SMARTY_PHP_QUOTE', 1);define('SMARTY_PHP_REMOVE', 2);define('SMARTY_PHP_ALLOW', 3); einfügen PHP: define('MY_TEMPLATE_PLUGINS', DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/usermod/smarty'); als nächstes PHP: var $plugins_dir = array('plugins'); ändern in PHP: var $plugins_dir = array('plugins',MY_TEMPLATE_PLUGINS); 3. /lang/german/german.php nach PHP: if ($navigation->snapshot['page'] == FILENAME_CHECKOUT_SHIPPING) { define('NAVBAR_TITLE_LOGIN', 'Bestellen');} else { define('NAVBAR_TITLE_LOGIN', 'Anmelden');} einfügen PHP: define('FREE_SHIPPING_MISSING','Ihnen fehlen noch %wert% bis zur versandkostenfreien Lieferung');define('FREE_SHIPPING_TRUE','Versandkostenfrei innerhalb Deutschlands');define('FREE_SHIPPING_GENERAL','Versandkostenfrei ab %min% Warenwert'); Alle folgenden Änderungen finden an Template-Dateien statt und können je nach Wunsch erfolgen... Ich habe die Dateien als -USERMOD.html erstellt. 4. /templates/EyeCandy/boxes/box_cart_dropdown-USERMOD.html nach Code: {if $SHIPPING_INFO}{$SHIPPING_INFO} einfügen Code: {FreeShippingData}<br><br> {if $SHOW_FREE_SHIPPING_TRUE} <strong>Versandkostenfrei</strong><br>innerhalb Deutschlands! {else} Ihnen fehlen noch <strong>{$FREE_SHIPPING_MISSING}</strong> bis zur <strong>versandkostenfreien</strong> Lieferung innerhalb Deutschlands! {/if} 5. /templates/EyeCandy/boxes/box_cart_dropdown_fixed-USERMOD.html nach Code: {if $SHIPPING_INFO}{$SHIPPING_INFO} einfügen Code: {FreeShippingData}<br><br> {if $SHOW_FREE_SHIPPING_TRUE} <strong>Versandkostenfrei</strong><br>innerhalb Deutschlands! {else} Ihnen fehlen noch <strong>{$FREE_SHIPPING_MISSING}</strong> bis zur <strong>versandkostenfreien</strong> Lieferung innerhalb Deutschlands! {/if} 6. /templates/EyeCandy/module/order_details-USERMOD.html nach Code: {if $content_data.TAX_FREE_TEXT} <tr class="calculation total"> <td class="col_2" colspan="2" valign="top"> {if $content_data.SHIPPING_INFO}<span class="shipping-text">{$content_data.TAX_FREE_TEXT} {$content_data.SHIPPING_INFO}</span>{/if} </td> </tr> {/if} einfügen Code: {FreeShippingData} <tr class="calculation"> <td class="col_1" colspan="2"> {if $SHOW_FREE_SHIPPING_TRUE} <strong>Versandkostenfrei</strong> innerhalb Deutschlands! {else} Ihnen fehlen noch <strong>{$FREE_SHIPPING_MISSING}</strong> bis zur <strong>versandkostenfreien</strong> Lieferung innerhalb Deutschlands! {/if} </td> </tr> 7. /templates/EyeCandy/module/product_info/standard-USERMOD.html Code: {$PRODUCTS_SHIPPING_LINK} ersetzen mit Code: <br> {FreeShippingData} {php} $PREIS = $this->_tpl_vars['PRODUCTS_PRICE']; $SHIP = $this->_tpl_vars['FREE_SHIPPING']; $SHIPVAL = $this->_tpl_vars['FREE_SHIPPING_MISSING']; {/php} {if $FREE_SHIPPING_ALLOWED==1} <span id="shipinfo"> {php} if (gunnartPricing($PREIS,'NewPrice','WERT','false') >= gunnartPricing($SHIP,'NewPrice','WERT','false')-0.5) { {/php} <br><strong>Versandkostenfrei</strong> innerhalb Deutschlands! {php} } else { {/php} {$PRODUCTS_SHIPPING_LINK} <br><br> {php} if (gunnartPricing($PREIS,'NewPrice','WERT','false') >= gunnartPricing($SHIPVAL,'NewPrice','WERT','false')-0.5) { {/php} Bestellen Sie diesen Artikel zusammen mit den Artikeln aus Ihrem Warenkorb für <strong>kostenfreien</strong> Versand innerhalb Deutschlands! {php} } else { {/php} <strong>Versandkostenfreie</strong> Lieferung innerhalb<br>Deutschlands ab {$FREE_SHIPPING} Bestellwert! {php} }} {/php} </span> {else} {$PRODUCTS_SHIPPING_LINK} {/if} 8. /templates/EyeCandy/module/product_listing/product_listing_v1-USERMOD.html Code: {$module_data.PRODUCTS_SHIPPING_LINK} ersetzen mit Code: <br> {FreeShippingData} {php} $PREIS = $this->_tpl_vars['module_data']['PRODUCTS_PRICE']; $SHIP = $this->_tpl_vars['FREE_SHIPPING']; {/php} {if $FREE_SHIPPING_ALLOWED==1} <span id="shipinfo"> {php} if (gunnartPricing($PREIS,'NewPrice','WERT','false') >= gunnartPricing($SHIP,'NewPrice','WERT','false')-0.5) { {/php} <br><strong>Versandkostenfrei</strong> innerhalb Deutschlands! {php} } else { {/php} {$module_data.PRODUCTS_SHIPPING_LINK} {php} } {/php} </span> {else} {$module_data.PRODUCTS_SHIPPING_LINK} {/if} 9. /templates/EyeCandy/source/boxes/content.php vor PHP: ?> einfügen PHP: function get_Value($Input) { // $Input = einzelne Preis-Angabe // Ermittelt den numerischen Wert von "formatierter" Preis-Angaben // Dezimalkommas, Text und Währungssymbole werden entfernt, // um eine echte "Zahl" zu erhalten, mit der man weitergerechnet werden kann $Value = preg_replace("/(&[^;]*;)/", '', $Input); $Value = preg_replace("/[^0-9]/", '', $Value); return ($Value/100);}function get_productOldPrice($Input){ // $Input = "komplette" HTML-Ausgabe eines xt:Commerce-Preises // Suche eines "alten" Produktpreises // Rückgabe als "formatierter" Preis mit den gültigen "Text-Bausteinen" // Rückgabe als rein numerischer Wert // Rückgabe von 'false', wenn kein "alter Preis" gefunden wird $OldPrice = false; if (preg_match("/<span class=\"productOldPrice\">([^<]*)<\/span>/",$Input,$Treffer)) { $OldPrice['TEXT'] = trim($Treffer[1]); $OldPrice['WERT'] = get_Value($Treffer[1]); } return $OldPrice;}function get_productNewPrice($Input){ // $Input = "komplette" HTML-Ausgabe eines xt:Commerce-Preises // Suche des "aktuellen" Produktpreises // Rückgabe als "formatierter" Preis mit den gültigen "Text-Bausteinen" // Rückgabe als rein numerischer Wert $Waehrung = get_Waehrung(); $Input = trim( preg_replace("/<span class=\"productOldPrice\">([^<]*)<\/span>/",'',$Input) ); if (preg_match("/[^>]*".$Waehrung['symbol_left']."[^<>]*".$Waehrung['symbol_right']."[^<]*/",$Input,$Treffer)) { $NewPrice['TEXT'] = trim( preg_replace("/<[^>]*>/",'',$Treffer[0]) ); $NewPrice['WERT'] = get_Value($NewPrice['TEXT']); } return $NewPrice;}function get_Waehrung() { // Ermittelung der für den Shop gültigen Währungs-Einstellungen // Wird benötigt für die Ausgabe des eventuellen Preis-Vorteils // sowie für das sichere Auffinden des aktuellen Artikelpreises $WaehrungsQuery = "SELECT * FROM ".TABLE_CURRENCIES; $WaehrungsQuery = xtDBquery($WaehrungsQuery ); $Waehrung = xtc_db_fetch_array($WaehrungsQuery, true); return $Waehrung;}function get_savedMoney($OldPrice,$NewPrice) { // $OldPrice = numerischer Wert des "alten Preises" // $NewPrice = numerischer Wert des "aktuellen Preises" // Berechnung des Preisvorteils als Differenz // Rückgabe als "formatierter" Preis // Rückgabe als rein numerischer Wert // Rückgabe von 'false', wenn es keinen Preisvorteil gibt $SavedMoney = false; if ($NewPrice && $OldPrice) { if ($NewPrice < $OldPrice) { $SavedMoney['WERT'] = $OldPrice-$NewPrice; $Waehrung = get_Waehrung(); $SavedMoney['TEXT'] = round( $SavedMoney['WERT'], $Waehrung['decimal_places'] ); $SavedMoney['TEXT'] = number_format( $SavedMoney['TEXT'], $Waehrung['decimal_places'], $Waehrung['decimal_point'], $Waehrung['thousands_point'] ); $SavedMoney['TEXT'] = trim( $Waehrung['symbol_left'].' '. $SavedMoney['TEXT'].' '. $Waehrung['symbol_right'] ); } } return $SavedMoney;}function get_savedPercent($OldPrice,$NewPrice) { // $OldPrice = numerischer Wert des "alten Preises" // $NewPrice = numerischer Wert des "aktuellen Preises" // Berechnung des Preisvorteils als Prozentwert // Rückgabe als "formatierter" Preis // Rückgabe als rein numerischer Wert // Rückgabe von 'false', wenn es keinen Preisvorteil gibt $SavedPercent = false; if ($NewPrice && $OldPrice) { if ( ($NewPrice < $OldPrice) && ($OldPrice != 0) ) { $SavedPercent['WERT'] = ($OldPrice-$NewPrice) / $OldPrice * 100; $Waehrung = get_Waehrung(); $SavedPercent['TEXT'] = round( $SavedPercent['WERT'], $Waehrung['decimal_places'] ); $SavedPercent['TEXT'] = number_format( $SavedPercent['TEXT'], $Waehrung['decimal_places'], $Waehrung['decimal_point'], $Waehrung['thousands_point'] ); $SavedPercent['TEXT'] = trim( $SavedPercent['TEXT'].' %' ); } } return $SavedPercent;}function return_gunnartPricing($Input) { // $Input = "komplette" HTML-Ausgabe eines xt:Commerce-Preises // Entfernen überflüssiger Leerzeichen, und Zeilenumbrüche etc. // Ausführen der verschiedenen Berechnungen // Rückgabe aller Ergebnisse (auch der 'false'-Werte) als Array $Input = str_replace("/\n\b\r\t/", ' ', $Input); $Input = preg_replace("/\s\s+/", ' ', $Input); $Output['OldPrice'] = get_productOldPrice($Input); $Output['NewPrice'] = get_productNewPrice($Input); $Output['SavedM'] = get_savedMoney($Output['OldPrice']['WERT'],$Output['NewPrice']['WERT']); $Output['SavedP'] = get_savedPercent($Output['OldPrice']['WERT'],$Output['NewPrice']['WERT']); return $Output;}function gunnartPricing($Input,$Which='check',$How='TEXT',$Echo='true') { // Haupt-Funktion zum Aufruf aus den Template-Dateien // $Input = "komplette" HTML-Ausgabe eines xt:Commerce-Preises // $Which, $How und $Echo = Parameter zur Steuerung der Aus- bzw. der Rückgabe // 1) Mögliche Werte $Which: // 'check' oder leer, 'OldPrice', 'NewPrice', 'SavedM', 'SavedP' // 2) Mögliche Werte $How: // 'TEXT' oder leer, 'WERT' // 3) Mögliche Werte $Echo: // 'true' oder leer, 'false' // Nähere Infos und Anleitung: http://www.gunnart.de/?p=284 if (strtolower($Which)=='check') { if (get_productOldPrice($Input)) return true; else return false; } else { $Output = return_gunnartPricing($Input); if($Output) { if (strtolower($Echo)=='false') $Echo = false; else $Echo = true; if($Output[$Which][$How]) { if($Echo) echo $Output[$Which][$How]; else return $Output[$Which][$How]; } } else { return false; } }} Fertig, ich hofffe ich habe nichts vergessen! Bitte unbedingt beachten: Benutzung und Verwendung ausschließlich auf eigenes Risiko. Jeder sollte genau wissen, was er tut. Eine Gewährleistung jeglicher Art ist ausgeschlossen. Ich hafte nicht für Schäden, die durch die Benutzung entstehen. Als Erstes zwingend eine Sicherung aller Shop-Dateien und der Datenbank vornehmen. Erst in einem Testshop ausgiebig testen.
Hallo Maxwell, bin auch nach wie vor mehr als interessiert - also wenn Du das posten kannst, wird es sehr gerne angenommen. Lol - da haben wir wohl gerade gleichzeitig gepostet. Vielen Dank für die Anleitung, werde das mal im Testshop versuchen und mich bei Zeiten mit Ergebnissen melden.
Spätestens beim nächsten Update oder sogar beim Masterupdate ist das ganze Historie. Und es ist leider nicht das, was wir suchen. Dass etwas ab einer bestimmten Summe versandkostenfrei ist, schön und gut. Für wie viel der Kunde aber noch einkaufen muss, steht da nicht, oder habe ich das übersehen?
Doch Petra, siehe hier: http://www.gambio-forum.de/threads/14454-Versandkostenfrei-Restbetrag-dynamisch-anzeigen?p=115482&viewfull=1#post115482 Im Warenkorb steht, was noch fehlt...genauer Betrag.. Es sind ja nur 3 kleine Änderungen in 2 Dateien welche nicht updatesicher sind, der Rest ist usermod.
Ach nowas: Hat nicht jemand noch eine Uralt-Installation, wir haben unseren GX1 leider vor kurzem gelöscht. Ich würde so gerne mal nachschauen, ob ich mich wirklich recht erinnere, dass das da mal angezeigt wurde.
Würg... Warum verbaut ihr immer noch diesen nicht-updatesicheren Scheiß???? Zumindest dort, wo Gambio updatesichere Lösungen ermöglicht.
ganz einfach avenger, weil es das nicht in neu gibt und die meisten eben nicht die fähigkeiten haben das umzuprogrammieren. die funktion aber benötigen. was bleibt da dann anderes übrig? Warten bis es irgendwann mal einer macht der es kann, oder es nutzen und immer wieder einbauen?
"Updatesicher" ist ja so eine Sache. Eine USERMOD ist auch nur updatesicher, solange das Template von einem Update nicht entscheidend betroffen ist. Dann muss man eben doch die eigenen Mods wieder manuell einbauen. "Sicher" heißt hier nur, dass die Änderungen nicht versehentlich überschrieben werden. Die Overloads sind zwar schon elegant, funktionieren aber nur, wenn die Basisfunktion unverändert ist. Oder sehe ich das falsch? Für mich als Gambio Neuling ist vor allem ärgerlich, wie viel Aufwand selbst für kleine Mods nötig ist. Die dynamische Anzeige des Restbetrags hätte ich in einem PHP-HTML-System wie WordPress mit vier oder fünf Zeilen Code erledigt.
Es ist ja die smarty.class.php, German.php und Content.php im Template. Geht das bei denen denn updatesicher? Ich bin ehrlich, ich muss ja bei den updatesicheren Dateien trotzdem gucken, ob an der Original Klasse was geändert wurde, was ich durchs überladen quasi zerschieße. Ich hab bei mir alle Änderungen dokumentiert und genau gekennzeichnet im Quelltext. Mit Notepad++ suche ich in den Dateien global nach dem String und mache den direktvergleich mit winmerge. Das dauert bei uns max. 2 Stunden bei nem großen Update. Das finde ich ok, zumal ich hier nochmal die genauen Änderungen vergleiche und validiere. Ich hab ja extra gesagt das hier ist nicht updatesicher. Wer das aber will, muss es umschreiben oder verzichten.
Leichter gesagt als getan - ich schließe mich da Dennis' Meinung ansolut an. Ich habe den Shop in erster Linie um damit Geld zu verdienen und kann mich nur selten um Erweiterungen und ähnliches kümmern. Trotzdem sind solche Features mehr als hilfreich. Aber vielleicht ist es Dir ja möglich den Vorschlag von maxwell Updatesicer umzustricken? Nichts für ungut...