2013-02-26 116 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));