2012-12-30 7 views
16

Ich entwickle ein Skript (außerhalb von Magento, kein Modul), das eine Textliste aller verfügbaren Produkte, deren Preise und einige andere Attribute ausgeben soll . Katalogpreisregeln werden jedoch nicht auf Produktpreise angewendet. Wenn ich eine der folgenden Aktionen verwenden:Magento: Wie bekomme ich den Preis eines Produktes mit angewandten Katalogregeln?

$_product->getPrice() 
$_product->getFinalPrice() 

ich den normalen Preis (ohne Regeln angewendet werden).

Wenn ich benutze:

$_product->getSpecialPrice() 

ich null es sei denn, das Produkt tatsächlich einen Sonderpreis in dem Produkt eingeführt hat selbst (das heißt, wenn Sonderpreis ist nicht mit Katalog Regeln verwandt).

Ich habe auch versucht

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice()) 

, wie in der Antwort von Fabian Blechschmidt vorgeschlagen, aber interessanterweise gibt es den normalen Preis nur, wenn das Produkt von jedem Katalog Regel betroffen ist, null zurückkehr anders.

Es gab eine ähnliche Frage in StackOverflow und Magento Forums vor einiger Zeit, aber die zur Verfügung gestellte Antwort (die den Code unten einfügen ist) funktioniert nicht für mich (zurückgegebene Preise bleiben gleich).

Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND,Mage_Core_Model_App_Area::PART_EVENTS); 

Hat jemand eine Idee, wie man das erreicht?

Ich benutze Magento 1.6.2.0. Vielen Dank im Voraus.

+2

Vielleicht passiert noch etwas anderes, was Ihre Daten oder Indexierung betrifft. Wird der Rabattpreis wie erwartet im Standardthema angezeigt, wenn alle benutzerdefinierten Module deaktiviert sind? – benmarks

+0

Ja, die verbilligten Preise zeigen Ok im Frontend an. Das Problem war, dass dies kein Magento-Modul war, sondern ein "externes" Skript. Es scheint, dass Magento zusätzliche Sachen lädt, die für alles benötigt werden, um richtig zu funktionieren. Mit anderen Worten, alles in Magento muss wirklich ein Modul sein ... – faken

+1

* "Alles in Magento muss wirklich ein Modul sein" * - Nicht wirklich. Es gibt jedoch viele Module, die auf vielfältige Weise interagieren, wenn die App ausgeführt wird. Ich würde prüfen, ob 'Mage_CatalogRule_Model_Observer' instanziiert wird. Vielleicht sollten Sie die relevanten Teile des Remote-Skript einfügen ('Mage :: app()' Instanziierung, 'loadAreaPart()' Anruf, Produkt laden, etc.) – benmarks

Antwort

10

ich das Problem entdeckt. Die Rabattpreise werden im Store-Frontend angezeigt. Das Problem war, dass ich ein Skript „extern“ zu Magento entwickle (also kein Magento-Modul), so etwas wie:

<?php 

set_time_limit(0); 
ignore_user_abort(); 
error_reporting(E_ALL^E_NOTICE); 
header("Content-Type: text/plain; charset=utf-8"); 

require_once "app/Mage.php"; 

// Get default store code 
$default_store = Mage::app()->getStore(); 
... 

Für alles richtig funktioniert, scheint es, dass man die richtige Magento Bootstrap folgen müssen, und entwickeln alles als ein Modul. Mein Skript war so einfach, dass ich dachte, es wäre nicht notwendig, ein komplettes Modul zu programmieren. Mit anderen Worten, alles in Magento sollte wirklich ein Modul sein.

Abschliessend das Modul-Ansatz, alle Methoden wie erwartet:

$_product->getPrice() 
$_product->getFinalPrice() 
$_product->getSpecialPrice() 

Danke allen für Ihre Eingabe.

18

Dank Sie fand ich eine neue Seite: http://www.catgento.com/magento-useful-functions-cheatsheet/

Und sie erwähnt:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice()) 

HTH

+0

Hallo, vielen Dank für die Antwort (Ich habe diese Website bei meinen Recherchen vermisst). Das scheint genau das zu sein, was ich brauche, aber es funktioniert nicht: die zurückgegebenen Preise sind die gleichen wie die ursprünglichen Preise (und es gibt überhaupt keinen Preis zurück, wenn das Produkt nicht von einer Regel betroffen ist, obwohl das später leicht gelöst werden könnte). Ich schaue mir den Code von Mage_CatalogRule_Model_Rule und den zugehörigen Klassen an, es scheint zu tun, was ich will, aber das tut es nicht. Ich habe auch versucht, Cache zu leeren, neu zu indizieren, etc., aber das Ergebnis ist immer das gleiche. Noch einmal vielen Dank. – faken

+0

versuche, das Produkt vorher zu laden $ _product-> load ($ _ product-> getId()) wenn das funktioniert, dann vermisst du ein Attribut. Halten Sie diesen Punkt nicht an. Suchen Sie nach dem fehlenden Attribut und fügen Sie es zur Sammlung hinzu. Der Code, den Sie gepostet haben, sieht aus wie view.phtml oder etwas, dann können Sie einfach die Attributeinstellungen im Backend ändern. –

+0

Ich habe versucht, diese zu verwenden, aber ich bin immer diese Fehlermeldung: Ungültige Methode Mage_CatalogRule_Model_Rule :: calcProductPriceRule Alles, was ich kann es tun? – Klettseb

9

Als Regeln Katalogpreis stark sind abhängig von der Zeit, zu speichern und zu besuchen Kunden, Sie müssen diese Parameter festlegen, wenn Sie den Produktendpreis mit den angewendeten Preisregeln abrufen möchten.

Also, in Ihrem Fall, stellen Sie sicher, dass zur Verfügung gestellt Produkt mit dem gewünschten Speicher und Kundengruppen-ID übergeben wird, die als gesetzt werden kann:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice()) 
+0

Es hat funktioniert. Vielen Dank. –

+0

Vielen Dank. Ich hatte das Problem, dass der Cronjob der Lengow Feed Export Erweiterung die Katalogregeln nicht korrekt für den Preisexport berücksichtigt hat. Nach dem Anwenden von setCustomerGroupId() auf die Produktinstanz hat es gut funktioniert. Ich denke, diese Lösung ist viel besser als Laden-Frontends von Mage :: app() simulieren -> loadAreaPart() usw. –

10

Dies half mir in dieser Ausgabe: http://www.magentocommerce.com/boards/viewthread/176883/ . Jernej's Lösung scheint plausibel zu sein, aber es behandelt keine Regeln, die andere Regeln mit 'stop processing' überschreiben und daher mehr als eine Regel anwenden können.

$original_price = $_product->getPrice(); 
$store_id = 1; // Use the default store 
$discounted_price = Mage::getResourceModel('catalogrule/rule')->getRulePrice( 
         Mage::app()->getLocale()->storeTimeStamp($store_id), 
         Mage::app()->getStore($store_id)->getWebsiteId(), 
         Mage::getSingleton('customer/session')->getCustomerGroupId(), 
         $_product->getId()); 

// if the product isn't discounted then default back to the original price 
if ($discounted_price===false) { 
    $discounted_price=$original_price; 
} 
+0

Obwohl faken's Antwort ist der richtige Weg, es zu tun. Wenn Sie ein Rebell sein wollen, funktioniert das. –

Verwandte Themen