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 ?

patrickzzz
fonte

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();
}
Fabian Schmengler
fonte
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.

Adarsh ​​Khatri
fonte
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();
}
Amit Bera
fonte
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);
Alessandro Ronchi
fonte