Come ottenere collezione di prodotti di data categoria id principale?
-
16-10-2019 - |
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.
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.