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
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
Dürfte es nicht reichen, wenn du da statt PHP: return $productsDiscount; ein PHP: return $productsDiscount['products_discount_allowed']; machst?
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. 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
Zum Thema nicht ganz Updatesicher: Schau dir mal das hier an: https://developers.gambio.de/tutorials.html?v=3.7.1.0&p=class-overloading Damit solltest du es eigentlich schaffen können, dass deine Anpassung auch Updatesicher ist.
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. 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: <?phpclass 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 Beste Grüße Maik
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
Schnellschuss am frühen morgen, könnte funktionieren : PHP: <?phpclass 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:repare_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.