2011-12-20 11 views
11

Estoy revisando los resultados de los productos, y si el producto es un producto agrupado, quiero obtener todos los productos de ese grupo. Estoy haciendo esto:Magento: ¿cómo obtengo productos asociados del Grupo de productos?

$products = Mage::getModel('catalog/product') 
        ->getCollection() 
        ->addAttributeToSelect('*'); 
foreach ($products as $product) { 
    if ($product->getTypeId() == 'grouped'){ 
     // how do I now get associated products of $product? 
    } 
} 

Respuesta

29

En:

/magento/app/design/frontend/base/default/template/catalog/product/view/type/grouped.phtml 

Verás que utilizan este:

<?php 
    $_associatedProducts = $this->getAssociatedProducts(); 

Desde ese archivo phtml es de tipo Mage_Catalog_Block_Product_View_Type_Grouped, podemos ir a:

/magento/app/code/core/Mage/Catalog/Block/Product/View/Type/Grouped.php 

y ver que Mage_Catalog_Block_Product_View_Type_Grouped::getAssociatedProducts() hace esto:

<?php 
    $this->getProduct()->getTypeInstance(true)->getAssociatedProducts($this->getProduct()); 

por lo que podemos asumir con seguridad que $this->getProduct() devuelve un objeto de producto, y sustituirla por la variable de $product así:

<?php 
    if ($product->getTypeId() == 'grouped'){ 
     // how do I now get associated products of $product? 
     $associatedProducts = $product->getTypeInstance(true)->getAssociatedProducts($product); 
    } 

Si tuviera que optimizar el código completo, me 'd escribir así:

<?php 
    $products = Mage::getModel('catalog/product') 
     ->getCollection() 
     ->addAttributeToFilter('type_id', array('eq' => 'grouped')); 
    foreach ($products as $product) { 
     $associatedProducts = $product->getTypeInstance(true)->getAssociatedProducts($product); 
     // Do something with $associatedProducts 
    } 
+0

Gracias Me podrían hacer que esto funcione ... Quiero iterar sobre todos los productos, y si se agrupa iterar sobre sus productos asociados, todavía quiero todos los productos individuales, no solo productos asociados de productos agrupados. Su código 'optimizado' no incluiría productos únicos regulares, ¿verdad? – Owen

+0

Correcto, solo obtendría una colección de productos agrupados. Lo que quiere usar es $ product-> isGrouped(). Entonces, con su colección de todos los productos, use: foreach ($ productos como $ producto) {if ($ producto-> isGrouped()) {/ * Obtener colección de productos asociados * /}} –

0

Para obtener la recolección de productos por tipo:

$product = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToFilter('type_id', array('eq' => 'grouped')) 
    ->load(); 

$parentProductId = array(); 

foreach($product as $simpleProducts) { 
    $simpleProducts->loadParentProductIds(); 
    array_push($parentProductId,$simpleProducts->getParentProductIds(); 
} 
+0

Error fatal: llamada al método no definido Mage_Catalog_Model_Resource_Eav_Mysql4_Product: : getParentProductIds() en /var/www/vhosts/mysite.com/httpdocs/app/code/core/Mage/Catalog/Model/Product.php en la línea 1355 – Owen

6

O si quieres sólo para obtener los identificadores de productos asociados, puede utilizar el siguiente método (que es mucho más rápido):

public function getAssociatedProductIds($groupedProductId) 
{ 
    $coreResource = Mage::getSingleton('core/resource'); 
    $conn = $coreResource->getConnection('core_read'); 
    $select = $conn->select() 
     ->from($coreResource->getTableName('catalog/product_relation'), array('child_id')) 
     ->where('parent_id = ?', $groupedProductId); 

    return $conn->fetchCol($select); 
} 
Cuestiones relacionadas