Pregunta

En mi sitio web tengo varias tiendas disponibles. Una tienda en particular contiene los productos simples y configurables. Esta es una gran colección de productos. ¿Cuál es la forma más rápida de obtener todos los productos habilitados? (including child products of configurable products) ¿Colección de esta tienda por identificación de la tienda?

Nota: Probé estas muchas maneras diferentes. Pero lleva mucho tiempo. A veces causa incluso bloquear el servidor.

Nota: Estoy usando Magento CE 1.3

Cualquier sugerencia será apreciada.

¿Fue útil?

Solución

$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

Ahora el problema. Por lo general, los productos simples asociados a los configurables no están asociados a una categoría o están establecidos para no ser visibles. Si este no es el caso para usted, el código anterior debería ser suficiente. Si están asociados a una categoría pero no son visibles, solo comente la última línea.
De lo contrario, debe recorrer los productos y cuando encuentre uno configurable, obtenga sus productos asociados:

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

Ahora debería tener todos los productos que necesita en $allProducts formación.
Esto puede no ser rápido debido a obtener los productos asociados simples, pero debería obtener lo que necesita. Espero que no bloquee el servidor.

Otros consejos

Para agregar @Marius su respuesta, para limitar los recursos usados, puede usar la clase Resource_iterator.

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

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

En lugar de ejecutar la consulta y recuperar todos los resultados a la vez, Magento ahora manejará un resultado en ese momento, luego pasar a la siguiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top