Question

Dans mon site, j'ai plusieurs magasins disponibles. Un magasin en particulier contient à la fois simple et des produits configurables. Ceci est une énorme collection de produits. Quel est le meilleur moyen d'obtenir tous les produits a permis la collecte de (including child products of configurable products) de ce magasin par ID magasin?

Note: J'ai essayé beaucoup de façons différentes. Mais il faut Loo beaucoup de temps. Parfois, faire planter le serveur même.

Note: J'utilise Magento CE 1.3

Toutes les suggestions seront appréciées.

Était-ce utile?

La solution

$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

Maintenant, le problème. Habituellement, les produits simples associés à ceux configurables ne sont pas associés à une catégorie ou ils ne le seront pas visibles. Si ce n'est pas le cas pour vous, alors le code ci-dessus devrait être suffisant. Si elles sont associées à une catégorie, mais ils ne sont pas visibles alors juste commenter la dernière ligne.
Sinon, vous devez boucle à travers les produits et quand vous trouvez un configurable obtenez est les produits associés:

//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;
        }
    }
}

Maintenant, vous devriez avoir tous les produits dont vous avez besoin dans le tableau de $allProducts.
Cela peut ne pas être rapide en raison de l'obtention des produits simples associés, mais vous devriez obtenir ce dont vous avez besoin. J'espère qu'il ne tombe pas en panne le serveur.

Autres conseils

Pour ajouter @Marius sa réponse, afin de limiter les ressources utilisées, vous pouvez utiliser la classe resource_iterator.

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

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

Au lieu d'exécuter la requête et la récupération des tous les résultats à la fois Magento va maintenant gérer un résultat au moment, se déplaçant ensuite à l'étape suivante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top