2012-12-30 74 views
16

我正在開發一個腳本(Magento外部,而不是一個模塊),其目的是輸出所有可用產品的文本列表,它們的價格和一些其他屬性。但是,目錄價格規則似乎不適用於產品價格。如果我使用以下任何一項:Magento:如何獲得應用目錄規則的產品的價格

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

我得到正常價格(沒有應用規則)。

如果我使用:

$_product->getSpecialPrice() 

我得到,除非該產品實際上有一個特殊的價格插在產品本身的(即如有特殊價格不與目錄規則有關)。

我也試過

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

爲在法比安布萊赫施密特給出的答案建議,但有趣的是它返回只有當產品被任何目錄規則的影響,回國否則正常價格。

前段時間StackOverflowMagento Forums也有類似的問題,但是提供的答案(即插入代碼如下)對我不起作用(返回的價格保持不變)。

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

有沒有人有如何實現這個想法?

我使用的是Magento 1.6.2.0。 在此先感謝。

+2

也許還有其他的事情正在涉及您的數據或索引。所有定製模塊被禁用時,折扣價格是否按默認主題預期顯示? – benmarks

+0

是的,折扣價顯示在前端。問題是這不是一個Magento模塊,而是一個「外部」腳本。看來Magento加載了一切正常工作所需的附加內容。換句話說,Magento中的所有東西都必須是一個模塊...... – faken

+1

*「Magento中的所有內容都必須是模塊」* - 並非如此。然而,有很多模塊在應用程序執行時以多種方式進行交互。我會檢查'Mage_CatalogRule_Model_Observer'是否正在實例化。也許你應該粘貼遠程腳本的相關部分('Mage :: app()'實例化,'loadAreaPart()'調用,產品加載等) – benmarks

回答

10

我發現這個問題。折扣價格在商店前臺顯示爲Ok。問題是,我開發一個腳本「外部」到Magento的(因此不是Magento的模塊),是這樣的:

<?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(); 
... 

一切正常工作,似乎一個必須遵循正確的Magento的引導,並制定一切都作爲一個模塊。我的腳本非常簡單,我認爲不需要編寫完整的模塊。換句話說,Magento中的所有東西都應該是一個模塊。

結論,使用模塊的方法,所有的方法按預期工作:

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

謝謝大家對您的輸入。

18

謝謝你,我發現了一個新的網站: http://www.catgento.com/magento-useful-functions-cheatsheet/

,他們提到:

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

HTH

+0

嗨,謝謝你的回答(我錯過了我的搜索網站)。這似乎正是我需要的,但它不起作用:退貨價格與原始價格相同(如果產品不受任何規則影響,它不會返回任何價格,儘管後者可以輕鬆解決)。我正在查看來自Mage_CatalogRule_Model_Rule和相關類的代碼,它似乎按照我想要的做,但事實並非如此。我也嘗試刷新緩存,reindex等,但結果總是相同的。再次感謝。 – faken

+0

嘗試預先加載產品$ _product-> load($ _ product-> getId())如果這有效,那麼你錯過了一個屬性。不要停止這一點。查看哪些屬性丟失並將其添加到集合中。你發佈的代碼看起來像view.phtml或其他東西,那麼你可以改變後端的屬性設置。 –

+0

我試圖用這個,但我得到這個錯誤: 無效的方法Mage_CatalogRule_Model_Rule :: calcProductPriceRule 我能做的任何事情嗎? – Klettseb

9

由於目錄價格規則,在很大程度上取決於時間,存儲和訪問客戶,您需要在應用價格規則時檢索產品最終價格時設置這些參數。

所以,你的情況,確保所提供的產品與所需的存儲和客戶羣ID,它可以設置爲通過:

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

它的工作。謝謝。 –

+0

非常感謝。我有問題的是,Lengow Feed Export擴展的Cronjob沒有正確考慮目錄規則的價格導出。將setCustomerGroupId()應用於產品實例後,它運行良好。 我認爲這個解決方案要好得多,然後通過Mage :: app() - > loadAreaPart()等模擬商店前端。 –

10

這幫了我這個問題:http://www.magentocommerce.com/boards/viewthread/176883/ 。 Jernej的解決方案似乎是合理的,但它不處理通過使用「停止處理」覆蓋其他規則並因此可以應用多條規則的規則。

$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

儘管faken的答案是正確的方法。如果你想成爲一名叛軍,這確實有效。 –

相關問題