集合可见性和状态筛选器已弃用,应改用什么


Collection visibility and status filters are deprecated, what should be used instead?

Mage_Catalog_Model_Product_StatusaddVisibleFilterToCollection()addSaleableFilterToCollection()方法都用@deprecated注释,但没有关于使用哪种方法的说明。Magento核心中的代码仍在使用这些方法,参考Mage_Catalog_Model_Layer::prepareProductCollection()

应该使用什么方法来用正确的可见性/可销售过滤器装饰收藏品?

对于可见性,有(来自Mage_Catalog_Model_Layer::p repareProductCollection()):

Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

这会将目录和两个过滤器设置为集合。

对于状态,它看起来有点奇怪,但仍然有意义。在应用程序/代码/核心/法师/目录/模型/资源/产品/集合中_initSelect.php完成以下操作:

$this->getSelect()
            ->from(array(self::MAIN_TABLE_ALIAS => $this->getEntity()->getFlatTableName()), null)
            ->columns(array('status' => new Zend_Db_Expr(Mage_Catalog_Model_Product_Status::STATUS_ENABLED)));

此代码在执行

Mage::getResourceModel('catalog/product_collection')

所以基本上在执行

$category->getProductCollection()

或类似的产品集合调用。

您是否尝试过常用方法:

addAttributeToFilter('visibility',Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
addAttributeToFilter('status',1)

如果你看第66行

app/code/core/Mage/Catalog/Model/Product/Visibility.php

您将看到已弃用的调用被注释掉并替换为

$collection->setVisibility($this->getVisibleInCatalogIds());

这是我如何使用我的重构

$this->_itemCollection->setVisibility($this->getVisibleInCatalogIds());
// Deprecated: Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($this->_itemCollection);

如果您想了解有关已弃用函数的更多信息,请查看此处:http://freegento.com/doc/dc/d5b/_visibility_8php-source.html