Как получить коллекцию продукта данного идентификатора основной категории?

magento.stackexchange https://magento.stackexchange.com/questions/8789

Вопрос

На моем сайте у меня есть несколько магазинов. Один конкретный магазин содержит как простые, так и настраиваемые продукты. Это огромная коллекция продуктов. Какой самый быстрый способ получить все включенные продукты (including child products of configurable products) Коллекция этого магазина от идентификатора магазина?

Примечание: я попробовал это много разных способов. Но это занимает много времени. Иногда приводит к сбою сервера даже.

Примечание: я использую Magento CE 1.3

Любые предложения будут оценены.

Это было полезно?

Решение

$category = Mage::getModel('catalog/category')->load($categoryId);    
$collection = Mage::getModel('catalog/product')->getCollection()
        ->addCategoryFilter($category);
//you can use the next lines to add some minimal information about the products to the collection
//thanks @DavidManners
$collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes()) //add list attributes
            ->addMinimalPrice() //add prices
            ->addFinalPrice()
            ->addTaxPercents()
//or
//$collection->addAttributeToSelect('*');//if you want all the attributes
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);//only enabled products
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);//only visible products

Теперь проблема. Обычно простые продукты, связанные с настраиваемыми из них, не связаны с категорией или их установлены, чтобы не быть видными. Если это не так, то приведенного выше кода должно быть достаточно. Если они связаны с категорией, но они не видны, просто прокомментируйте последнюю строку.
В противном случае вам нужно пройти через продукты, и когда вы найдете настраиваемое, получите его связанные продукты:

//this is needed if you want to get the out of stock simple products also
Mage::helper('catalog/product')->setSkipSaleableCheck(true);
$allProducts = array();
foreach ($collection as $product){
    $allProducts[] = $product;
    if ($product->getTypeId() == 'configurable'){
        $simpleProducts = $product->getTypeInstance(true)
                ->getUsedProducts(null, $product);
        foreach ($simpleProducts as $simple){
            $allProducts[] = $simple;
        }
    }
}

Теперь у вас должны быть все продукты, которые вам нужны $allProducts множество.
Это может быть не быстро из -за получения простых ассоциированных продуктов, но должно получить вам то, что вам нужно. Я надеюсь, что это не сбоя сервера.

Другие советы

Чтобы добавить @marius его ответ, чтобы ограничить используемые ресурсы, вы можете использовать класс resource_iterator.

Mage::getSingleton('core/resource_iterator')->walk($collection->getSelect(), array('productCallback'), array());

function productCallback($args)
{
  var_dump($args['row']);
  [...]
}

Вместо того, чтобы выполнять запрос и получать все результаты одновременно, Magento теперь будет обрабатывать один результат в то время, а затем переходить к следующему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top