Загрузить коллекцию Simple Products (как на складе, так и на складе)

9

У меня возникла проблема при загрузке ВСЕХ «дочерних» продуктов Настраиваемого продукта в коллекцию, даже тех, которых нет в наличии.

Как загрузка продуктов, как это:

$simpleCollection = $configurable->getUsedProductCollection()
    ->addAttributeToSelect('*')
    ->addFilterByRequiredOptions();

foreach ($simpleCollection as $simple) {
   //$simple->getName();
}

будет игнорировать дочерние продукты, которых нет в наличии, возможно, потому что они не перечислены в таблицах цен, которые объединены.

Есть ли другой вариант без загрузки всех дочерних идентификаторов с помощью getChildrenIds, а затем загрузить каждый простой продукт с загрузкой ?

patrickzzz
источник

Ответы:

2

Проблема заключается в призыве addStoreFilter()в getUsedProductCollection():

public function getUsedProductCollection($product = null)
{
    $collection = Mage::getResourceModel('catalog/product_type_configurable_product_collection')
        ->setFlag('require_stock_items', true)
        ->setFlag('product_children', true)
        ->setProductFilter($this->getProduct($product));
    if (!is_null($this->getStoreFilter($product))) {
        $collection->addStoreFilter($this->getStoreFilter($product));
    }

    return $collection;
}

Это добавляет фильтры для отображения только товаров, которые можно продавать в текущем магазине.

Если $configurableэто экземпляр типа вашего конфигурируемого продукта, вы можете отменить фильтр магазина следующим образом getUsedProductCollection():

$configurable->setStoreFilter(null);

Комплексное решение:

$configurable = $product->getTypeInstance();

$configurable->setStoreFilter(null);
$simpleCollection = $configurable->getUsedProductCollection()
    ->addAttributeToSelect('*')
    ->addFilterByRequiredOptions();

foreach ($simpleCollection as $simple) {
   //$simple->getName();
}
Фабиан Шменглер
источник
1

Что произойдет, если вы попробуете так:

$simpleCollection = $configurable->getUsedProductCollection()
                     ->addAttributeToSelect('*')
                     //->addFilterByRequiredOptions() //don't use any filter, get all itmes
                     ;


foreach($simpleCollection as $simple){
   //$simple->getName();
}

Попробуйте.

Адарш Хатри
источник
1

Вы можете использовать приведенный ниже код в качестве альтернативного решения этого вопроса:

$simpleCollection=$configurable->getTypeInstance(true)
                ->getUsedProducts(null,$configurable);

foreach($simpleCollection as $simple){
   //$simple->getName();
}
Амит Бера
источник
1

Если вам нужен набор продуктов, связанный с настраиваемым, должно работать следующее:

$configurableProduct = Mage::getModel('catalog/product')->load(<your_product_id>);
$associatedProducts = $configurableProduct->getTypeInstance()->getUsedProductCollection($configurableProduct);
Алессандро Рончи
источник