我需要按禁用状态过滤 magento 产品集合。Magento 在加载集合时似乎默认忽略禁用的产品。
所以我的问题有两个部分:
1 - 我如何在magento中加载仅包含禁用产品的集合?2 - 为什么magento一开始就没有在集合中加载禁用的产品?
我正在使用标准代码来加载集合:
$collction = Mage::getModel('catalog/product')->getCollection()
这永远不会加载禁用的产品。
我需要按禁用状态过滤 magento 产品集合。Magento 在加载集合时似乎默认忽略禁用的产品。
所以我的问题有两个部分:
1 - 我如何在magento中加载仅包含禁用产品的集合?2 - 为什么magento一开始就没有在集合中加载禁用的产品?
我正在使用标准代码来加载集合:
$collction = Mage::getModel('catalog/product')->getCollection()
这永远不会加载禁用的产品。
如果使用产品扁平结构,那么
$col = Mage::getModel('catalog/product')->getCollection();
将使用平面表(例如catalog_product_flat_1
),并且disabled
产品不属于该表。
将配置更改Use Flat Catalog Product
为“否”,您将拥有集合中的所有产品:
它将以这种方式加载所有产品。
如果您不想在后台更改配置(以保持良好的性能),我发现这个解决方案可以在处理您的请求时更改值,因为我只希望禁用产品用于特定功能:
Mage::app()->getStore()->setConfig('catalog/frontend/flat_catalog_product', 0);
您必须在第一次调用之前设置:
Mage::getModel('catalog/product')->getCollection()
我注意到您无法在同一请求期间将其设置回 1,可能是因为集合模型存储将此标志保留在内存中。
这样,我的数据库中的配置就没有改变。
获得收藏后,您可以使用 ->joinTable('cayaloginventory/stock_item','product_id=entity_id',array('stock_status'=>'is_in_stock')) 加入表格
只需添加 ->addAttributeToFilter('status', array('eq' => 1) )... 这将仅加载 AVAILABLE .. 如果您想加载您需要的有库存产品的表加载 DISABLE 将状态更改为 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 ) );
启用平板产品后,您最好使用
$collection = Mage::getResourceModel('catalog/product_collection')
您将能够检索禁用和启用的产品。
请参阅此答案以获得更好的解释: https ://magento.stackexchange.com/a/40001/32179
这应该加载由禁用产品过滤的集合。
$products = Mage::getModel('catalog/product')->getCollection()
->setStoreId(Mage::app()->getStore()->getId())
->addAttributeToFilter('status', '0');