Carregar coleção de produtos simples (em estoque e fora de estoque)


9

Ocorreu um problema ao carregar TODOS os produtos "filhos" de um Produto Configurável em uma coleção, mesmo aqueles que estão fora de estoque.

Como carregar produtos como este:

$simpleCollection = $configurable->getUsedProductCollection()
    ->addAttributeToSelect('*')
    ->addFilterByRequiredOptions();

foreach ($simpleCollection as $simple) {
   //$simple->getName();
}

ignorará os produtos filhos que estão fora de estoque, provavelmente porque não estão listados nas tabelas de preços que ingressaram.

Existe outra opção sem carregar todos os IDs filhos de getChildrenIds e carregar cada produto simples com load ?

Respostas:


2

As mentiras problema na chamada para addStoreFilter()em getUsedProductCollection():

public function getUsedProductCollection($product = null)
{
    $collection = Mage::getResourceModel('catalog/product_type_configurable_product_collection')
        ->setFlag('require_stock_items', true)
        ->setFlag('product_children', true)
        ->setProductFilter($this->getProduct($product));
    if (!is_null($this->getStoreFilter($product))) {
        $collection->addStoreFilter($this->getStoreFilter($product));
    }

    return $collection;
}

Isso adiciona filtros para mostrar apenas produtos vendáveis ​​na loja atual.

Se $configurablefor a instância de tipo do seu produto configurável, você pode desmarcar o filtro da loja assim antes de chamar getUsedProductCollection():

$configurable->setStoreFilter(null);

Solução completa:

$configurable = $product->getTypeInstance();

$configurable->setStoreFilter(null);
$simpleCollection = $configurable->getUsedProductCollection()
    ->addAttributeToSelect('*')
    ->addFilterByRequiredOptions();

foreach ($simpleCollection as $simple) {
   //$simple->getName();
}

1

O que acontece se você tentar desta maneira:

$simpleCollection = $configurable->getUsedProductCollection()
                     ->addAttributeToSelect('*')
                     //->addFilterByRequiredOptions() //don't use any filter, get all itmes
                     ;


foreach($simpleCollection as $simple){
   //$simple->getName();
}

De uma chance.


1

Você pode usar o código abaixo como solução alternativa para esta pergunta:

$simpleCollection=$configurable->getTypeInstance(true)
                ->getUsedProducts(null,$configurable);

foreach($simpleCollection as $simple){
   //$simple->getName();
}

1

Se você precisar da coleção de produtos associados a um configurável, o seguinte deverá funcionar:

$configurableProduct = Mage::getModel('catalog/product')->load(<your_product_id>);
$associatedProducts = $configurableProduct->getTypeInstance()->getUsedProductCollection($configurableProduct);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.