Je suis en train de développer un script (externe à Magento, pas un module) qui vise à produire une liste de textes de tous les produits disponibles, leurs prix et quelques autres attributs. Cependant, les règles de prix catalogue ne semblent pas s'appliquer aux prix des produits. Si j'utilise l'un des éléments suivants:
$_product->getPrice()
$_product->getFinalPrice()
J'obtiens le prix normal (sans application de règles).
Si j'utilise:
$_product->getSpecialPrice()
J'obtiens null sauf si le produit a réellement un prix spécial inséré dans le produit lui-même (c'est-à-dire si le prix spécial n'est pas lié aux règles du catalogue).
J'ai aussi essayé
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice())
comme suggéré dans la réponse donnée par Fabian Blechschmidt, mais il est intéressant de noter qu'il ne renvoie le prix normal que si le produit est affecté par une règle de catalogue, renvoyant null sinon.
Il y avait une question similaire dans StackOverflow et Magento Forums il y a quelque temps, mais la réponse fournie (qui consiste à insérer le code ci-dessous) ne fonctionne pas pour moi (prix retournés reste le même).
Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND,Mage_Core_Model_App_Area::PART_EVENTS);
Quelqu'un at-il une idée de la façon d'y parvenir?
J'utilise Magento 1.6.2.0. Merci d'avance.
J'ai découvert le problème. Les prix réduits affichent Ok dans le frontend du magasin. Le problème était que je développais un script "externe" à Magento (donc pas un module Magento), quelque chose comme:
<?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();
...
Pour que tout fonctionne correctement, il semble que l'on doit suivre le bon bootstrap Magento et tout développer en tant que module. Mon script était si simple que je pensais qu'il ne serait pas nécessaire de coder un module complet. En d'autres termes, tout dans Magento devrait vraiment être un module.
En conclusion, en utilisant l'approche module, toutes les méthodes fonctionnent comme prévu:
$_product->getPrice()
$_product->getFinalPrice()
$_product->getSpecialPrice()
Merci à tous pour votre participation.
Grâce à vous, j'ai trouvé un nouveau site: http://www.catgento.com/magento-useful-functions-cheatsheet/
Et ils ont mentionné:
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice())
HTH
Cela m'a aidé dans ce problème: http://www.magentocommerce.com/boards/viewthread/176883/ . La solution de Jernej semble plausible, mais elle ne gère pas les règles qui écrasent les autres règles en utilisant "arrêter le traitement" et peut donc appliquer plus d'une règle.
$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;
}
Comme les règles de prix du catalogue dépendent fortement du temps, du magasin et du client visiteur, vous devez définir ces paramètres lorsque vous souhaitez récupérer le prix final du produit avec ses règles de prix appliquées.
Donc, dans votre cas, assurez-vous que le produit fourni est transmis avec l'ID de magasin et de groupe de clients souhaité, qui peut être défini comme:
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice())