2013-02-26 132 views
5

我需要通過禁用狀態來過濾magento產品集合。 Magento在加載集合時似乎默認忽略禁用的產品。Magento加載包括禁用產品的產品集合

因此有兩個部分,我的問題:

1 - 我如何可以加載在只含禁用產品Magento的收藏? 2 - 爲什麼magento無法在集合中加載禁用的產品?

我使用標準的代碼加載集合:

$collction = Mage::getModel('catalog/product')->getCollection() 

這永遠不會加載禁用的產品。

回答

7

如果您使用的產品扁平結構,然後

$col = Mage::getModel('catalog/product')->getCollection(); 

將使用平面表(如catalog_product_flat_1),和disabled產品是不是表的一部分。

更改配置Use Flat Catalog Product爲「否」,你將擁有所有產品的集合: catalog-flat

它將這種方式加載的所有產品。

+0

的殘疾人收集這引起了我一半。它停止使用扁平表,但它仍然連接到表mage_catalog_category_product_index而不是'mage_catalog_category_product',所以我仍然無法獲得禁用的產品。 – 2014-07-18 21:53:49

+0

我通過應用' - > setStoreId(Mage_Core_Model_App :: ADMIN_STORE_ID)'得到了它。這將是你需要做的所有事情,但除非你關閉使用平面目錄產品,否則Magento會嘗試在不應該出現錯誤時使用它。所以我必須一起使用它們 – 2014-07-18 22:10:40

-5

這應該加載您的收藏過濾被禁用的產品。

$products = Mage::getModel('catalog/product')->getCollection() 
     ->setStoreId(Mage::app()->getStore()->getId()) 
     ->addAttributeToFilter('status', '0'); 
+4

首先,禁用狀態是'2'。其次,殘疾人產品不在集合中,因此過濾不起作用。 – 2014-07-18 21:00:58

+0

殘疾產品stauts是「2」而不是「0」 – Mohamed23gharbi 2015-02-26 17:40:14

2

如果你不想改變你的配置在後臺(保持良好的性能),我發現這個解決方案,改變只是當你的請求被處理的價值,因爲我只想要禁用產品特定功能:

Mage::app()->getStore()->setConfig('catalog/frontend/flat_catalog_product', 0); 

你必須在第一時間打電話之前設置此:

Mage::getModel('catalog/product')->getCollection() 

我注意到了同樣的要求時,你不能將其設置回1,親因爲集合模型商店將這個標誌保存在內存中。

這樣,我的數據庫中的配置沒有改變。

0

隨着平板產品的啓用,你最好使用

$collection = Mage::getResourceModel('catalog/product_collection') 

您將能夠檢索殘疾人和功能的產品。

一個更好的解釋,看到這個答案: https://magento.stackexchange.com/a/40001/32179

0

一旦你得到你的收藏,你可以使用連接表 - > joinTable( 'cayaloginventory/stock_item', '的product_id = ENTITY_ID',陣列( 'stock_status'= >'is_in_stock'))

這將加載你需要的產品庫存,只需添加 - > addAttributeToFilter('status',array('eq'=> 1))...這個表將僅加載AVAILABLE ..如果要禁用更改狀態加載到2

讓所有產品

 $collection = Mage::getModel('catalog/product') 
        ->getCollection() 
        ->joinTable('cataloginventory/stock_item', 'product_id=entity_id', array("stock_status" => "is_in_stock"))   
        ->addAttributeToFilter('status', array('eq' => 2));