Magento - 仅加载可配置产品

15

我有以下代码:

$_productCollection = $this->getLoadedProductCollection();

foreach ($_productCollection as $_product)
{
  if ($_product->_data['type_id'] == 'configurable')
  {
    ...
  } 
}
虽然它完成了预期的功能,但它极大地降低了页面加载时间。是否有可能仅加载可配置产品并删除对“可配置”的检查?商店有12,000个产品,其中约有700个是可配置的,其余的是子简单产品。
我找到了下面的代码,它返回所有可配置产品。我只需要当前类别中的产品:
$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')
                ->addAttributeToFilter('type_id', array('eq' => 'configurable'));

你能否缓存从这段代码获取的输出或集合? - alex
我不确定你的意思,但我执行了 fwrite($f, print_r($_productCollection, true)),文件大小为54MB。$_productCollection->count() 返回5420。显然我不能在这里发布它。 - Vincent
7个回答

29

getLoadedProductCollection() 的问题在于它已经被加载了 - 商品的数据已经从数据库中检索出来。仅使用当前类别的产品集合也不够好,那样会忽略“层级”(属性过滤器)。诀窍是首先从列表中删除已加载的产品。

// First make a copy, otherwise the rest of the page might be affected!
$_productCollection = clone $this->getLoadedProductCollection();
// Unset the current products and filter before loading the next.
$_productCollection->clear()
                   ->addAttributeToFilter('type_id', 'configurable')
                   ->load();

print_r($_productCollection->getData())也存在问题,因为它不仅输出产品,还包括数据库连接和缓存值等所有资源的详细信息,以及产品的各个资源等等...

在这种情况下,我认为您会更喜欢:

print_r($_productCollection->toArray())

有没有一种方法可以完全不从数据库中加载简单产品? - Vincent
1
@clockworkgeek 今天发现,在Magento中,由于PHP的浅克隆和Varien没有实现__clone(),clone并不能创建一个干净的副本。参考:https://dev59.com/y1TTa4cB1Zd3GeqPqTUr#4960001 - Jonathan Day
我尝试使用事件 catalog_product_collection_load_before 的技术,它给出了正确的输出,但是工具栏仍然显示6个项目,而实际上只有1个被加载。我的代码:$observer->getCollection() ->clear() ->addAttributeToSelect('*') ->addAttributeToFilter('entity_id', array('nin' => $excludeIds)) ->load(); - R T
我应该写一个新问题吗?非常感谢您的帮助和支持。谢谢。 - R T
@MadMax,你应该发起一个新的问题,因为这个问题已经几年了,并且没有解释工具栏/分页器的问题。 - clockworkgeek
显示剩余2条评论

7

所有这些解决方案都对我无效,请尝试以下方法:

$_productCollection1 = Mage::getResourceModel('catalog/product_collection')
            ->addAttributeToSelect('*')
            ->addAttributeToFilter('type_id','configurable'); 

foreach ($_productCollection1 as $product1) {
    echo $product1->getName();
    ...
}

它能够工作,但我不确定是否正确(我是 Magento 的新手)。请让我知道。


3
你现在的做法需要在解析和筛选产品之前加载所有产品。以下是更接近你想要的方式:
$_productCollection = $this ->getLoadedProductCollection()
                            ->addAttributeToFilter('type_id','configurable');

它不会改变任何东西。返回的产品数量仍然相同。 - Vincent
你正在运行哪个版本? - philwinkle
请告诉我在这个上下文中$this是什么? - Mr_Green

3
尝试以下操作:
   $collection  =  Mage::getModel('catalog/product')->getCollection();
   $collection->addAttributeToFilter('type_id','configurable');

    foreach($collection as $product)
    {

    }

如果您需要加载可配置的和简单的内容,请尝试使用

$collection->addAttributeToFilter('type_id', array('in' => array('configurable','simple')));

0

以下是获取可配置产品的代码:

 $Config_products  =  Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToFilter('type_id','configurable');

0

使用\Magento\Catalog\Model\ResourceModel\Product\Collection $_productcollection

public function getConfigProducts() {
     $configproducts = $this->_productcollection;
     $configproducts->addAttributeToSelect('*');
     $configproducts->addAttributeToFilter('status',\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
     $configproducts->addAttributeToFilter('show_in_price_page', array('eq' => 1));
     $configproducts->addAttributeToFilter('type_id', array('eq' => "configurable"));
     return $configproducts;
}

-1
如果您将简单产品的可见性更改为“不可单独显示”,Magento将不会加载它以在产品列表页面中显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接