gelöst Produktrabatt im Warenkorb

Thema wurde von maikguthauser, 11. Dezember 2017 erstellt.

  1. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    Servus zusammen,

    wir benutzen in unserem Shop - GX 3.5.1 / Honeygrid sehr oft die funktion des Produktrabatts -> also der Rabatt den man auf der Artikelseite einstellen kann.

    Nun möchte ich, dass der Rabatt im Warenkorb angezeigt wird, z.B. Sie sparen beim kauf dieses Artikels aktuell 10%.
    Mein Problem, ich bekomme die $PRODUCTS_DISCOUNT Variable die es z.B. im Snippet templates/Honeygrid/snippets/product_info/price.html gibt nicht in das Snippet templates/Honeygrid/snippets/order/order_item.html übertragen.

    Ich hatte bereits mehrere Versuche die Variable zu laden unternommen, scheitere aber immer wieder.

    Frage 1: Weiß jemand aus dem Stehgreif wie man die Variable in order_item verfügbar macht?
    Frage 2: Gibt es eine Anleitung, in der beschrieben wird, wie die Variablen Verfügbar gemacht werden können, bzw. welche Zusammenhänge wo bestehen?
    Frage 3: Gibt es zu dem {DEBUG} Kommando was in den Templates untergebracht werden kann noch eine etwas ausführlichere Fassung? Bei mir schneidet es mit DEBUG immer einiges ab, insbesondere bei den Dateinamen?

    Für eure Hilfe wäre ich sehr dankbar.

    Beste Grüße
    Maik
     
  2. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    #2 maikguthauser, 14. Dezember 2017
    Zuletzt bearbeitet: 14. Dezember 2017
    EDIT (Gelöst)

    Hi zusammen,

    ich habe mal noch etwas weiter herumgebastelt, und bin nun fast am Ziel. In der OrderDetailsCartContentView.php habe ich eine Erweiterung vorgenommen, die den Produktrabatt laden soll, dazu wurde zum einen

    die moduleContent Variable
    PHP:
    'PRODUCTS_DISCOUNT'               => $productsDiscount
    hinzugefügt. Die Funktioniert.

    Knapp darüber (Zeile 162) habe ich in den Prepare bereich noch den Verweis auf die Funktion gepackt die die Variable laden soll:
    PHP:
    $productsDiscount   $this->_getProductsDiscount($this->products[$i]);
    Und weiter unten dann die Funktion:

    PHP:
    protected function _getProductsDiscount($p_product)
    {
    $query "select products_discount_allowed from products where products_id='" . (int)$p_product['id'] . "'";
    $query xtc_db_query($query);
    $productsDiscountArray xtc_db_fetch_array($query);
    $productsDiscount $productsDiscountArray['products_discount_allowed'];
    return 
    $productsDiscount;
    }

    Beste Grüße Maik
     
  3. Torben Wark

    Torben Wark Gambio GmbH

    Registriert seit:
    15. Juli 2014
    Beiträge:
    2.581
    Danke erhalten:
    1.178
    Danke vergeben:
    399
    Dürfte es nicht reichen, wenn du da statt

    PHP:
    return $productsDiscount;
    ein

    PHP:
    return $productsDiscount['products_discount_allowed'];
    machst?
     
  4. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    Danke Torben, habe es gerade selber rausgefunden :)
     
  5. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    So, jetzt noch als kleine Anleitung, aber Achtung, das ganze ist nicht wirklich Updatesicher:

    Aufgabe: Im Adminbereich wird für einen Artikel ein Prozentualer Rabatt eingestellt. Dieser Rabattwert soll auch im Warenkorb angezeigt werden.
    [​IMG]

    Um das zu verwirklichen sind im wesentlichen 3 Dateien zu bearbeiten.

    Als erstes muss der Produkt Rabatt als Variable im Warenkorb Verfügbar gemacht werden. Dazu ist die Datei system/classes/shopping_cart/OrderDetailsCartContentView.inc.php zu bearbeiten.

    Im Bereich der Datenvorbereitungsfunktion
    PHP:
        public function prepare_data() 
    muss der Block
    PHP:
        $combisId       $this->_getCombisId($this->products[$i]);
               
    $markStock       $this->_getCheckMarkStock($this->products[$i], $combisId);
               
    $image           $this->_getImageThumbnailPath($this->products[$i]);
               
    $productId       $this->_getProductId($this->products[$i]);
               
    $productLink   $this->_getProductLink($this->products[$i]);
               
    $shippingTime   $this->_getShippingTime($this->products[$i], $combisId);
               
    $productsWeight   $this->_getProductsWeight($this->products[$i], $combisId);
               
    $productsModel   $this->_getProductsModel($this->products[$i], $combisId);
              
    $propertiesHtml   $this->_getPropertiesHtml($combisId);
    um eine Ladeanweisung ergänzt werden:
    PHP:
               $productsDiscount   $this->_getProductsDiscount($this->products[$i]);
    Direkt darunter befindet sich der moduleContent Bereich ($this->moduleContent[$i]).
    Diesen ergänzen wir um folgende Zeile
    PHP:
    'PRODUCTS_DISCOUNT'               => $productsDiscount
    Die nachfolgende Funktion kann einfach unten bei den anderen GET Funktionen eingefügt werden:

    PHP:
    protected function _getProductsDiscount($p_product)
       {
           
    //Query zum laden des Produktrabatts
           
    $query "select products_discount_allowed from products where products_id='" . (int)$p_product['id'] . "'";
           
    $query xtc_db_query($query);
           
    //Aufbau des Arrays
           
    $productsDiscountArray xtc_db_fetch_array($query);
           
    //Zuweisung des Array Ergebnisses auf die Variable
           
    $productsDiscount round($productsDiscountArray['products_discount_allowed'],0);
           
    // Funktionsergebniss übergeben
           
    return $productsDiscount;
       }
    Damit steht nun der Discount zur verfügung. Wichtig, wer einen Discount/Rabatt auch mit Nachkommastellen möchte muss einfach das Round(.....,0) in der Funktion weglassen.

    Als nächstes ist die order_item.html dran. Diese Datei herunterladen und in order_item-USERMOD.HTML umbenennen.
    In diese Datei integrieren wir die folgende Anweisung nach der if price_vpe Anweisung
    PHP:
        {$p_price_vpe}
               {/if}
    PHP:
               {if $module_data.PRODUCTS_DISCOUNT '0' }
               <
    br />
               {
    load_language_text section="mgpreis"}
               {
    $txt.mgpreis_discountvorne}{$module_data.PRODUCTS_DISCOUNT}{$txt.mgpreis_discounthinten}
               {/if}
    Im Ordner lang/german/user_sections muss die Datei mgpreis.lang.inc.php angelegt werden, der Inhalt muss wie folgt aussehen:

    PHP:
    <?php

    $t_language_text_section_content_array 
    = array
    (
       
    'mgpreis_discountvorne' => '<font class="mgprice-discount">Inkl. ',
       
    'mgpreis_discounthinten' => ' % Extra-Rabatt</font>'   
    );
    Last but not least muss über die CSS Dateien bzw. den Style Edit noch die Klasse mgprice-discount angelegt werden.
    Als Beispiel:
    Code:
    .mgprice-discount {
                    font-size:   13px;
                    font-weight: 600;
                    color:        #FF0000;
    }
    Und schon ist man fertig.

    Beste Grüße Maik
     

    Anhänge:

  6. Torben Wark

    Torben Wark Gambio GmbH

    Registriert seit:
    15. Juli 2014
    Beiträge:
    2.581
    Danke erhalten:
    1.178
    Danke vergeben:
    399
  7. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    Hmmm.... entweder fehlt mir dazu das vollständige Verständnis oder die Anleitung schafft es nicht ganz mein träges Hirn in Wallung zu versetzen. :D

    Nicht Updatesicher ist momentan ja der Teil in der OrderDetailsCartContentView.inc.php - Wenn ich die Anleitung richtig verstehe, muss ich nun im GXUserComponents/overloads einen Ordner names OrderDetailsCartCpontentView anlegen und darin die Datei "meine"_OrderDetailsCartContentView.inc.php

    Soweit sollte es noch passen.

    In die PHP kann ich nun meine Funktion schreiben

    PHP:
    <?php

    class mg_OrderDetailsCartContentView extends mg_OrderDetailsCartContentView_parent
    {
       
       protected function 
    _getProductsDiscount($p_product)
       {
           
    //Query zum laden des Produktrabatts
           
    $query "select products_discount_allowed from products where products_id='" . (int)$p_product['id'] . "'";
           
    $query xtc_db_query($query);
           
    //Aufbau des Arrays
           
    $productsDiscountArray xtc_db_fetch_array($query);
           
    //Zuweisung des Array Ergebnisses auf die Variable
           
    $productsDiscount round($productsDiscountArray['products_discount_allowed'],0);
           
    // Funktionsergebniss übergeben
           
    return $productsDiscount;
       }
       
       
    }
    Was mache ich aber mit den Erweiterungen, die ich in die public function prepare_data() integriert habe??
    Das ist mir an der Stelle nicht klar. Müssen die bleiben wo die sind, oder muss ich die entsprechenden Teile der Funktion einfach auch in die neue Datei schreiben?

    Für die Erleuchtung meines Geistes sei der Name der Taschenlampe gepriesen :D

    Beste Grüße Maik
     
  8. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Hallo Maik,
    Du schreibst alle Teile in Deine neue Datei.
    Ich kann dir nur nciht sagen was alles oder wie.
    Wenn ich so etwas für mich mache, schreibe ich meistens einen halben Roman, ein Programmierer würde vermutlihc nur 3 Zeilen brauchen :D
     
  9. Torben Wark

    Torben Wark Gambio GmbH

    Registriert seit:
    15. Juli 2014
    Beiträge:
    2.581
    Danke erhalten:
    1.178
    Danke vergeben:
    399
    Schnellschuss am frühen morgen, könnte funktionieren :D :

    PHP:
    <?php

    class mg_OrderDetailsCartContentView extends mg_OrderDetailsCartContentView_parent
    {
       
        public function 
    prepare_data()
        {
            
    // Call parent function to get all needed data for products
            
    parent::prepare_data();
       
            
    // Loop over all products to extend module content array with discount value
            
    for($i 0$n sizeof($this->products); $i $n$i ++)
            {
                
    $productsDiscount   $this->_getProductsDiscount($this->products[$i]);
       
                
    $this->moduleContent[$i][] = $productsDiscount;
            }
        }
       
        protected function 
    _getProductsDiscount($p_product)
        {
            
    // Query to get the product discount
            
    $query "select products_discount_allowed from products where products_id='" . (int)$p_product['id'] . "'";
            
    $query xtc_db_query($query);
           
            
    // Fetch query result
            
    $productsDiscountArray xtc_db_fetch_array($query);
           
            
    // Get rounded discount from result array
            
    $productsDiscount round($productsDiscountArray['products_discount_allowed'],0);
           
            
    // Return rounded discount
            
    return $productsDiscount;
        }
    }
    Zur Erklärung was ich da gemacht habe: Zunächst habe ich da einen Overload der prepare_data() Methode. Damit diese aber weiterhin alle notwendigen Daten für das Produkt setzt verwendet ich parent::prepare_data(), welches dafür sorgt, dass die Logik der Elternmethode einmal ausgeführt wird. Im Anschluss durchlaufe ich noch einmal die for-Schleife aus der Eltern-Methode, um das module content Array um den benötigten Wert zu erweitern.
     
  10. maikguthauser

    maikguthauser Aktives Mitglied

    Registriert seit:
    9. Juli 2014
    Beiträge:
    37
    Danke erhalten:
    1
    Danke vergeben:
    10
    Danke, ich werde es nächste Woche testen und dann bescheid geben.