【问题标题】:Magento load product collection including disabled productsMagento 加载产品集合,包括禁用产品
【发布时间】:2013-02-12 05:55:51
【问题描述】:

我需要按禁用状态过滤 magento 产品集合。 Magento 在加载集合时似乎默认忽略禁用的产品。

所以我的问题有两个部分:

1 - 如何在 magento 中加载仅包含禁用产品的集合? 2 - 为什么magento一开始就没有在集合中加载禁用的产品?

我正在使用标准代码来加载集合:

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

这永远不会加载禁用的产品。

【问题讨论】:

    标签: magento


    【解决方案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 ) );
    

    【讨论】:

      【解决方案2】:

      启用扁平化产品,您最好使用

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

      您将能够检索禁用和启用的产品。

      请参阅此答案以获得更好的解释: https://magento.stackexchange.com/a/40001/32179

      【讨论】:

        【解决方案3】:

        如果您不想在后台更改配置(以保持良好的性能),我发现这个解决方案可以在处理您的请求时更改值,因为我希望禁用的产品仅用于特定功能:

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

        你必须在第一次调用之前设置这个:

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

        我注意到您不能在同一请求期间将其设置回 1,可能是因为集合模型存储将此标志保留在内存中。

        这样,我的数据库中的配置没有改变。

        【讨论】:

          【解决方案4】:

          这应该会加载您按禁用产品过滤的集合。

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

          【讨论】:

          • 首先,禁用状态是2。其次,被禁用的产品一开始就不在集合中,所以过滤没有帮助。
          • 禁用产品状态为“2”而不是“0”
          【解决方案5】:

          如果你使用产品扁平结构,那么

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

          将使用平面表(例如catalog_product_flat_1),而disabled 产品不属于该表。

          将配置Use Flat Catalog Product 更改为“否”,您将拥有集合中的所有产品:

          它将以这种方式加载所有产品。

          【讨论】:

          • 这让我走到了一半。它停止使用平面表,但它仍然加入到表mage_catalog_category_product_index而不是mage_catalog_category_product,所以我仍然无法获得禁用的产品。
          • 我通过申请->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) 让它工作了。这将是您需要做的所有事情,但除非您关闭使用平面目录产品,否则 Magento 会在不应该使用它时尝试使用它并抛出错误。所以我不得不同时使用它们
          猜你喜欢
          • 2013-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2014-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多