Domanda

Nel mio sito ho diversi negozi a disposizione. Un negozio particolare, contiene sia il semplice e prodotti configurabili. Si tratta di una vasta collezione di prodotti. Qual è il modo più veloce per ottenere tutti abilitati raccolta prodotti (including child products of configurable products) di questo negozio dal negozio id?

Nota: Ho provato questo sacco di modi diversi. Ma ci vuole loo molto tempo. A volte causare il crash del server anche.

Nota: sto usando Magento CE 1.3

sarà apprezzato Eventuali suggerimenti.

È stato utile?

Soluzione

$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

Ora il problema. Di solito i prodotti semplici associati a quelli configurabili non sono associati ad una categoria o che sono impostate per non essere visibile. Se questo non è il caso per voi, allora il codice di cui sopra dovrebbe essere sufficiente. Se essi sono associati a una categoria, ma non sono visibili poi basta lasciare un commento, l'ultima riga.
In caso contrario, si deve ciclo attraverso i prodotti e quando si trova un uno configurabile ottenere prodotti è associata:

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

Ora si dovrebbe avere tutti i prodotti necessari in ordine $allProducts.
Questo non può essere veloce a causa di ottenere i semplici associati prodotti, ma dovrebbe ottenere quello che ti serve. Spero che non va in crash il server.

Altri suggerimenti

Per aggiungere il @Marius sua risposta, per limitare le risorse utilizzate è possibile utilizzare la classe resource_iterator.

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

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

Invece di eseguire la query e il recupero di tutti i risultati in una sola volta Magento sarà ora di gestire un risultato, al momento, per poi passare a quello successivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top