Frage

Auf meiner Website habe ich mehrere Geschäfte zur Verfügung. Ein bestimmtes Geschäft enthält sowohl die einfachen als auch die konfigurierbaren Produkte. Dies ist eine riesige Sammlung von Produkten. Was ist der schnellste Weg, um alle fähigen Produkte zu erhalten? (including child products of configurable products) Sammlung dieses Geschäfts nach Store -ID?

Hinweis: Ich habe so viel verschiedene Arten ausprobiert. Aber es braucht viel Zeit. Manchmal veranlassen Sie den Server sogar.

Hinweis: Ich benutze Magento CE 1.3

Alle Vorschläge werden geschätzt.

War es hilfreich?

Lösung

$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

Jetzt das Problem. Normalerweise sind die einfachen Produkte, die den konfigurierbaren zugeordnet sind, einer Kategorie nicht zugeordnet oder sie sind nicht sichtbar. Wenn dies für Sie nicht der Fall ist, sollte der obige Code ausreichen. Wenn sie einer Kategorie verknüpft sind, aber nicht sichtbar sind, kommentieren Sie einfach die letzte Zeile.
Andernfalls müssen Sie die Produkte durchlaufen und wenn Sie eine konfigurierbare Produkte finden, erhalten Sie die zugehörigen Produkte:

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

Jetzt sollten Sie alle Produkte haben, in denen Sie benötigen $allProducts Array.
Dies ist möglicherweise nicht schnell, da es die einfachen zugehörigen Produkte erhalten, aber Sie sollten das erhalten, was Sie brauchen. Ich hoffe, es stürzt den Server nicht ab.

Andere Tipps

Um @Marius seine Antwort hinzuzufügen, können Sie die Ressourcenklasse verwenden, um die verwendeten Ressourcen zu begrenzen.

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

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

Anstatt die Abfrage auszuführen und alle Ergebnisse auf einmal abzurufen, wird Magento jetzt ein Ergebnis zu diesem Zeitpunkt abwickeln und dann zum nächsten übergehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top