Versandkostenfrei - Restbetrag dynamisch anzeigen

Thema wurde von Anonymous, 19. März 2014 erstellt.

  1. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62
  2. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62
    Screenshots 1

    Hier schonmal die Screenshots, die Umsetzung folgt...


    Produkt > 400 Euro:


    Produktseite / Produktliste / Warenkorb-Dropdown / Warenkorb

    screen8.png screen1.png screen2.png screen3.png
     
  3. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62
    Screenshots 2

    Weitere Screenshots:

    Produkt < 400 Euro:

    Produktseite / Warenkorb-Dropdown / Warenkorb
    screen7.png screen4.png screen5.png


    Produkt < 400 Euro, aber würde mit dem vorhandenen Warenkorb-Inhalt die VSK-Grenze überschreiten:

    Produktseite

    screen6.png
     
  4. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62
    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 trimpreg_replace("/<span class=\"productOldPrice\">([^<]*)<\/span>/",'',$Input) );
        if (
    preg_match("/[^>]*".$Waehrung['symbol_left']."[^<>]*".$Waehrung['symbol_right']."[^<]*/",$Input,$Treffer)) {
            
    $NewPrice['TEXT'] = trimpreg_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($WaehrungsQuerytrue);
        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.
     
  5. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    3. Februar 2012
    Beiträge:
    282
    Danke erhalten:
    24
    Danke vergeben:
    87
    #25 Anonymous, 23. März 2014
    Zuletzt bearbeitet: 25. Mai 2016
    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.
     
  6. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    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?
     
  7. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62
    #27 maxwell, 23. März 2014
    Zuletzt bearbeitet: 23. März 2014
  8. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    Ahhh, well done! :D Wer gucken kann, ist doch tatsächlich klar im Vorteil....
     
  9. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    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.
     
  10. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Würg...

    Warum verbaut ihr immer noch diesen nicht-updatesicheren Scheiß????

    Zumindest dort, wo Gambio updatesichere Lösungen ermöglicht.
     
  11. Dennis (MotivMonster.de)

    Dennis (MotivMonster.de) G-WARD 2013/14/15/16

    Registriert seit:
    22. September 2011
    Beiträge:
    30.984
    Danke erhalten:
    6.096
    Danke vergeben:
    1.079
    Beruf:
    Mann für alles :)
    Ort:
    Weilburg
    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?
     
  12. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    "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.
     
  13. maxwell

    maxwell Erfahrener Benutzer

    Registriert seit:
    2. März 2012
    Beiträge:
    148
    Danke erhalten:
    18
    Danke vergeben:
    62

    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.
     
  14. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    3. Februar 2012
    Beiträge:
    282
    Danke erhalten:
    24
    Danke vergeben:
    87
    #34 Anonymous, 24. März 2014
    Zuletzt bearbeitet: 25. Mai 2016
    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...