2009-11-10 6 views
25

Je le code suivant pour récupérer une liste des produitsVérifier si un produit Magento est un enfant d'un produit configurable

$collection = Mage::getModel('catalog/product')->getCollection(); 

$collection->addAttributeToSelect('name') 
    ->addAttributeToFilter("category_ids", array('finset'=>$this->category_id)); 

foreach($collection as $product) { 
    echo $product->getName(); 
} 

Ma question est, comment puis-je pas l'écho des produits qui sont « simples », mais appartiennent à un produit 'configurable' parent. (par exemple, ne pas afficher "Red Shirt Medium" comme il appartient à "Red Shirt")

J'ai travaillé sur le fait que cette association vit dans 'catalog_product_super_link' mais je viens juste de commencer avec Magento et malheureusement pas savoir comment faire le filtrage :)

Vive les gars,

Chris.

Répondre

28

Je ne connais pas un moyen direct d'ajouter cette condition à la collection, je serais également intéressé par une telle solution. Mais vous pouvez toujours vérifier dans la boucle pour chaque produit:

if (empty(Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($product->getId()))) 
{ 
    echo $product->getName(); 
} 
+1

Solution parfaite pour trouver les identifiants parent d'un simple. Merci beaucoup –

+2

_ "Je ne connais pas un moyen direct d'ajouter cette condition à la collection" _ '$ collection-> getSelect()' et nous sommes en mesure d'utiliser [Zend_Db_Select] (http: //framework.zend .com/manual/1.12/fr/zend.db.select.html) pour créer une sélection personnalisée. Un '$ collection-> getTable ('catalogue/product_super_link');' peut être utile pour les jointures. –

5

Il y a une fonction appelée isConfigurable dans la classe de produits.

Cela peut vous être utile.

$product->isConfigurable(); 
// if its the parent object it'll be true, if its the child it'll be false. 
+6

Je pense que cela ne fonctionnera pas, si le produit est un produit simple, cela retournera toujours faux, mais le produit peut être/ne pas être un enfant. – JuLy

2

Le moyen le plus rapide pourrait être de vérifier si la visibilité du produit est réglé sur « Non visible individuellement », puisque les produits simples associés à des produits configurables sont généralement réglés à ce sujet. Malheureusement, je ne connais pas la syntaxe exacte, mais j'espère que quelqu'un d'autre qui est prêt à faire son entrée!

5

J'ai fait quelque chose de similaire pour notre flux google. Cet extrait de code est ce que je l'utilise pour vérifier l'héritage des produits:

$products = Mage::getModel('catalog/product')->getCollection(); 
$products->addAttributeToSelect('*'); 
$products->addAttributeToFilter('status', 1);//enabled 
$products->addAttributeToFilter('price', array('gt' => 0));//price not 0 
//$products->addAttributeToFilter('visibility', 4); //catalog, search - comment out to show all items (configurable products simple product breakdowns) 

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products); 

$prodIds=$products->getAllIds(); 
try { 
foreach($prodIds as $productId) { 
    $product = Mage::getModel('catalog/product'); 
    $product->load($productId); 

    // SIMPLE PRODUCTS 
    if($product->getTypeId() == 'simple') { 
     $prodName = trim($product->getName()); 

     $parentIds = Mage::getModel('catalog/product_type_grouped')->getParentIdsByChild($productId); 
     if(!$parentIds) 
      $parentIds = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($productId); 

     if($parentIds) {  
      $parentProd = Mage::getModel('catalog/product')->load($parentIds[0]);   
      /* 
      * do something if this product has a parent or do some checks against $parentProd 
      */ 
     } // end parent check 
    }//if SIMPLE 
} // foreach 

} catch(Exception $e) { 
    die($e->getMessage()); 
} 
1

Depuis des produits simples qui font partie des produits configurables ont généralement une valeur de visibilité de Not Visible Individually, il suffit sans doute d'ajouter un filtre de visibilité à la collecte qui vérifie la visibilité des produits dans le catalogue:

$collection->setVisibility(Mage::getModel('catalog/product_visibility')->getVisibleInCatalogIds()); 

dans le cas peu probable que les produits qui en résultent font partie d'un produit configurable, vous pouvez utiliser la méthode Mage_Catalog_Model_Product_Type_Configurable::getParentIdsByChild pour vérifier si un produit est utilisé dans le cadre d'un produit configurable.