Проверка, является ли продукт Magento дочерним по отношению к конфигурируемому продукту - PullRequest
26 голосов
/ 10 ноября 2009

У меня есть следующий код, чтобы получить список продуктов

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

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

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

Мой вопрос: как я НЕ могу повторить продукты, которые являются «простыми», но принадлежат родительскому «конфигурируемому» продукту. (например, не отображать «Red Shirt Medium», поскольку оно относится к «Red Shirt Medium»)

Я выяснил, что эта ассоциация живет в 'catalog_product_super_link', но я только начал с Magento и, к сожалению, не знаю, как выполнить фильтрацию:)

Ура, ребята,

Крис.

Ответы [ 5 ]

31 голосов
/ 10 ноября 2009

Я не знаю прямого способа добавить это условие в коллекцию, я бы тоже заинтересовался таким решением. Но вы всегда можете проверить внутри цикла для каждого продукта:

if (empty(Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($product->getId())))
{
    echo $product->getName();
}
6 голосов
/ 07 мая 2012

Я сделал нечто похожее для нашего канала Google. Этот фрагмент кода используется для проверки наследования продуктов:

$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());
}
5 голосов
/ 15 августа 2010

В классе продукта есть функция с именем isConfigurable.

Это может помочь вам.

$product->isConfigurable(); 
// if its the parent object it'll be true, if its the child it'll be false. 
2 голосов
/ 22 марта 2012

Самый быстрый способ может заключаться в том, чтобы проверить, установлен ли видимость продукта на «Не виден индивидуально», поскольку обычные продукты, связанные с настраиваемыми продуктами, обычно устанавливаются на это. К сожалению, я не знаю точного синтаксиса, но, надеюсь, кто-то другой, кто готов принять участие, знает!

1 голос
/ 19 мая 2015

Поскольку простые продукты, являющиеся частью настраиваемых продуктов, обычно имеют значение видимости Not Visible Individually, вероятно, достаточно добавить в коллекцию фильтр видимости, который проверяет видимость продуктов в каталоге:

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

В маловероятном случае, когда полученные продукты являются частью настраиваемого продукта, вы можете использовать метод Mage_Catalog_Model_Product_Type_Configurable::getParentIdsByChild, чтобы проверить, используется ли продукт как часть настраиваемого продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...