【问题标题】:Magento - load only configurable productsMagento - 仅加载可配置产品
【发布时间】:2011-03-12 03:42:56
【问题描述】:

我有以下代码:

$_productCollection = $this->getLoadedProductCollection();

foreach ($_productCollection as $_product)
{
  if ($_product->_data['type_id'] == 'configurable')
  {
    ...
  } 
}

虽然它做了它应该做的事情,但它大大减慢了页面加载时间。是否可以仅加载可配置产品并删除“可配置”检查?商店有 12000 种产品,其中大约 700 种是可配置的,其余的是儿童简单产品。

我发现以下代码返回所有可配置产品。我只需要当前类别中的产品:

$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')
                ->addAttributeToFilter('type_id', array('eq' => 'configurable'));

【问题讨论】:

  • 你能缓存从这段代码获得的输出或集合吗?
  • 我不确定你的意思,但我做了fwrite($f, print_r($_productCollection, true)),文件大小为 54MB。 $_productCollection->count() 返回 5420。显然我不能在这里发布。

标签: php magento


【解决方案1】:

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) 也有问题,您不仅输出产品,还输出作为数据库连接的资源的所有详细信息、缓存值以及产品的各个资源,等等...

在这种情况下,我认为您会更高兴:

print_r($_productCollection->toArray())

【讨论】:

  • 有没有办法完全不从数据库加载简单的产品?
  • 您可以将它们的可见性设置为“单独不可见”,这会将它们从产品列表中排除。如果您专门针对这种情况,请使用过滤器addAttributeToFilter('type_id', array('neq' => 'simple'))neq 显然意味着“不等于”。
  • 对该方法+1。我喜欢克隆和清晰 - 非常简洁。
  • @clockworkgeek 今天发现 clone 不会在 Magento 中创建干净的副本,因为 PHP 的浅层克隆和 Varien 没有实现 __clone() - ref : stackoverflow.com/questions/4959949/clone-is-not-working-for-me/… -
  • 我尝试将技术与事件 catalog_product_collection_load_before 一起使用,它提供了正确的输出,但工具栏仍然显示 6 个项目,其中仅加载了 1 个项目。我的代码:$observer->getCollection() ->clear() ->addAttributeToSelect('*') ->addAttributeToFilter('entity_id', array('nin' => $excludeIds)) ->load();
【解决方案2】:

所有这些解决方案都不适合我,试试这个:

$_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');
    

    【讨论】:

    • 它不会改变任何东西。退回的产品数量还是一样的。
    • 你运行的是什么版本?
    • 请告诉我这里的$this 是什么?
    【解决方案4】:

    尝试关注

       $collection  =  Mage::getModel('catalog/product')->getCollection();
       $collection->addAttributeToFilter('type_id','configurable');
    
        foreach($collection as $product)
        {
    
        }
    

    为了加载可配置和简单的尝试

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

    【讨论】:

      【解决方案5】:

      这里是只获取可配置产品的代码:

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

      【讨论】:

        【解决方案6】:

        使用\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;
        }
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-30
            • 2015-02-01
            • 2015-04-02
            • 2011-06-25
            • 2012-07-20
            • 2016-06-13
            • 2012-12-28
            相关资源
            最近更新 更多