【问题标题】:Magento (CE 1.3) - Filter productCollection where stock quantity is 0Magento (CE 1.3) - 过滤 productCollection 库存数量为 0
【发布时间】:2011-09-27 16:54:02
【问题描述】:

Magento 1.3

我正在尝试从 productCollection 中过滤出缺货商品。使用:

 ->addAttributeToFilter('status',array('neq' => Mage_Catalog_Model_Product_Status::STATUS_DISABLED))

我可以按状态过滤,但是在这个商店中,启用的产品仍然可以有 0 个数量。

使用:

->addAttributeToFilter('qty', array('gt' => 0))

返回“数量”不是属性错误。

$this->_productCollection = $this->_productCollection->addAttributeToSelect('*')
                            ->setStoreId($storeId)
                            ->addStoreFilter($storeId)
                            ->addAttributeToFilter('status',array('neq' => Mage_Catalog_Model_Product_Status::STATUS_DISABLED))                              
                            ->setPageSize($this->getToolbarBlock()->getLimit());

有什么想法吗?谢谢。

【问题讨论】:

  • 您必须加入库存物品集合才能实现此目的

标签: magento filter magento-1.3


【解决方案1】:

你可以这样使用:

$oCollection = Mage::getModel('catalog/product')
->getCollection()
->joinField(
    'qty',
    'cataloginventory/stock_item',
    'qty',
    'product_id=entity_id',
    '{{table}}.stock_id=1',
    'left'
)
->addAttributeToFilter('qty', array('eq' => 0));

如果您根本不需要catalog/product 数据(产品ID 除外),但只想知道哪些产品ID 通常的数量为零,您也可以使用:

$oCollection = Mage::getModel('cataloginventory/stock_item')
->getCollection()
->addQtyFilter('=', 0);

【讨论】:

  • 这并不总是有效,但取决于它是否被选中Manage stock
【解决方案2】:

如果你想把它放在一个简单的模块中,请看下面:

app/code/local/Company/InStockOnly/etc/config.xml

<?xml version="1.0"?>
<config>

<global>
  <models>
    <company_instockonly>
      <class>Company_InStockOnly_Model</class>
    </company_instockonly>
  </models>
</global>

<frontend>
  <events>
    <catalog_block_product_list_collection>
      <observers>
        <company_instockonly_list>
          <type>singleton</type>
          <class>company_instockonly/observer</class>
          <method>addInStockOnlyFilter</method>
        </company_instockonly_list>
      </observers>
    </catalog_block_product_list_collection>
  </events>
</frontend>

</config>

app/code/local/Company/InStockOnly/Model/Observer.php

<?php

class Company_InStockOnly_Model_Observer {

  /**
   * Observes the catalog_block_product_list_collection event
   */
  public function addInStockOnlyFilter($observer){
    $observer->getEvent()->getCollection()
      ->joinField('stock_status','cataloginventory/stock_status','stock_status',
        'product_id=entity_id', array(
          'stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK,
          'website_id' => Mage::app()->getWebsite()->getWebsiteId(),
        ))
    ;
  }
}

然后让 Magento 发现你的模块:

app/etc/modules/Company_InStockOnly.xml

<config>
  <modules>
    <Company_InStockOnly>
      <active>true</active>
      <codePool>local</codePool>
    </Company_InStockOnly>
  </modules>
</config>

享受;)

【讨论】:

    【解决方案3】:

    您可以在产品列表输出中使用 if($_product->isSaleable()):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2013-06-02
      • 2015-05-10
      • 2011-12-11
      相关资源
      最近更新 更多