Charger la collection de produits simples (en stock et en rupture de stock)

9

J'ai rencontré un problème lors du chargement de TOUS les produits "enfants" d'un produit configurable dans une collection, même ceux qui sont en rupture de stock.

Comme charger les produits comme ceci:

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

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

ignorera les produits enfants qui sont en rupture de stock, probablement parce qu'ils ne sont pas répertoriés dans les tableaux de prix, qui sont joints.

Existe-t-il une autre option sans charger tous les identifiants enfants par getChildrenIds , puis charger chaque produit simple avec load ?

patrickzzz
la source

Réponses:

2

Les mensonges de problème dans l'appel à addStoreFilter()en 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;
}

Cela ajoute des filtres pour afficher uniquement les produits vendables dans le magasin actuel.

S'il $configurables'agit de l'instance de type de votre produit configurable, vous pouvez désactiver le filtre de magasin comme ceci avant d'appeler getUsedProductCollection():

$configurable->setStoreFilter(null);

Solution complète:

$configurable = $product->getTypeInstance();

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

foreach ($simpleCollection as $simple) {
   //$simple->getName();
}
Fabian Schmengler
la source
1

Que se passe-t-il si vous essayez de cette façon:

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


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

Essaie.

Adarsh ​​Khatri
la source
1

Vous pouvez utiliser le code ci-dessous comme solution alternative à cette question:

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

foreach($simpleCollection as $simple){
   //$simple->getName();
}
Amit Bera
la source
1

Si vous avez besoin de la collection de produits associée à un configurable, les éléments suivants devraient fonctionner:

$configurableProduct = Mage::getModel('catalog/product')->load(<your_product_id>);
$associatedProducts = $configurableProduct->getTypeInstance()->getUsedProductCollection($configurableProduct);
Alessandro Ronchi
la source