2013-05-02 4 views
3

Я пытаюсь создать коллекцию продуктов для всех настраиваемых продуктов, которые являются «в запасе» или «пригодны для продажи». Они требуют использования двух разных моделей. Мой рабочий метод:Magento: создайте коллекцию пользовательских продуктов для всех настраиваемых продуктов на складе

$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable')); 

foreach ($collectionConfigurable as $_configurableproduct) { 
    $product = Mage::getModel('catalog/product')->load($_configurableproduct->getId()); 

    if ($product->isSaleable()) { 
// do something 
} 
} 

Однако этот сценарий очень медленно, и я есть ощущение, что это тратить ресурсы работает, как это будет загрузка и проходит через КАЖДОЙ конфигурируемый продукт.

То, что я пытаюсь достичь, состоит в том, чтобы получить $ collectionConfigurable и сделать его только на складе.

Другой ресурс ссылается на это как способ получить в запасах предметы.

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($this->_productCollection); 

Но я не уверен, как объединить их или использовать его должным образом, я попытался это:

$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable')); 
$instockConfigs = Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collectionconfigurable); 

Возвращается со следующей ошибкой:

Fatal error: Call to a member function joinField() on a non-object in /srv/magento/app/code/core/Mage/CatalogInventory/Model/Resource/Stock.php on line 197 

ответ

2

Мои «Наивный для более тонких деталей системы запаса» будет соответствовать

  1. Создайте коллекцию предметов, захватив только предметы на складе.

  2. Используйте эту коллекцию, чтобы создать массив идентификаторов продуктов Instock

  3. Создать коллекцию изделий с настраиваемым фильтром, а также в качестве ENTITY_ID фильтра, используя собранные идентификаторы продуктов

Код потому что это будет выглядеть так.

//create a stock item collection with a `is_in_stock` filter 
$collection = Mage::getModel('cataloginventory/stock') 
->getItemCollection() 
->addFieldToFilter('is_in_stock'); 

//capture the product ids of the in stock stock items 
$product_ids = array(); 
foreach($collection as $item) 
{ 
    $product_ids[] = $item->getProductId(); 
} 

$products = Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToSelect('*') 
->addFieldToFilter('entity_id',array('in'=>$product_ids)) 
->addFieldToFilter('type_id','configurable'); 

foreach($products as $product) 
{ 
    var_dump($product->getData()); 
} 

Это говорит, что ваш код медленно, отчасти потому, что вы перегрузки каждого продукта внутри цикла, создавая новую серию операторов SQL

$product = Mage::getModel('catalog/product')->load($_configurableproduct->getId()); 

Кроме того, addInStockFilterToCollection работает только с a Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection коллекция. Взгляните на блок doc на метод.

/** 
* Adds filtering for collection to return only in stock products 
* 
* @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection $collection 
* @return Mage_CatalogInventory_Model_Stock $this 
*/ 
public function addInStockFilterToCollection($collection) 
{ 
    $this->getResource()->setInStockFilterToCollection($collection); 
    return $this; 
} 
+0

Позор они не набирали намек, что ([хотя они могут иметь в более новых версиях] (http://docs.magentocommerce.com/Mage_CatalogInventory/Mage_CatalogInventory_Model_Stock.html#addInStockFilterToCollection)) –

+0

@SteveRobbins Традиционная мудрость это то, что подсказки типов приводятся с накладными расходами на производительность, особенно в старой версии PHP (5.2) цели Magento. Легко понять, почему команда, предлагающая приложение, предназначенное для широкого развертывания, будет бросать подсказки типа в пользу намека на docblock. –

Смежные вопросы