Frage

Vielleicht bin ich nur dumm und kann das Offensichtliche aber nicht sehen, aber ..

Es stehen 3 verschiedene Berechnungsmethoden mit Tabellenraten in Magento zur Verfügung, und eines davon ist "# der Elemente vs. Ziel". Ich kann also hoffen, dass die Idee dieser Methode je nach Anzahl der Elemente im Karren unterschiedliche Preise angeben soll.

Nehmen wir ein Beispiel.

Nehmen wir an, wir möchten, dass der Versandsatz ist X Wenn die Anzahl der Elemente im Karren unten ist 60 und Y zum 60 Gegenstände und höher.

Zu diesem Zweck kompilieren wir den folgenden CSV:

Country,Region/State,"Zip/Postal Code","# of Items (and above)","Shipping Price"
*,      *,           *,                1.0000,                  X
*,      *,           *,                60.0000,                 Y

Nach kurzem Debuggen von Mage_Shipping_Model_Resource_Carrier_Tablerate::getRate() Ich fand heraus, dass es zu der folgenden Abfrage führen wird:

  SELECT `shipping_tablerate`.* 
    FROM `shipping_tablerate` 
   WHERE (website_id = :website_id) 
     AND ((dest_country_id = :country_id 
           AND dest_region_id = :region_id 
           AND dest_zip = :postcode) 
         OR (dest_country_id = :country_id 
          AND dest_region_id = :region_id 
          AND dest_zip = '') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = :region_id 
          AND dest_zip = '*') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '*') 
         OR (dest_country_id = '0' 
          AND dest_region_id = :region_id 
          AND dest_zip = '*') 
         OR (dest_country_id = '0' 
          AND dest_region_id = 0 
          AND dest_zip = '*') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = :postcode) 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '*')) 
     AND (condition_name = :condition_name) 
     AND (condition_value <= :condition_value) 
ORDER BY `dest_country_id` DESC, `dest_region_id` DESC, `dest_zip` DESC    
   LIMIT 1

Seien Sie nicht mit all diesen Bedingungen verwechselt. Der einzige, der zählt, ist das, das ist:

     AND (condition_value <= :condition_value)

Dies bedeutet, dass, wenn wir sagen, sagen wir 63 Gegenstände im Wagen werden beide Zeilen unseres CSV erfüllen, weil 1 <= 63 ebenso gut wie 60 <= 63. Dies bedeutet, dass alles darauf zurückzuführen ist ORDER BY Was, wie Sie sehen können, keinen Sinn ergeben. Infolgedessen werden wir immer die erste Zeile bekommen und X Bewertung.

Also werde ich mit dem gleichen Muster wie ich beginnen. Vermisse ich etwas Offensichtliches oder gibt es etwas schrecklich falsches?

War es hilfreich?

Lösung

Es ist mit ziemlicher Sicherheit ein Fehler, da Magento die Zustandswerte in keiner Weise sortiert. Die Preise werden auch während des Imports nicht sortiert (wie Sie sehen können, werden Einträge in derselben Reihenfolge eingefügt, die sie im CSV verwenden insertArray), so dass Magento immer noch die richtige Rate laden kann, wenn die Reihenfolge im Import korrekt ist. Diese von Ihnen eingereichte Abfrage kann jedoch zu falschen Ergebnissen führen, ohne dass eine bemerkt wird.

Um dies zu beheben, würde es ausreichen, um zu bearbeiten Mage_Shipping_Model_Resource_Carrier_Tablerate, Zeile 128 (CE 1.7.0.2) mit:

->order(array('dest_country_id DESC', 'dest_region_id DESC', 'dest_zip DESC', 'condition_value DESC'))

Eine Pull -Anfrage wäre das Richtige, denke ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top