HowTo: Overrides Modulinkompatibilitäten mit EU-Legal lösen 11. September 2014

Dieses HowTo beschreibt einen Lösungsweg, um Modulinkompatibilitäten zwischen EU-Legal und anderen Fremdmodulen zu lösen. Dazu ist allerdings ein wenig Fachwissen und einiges Erfahrung mit PrestaShop Overrides notwendig. Am Beispiel des Moduls Attribut Wizard Pro (AWP) wird exemplarisch ein Lösungsweg vorgeschlagen.

Analyse der Cart.php Attribut Wizard Pro (AWP) Overrides

Im ersten Schritt wird untersucht, welche Methoden der Cart.php in AWP überschrieben werden:

  • getLastProducts
  • getProducts *
  • cacheSomeAttributesLists
  • containsProduct
  • updateQty
  • deleteProduct
  • duplicate
  • duplicateProduct
  • setNoMultishipping
  • autosetProductAddress

Analyse der Cart.php EU-Legal Overrides

Dann wird untersucht, welche Methoden der Cart.php in EU-Legal überschrieben werden:

  • getProducts *
  • getOrderTotal
  • getGiftWrappingPrice
  • containsVirtualProducts
  • getTaxDetails
  • getPackageShippingCost

Die mit * gekennzeichneten Methoden werden in beiden Modulen überschrieben. Hier handelt es sich nur um die getProducts()-Methode.

Abhängig davon, welches Modul bereits installiert es gibt es nun 2 Möglichkeiten:

Die Cart.php in EU-Legal oder die Cart.php in AWP modifizieren. Um die Unterschiede zu erkennen, benutzt man einen Dateivergleichseditor, z.B. Beyond Compare von Scooter Software. Es müssen beide Methoden im Dateivergleich zusammengeführt werden.

Unterschiede EU-Legal Cart.php getProducts() Override (EU-Legal_Cart.php_getProducts) zu AWP Cart.php getProducts() Override-Methode (AWP_Cart.php_getProducts), Ausgabe der Patch-Datei:

Linke Datei: AWP_Cart.php_getProducts

Rechte Datei: EU-Legal_Cart.php_getProducts

2a3,9

>

> /*

> * EU-Legal

> * 1) correct calculation of prices -> Problem with inaccuracy at high number of items

> * 2) assign standard delivery times to products

> */

>

23,24c30,31

< $sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.`instructions` AS instructions, cp.`instructions_valid` AS instructions_valid, cp.`instructions_id` AS instructions_id, cp.id_shop, pl.`name`, p.`is_virtual`,

< pl.`description_short`, pl.`available_now`, pl.`available_later`, product_shop.`id_category_default`, p.`id_supplier`,

---

> $sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, pl.`name`, p.`is_virtual`,

> pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`delivery_now`, pl.`delivery_later`, product_shop.`id_category_default`, p.`id_supplier`,

29c36

< CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), LPAD(IFNULL(cp.`instructions_valid`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0)) AS unique_id, cp.id_address_delivery,

---

> CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0)) AS unique_id, cp.id_address_delivery,

163c170

< 2,

---

> 6, /* EU-Legal* correct calculation of prices -> Problem with inaccuracy at high number of items */

179,181c186,194

<

< $row['total_wt'] = Tools::ps_round($row['price'] * (float)$row['cart_quantity'] * (1 + (float)$tax_rate / 100), 2);

< $row['total'] = $row['price'] * (int)$row['cart_quantity'];

---

>

> /*

> * EU-Legal

> * correct calculation of prices -> Problem with inaccuracy at high number of items */

> //$row['total_wt'] = Tools::ps_round($row['price'] * (float)$row['cart_quantity'] * (1 + (float)$tax_rate / 100), 2);

> //$row['total'] = $row['price'] * (int)$row['cart_quantity'];

> $row['total_wt'] = $row['price_wt'] * (int)$row['cart_quantity'];

> $row['total'] = Tools::ps_round($row['price'] * (int)$row['cart_quantity'], 2);

>

189c202

< 2,

---

> 6, /* EU-Legal* correct calculation of prices -> Problem with inaccuracy at high number of items */

226c239,243

< $row['total'] = Tools::ps_round($row['price'] * (int)$row['cart_quantity'], 2);

---

> /*

> * EU-Legal

> * correct calculation of prices -> Problem with inaccuracy at high number of items */

> //$row['total'] = Tools::ps_round($row['price'] * (int)$row['cart_quantity'], 2);

> $row['total'] = $row['price'] * (int)$row['cart_quantity'];

263c280,286

<

---

>

> /*

> * EU-Legal

> /* assign standard delivery times to products */

> $row['delivery_now']   = !empty($row['delivery_now'])   ? $row['delivery_now']   : Configuration::get('LEGAL_DELIVERY_NOW', $this->id_lang);

> $row['delivery_later'] = !empty($row['delivery_later']) ? $row['delivery_later'] : Configuration::get('LEGAL_DELIVERY_LATER', $this->id_lang);

>

266a290

>

269a294

>

270c295

< }

---

> }

\ No newline at end of file

Ersetzen der Methode getProducts() im installierten EU-Legal-Override Cart.php

Wir gehen davon aus, dass EU-Legal bereits installiert ist. Daher wird die neue Methode getProducts() in die bestehende Override des EU-Legal Moduls eingebaut und ersetzt damit die ursprüngliche Override. Diese ist damit für das AWP Modul vorbereitet.

Löschen der Methode getProducts() in AWP-Override Cart.php

Als nächstes muss diese Methode aus der Override Cart.php von AWP komplett gelöscht werden. Damit wird sicher gestellt, dass die Override problemlos ohne Kompatibilitätskonflikte installiert werden kann.

Falls bereits AWP installiert ist und EU-Legal nachträglich hinzukommt, muss die Reihenfolge einfach vertauscht werden.

Diese Prozedur muss mit allen Override Dateien und beteiligten Methoden wiederholt werden. Danach kann das zweite Modul problemlos installiert werden.

Updates der Module?

Einfache Updates sind damit logischerweise nicht mehr möglich. Sobald eines der Module aktualisiert wird, muss der Programmcode manuell geprüft und gegebenfalls mit den neuen Änderungen angepasst werden. Wir empfehlen daher immer die ungepatchten Originalversionen der Module separat zu speichern, um die Unterschiede zwischen neuem und alten Modul besser erkennen zu können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.