фильтрация коллекции товаров на is_salable

Я хотел бы отфильтровать коллекцию продуктов, чтобы отображать только те товары, которые есть в наличии. Я подумал, что это будет легко, учитывая наличие атрибута is_salable, который равен 1 (истина), если товар есть в наличии, и 0 (ложь), если нет. Но что бы я ни делал, это не работает. Кроме того, кажется, что выполнение запроса останавливается до его завершения.

Вот пример кода:

$this->_productCollection = Mage::getModel('catalog/product')->getCollection();
$this->_productCollection->addAttributeToSelect('*');
$this->_productCollection->addAttributeToFilter('my_attribute', true);
//So far, so good...filtering on 'my_attribute' works!
Mage::Log("select: " . $this->_productCollection->getSelect());
//Successfully outputs the SQL query
$this->_productCollection->addFieldToFilter('is_salable', '1');
Mage::Log("select: " . $this->_productCollection->getSelect());
//does NOT output any query...it's like it died trying

Так что я делаю неправильно? Я пробовал «addFieldToFilter», «addAttributeToFilter» и разные другие запросы, такие как: addFieldToFilter('is_salable', array('eq' => true)) и т. д.

Кто-нибудь знает, как это сделать? Если «is_salable» не является ответом, все, что мне нужно сделать, это отфильтровать продукты, которых нет на складе... так что все, что работает, будет хорошо :)

Спасибо!


person BrianVPS    schedule 14.03.2011    source источник
comment
Быстрый совет: иногда выбранный объект не может быть правильно сброшен, по крайней мере, без нехватки памяти. Приведение его к строке более надежно... (string)$this->getProductCollection()->getSelect()   -  person clockworkgeek    schedule 14.03.2011
comment
Метод __toString() будет автоматически вызываться при объединении со строкой (начиная с PHP 5.2, см. документы)   -  person apfelbox    schedule 13.03.2014
comment
@jongosi на самом деле имя функции isSalable, как определено в Mage_Catalog_Model_Product, поэтому ваш комментарий неверен.   -  person Zain Baloch    schedule 28.04.2017


Ответы (3)


В продукте нет атрибута is_salable, поэтому он вызовет исключение. Если вы хотите отображать только те товары, которые есть в наличии, используйте этот метод модели запасов addInStockFilterToCollection:

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($this->_productCollection);
person Ivan Chepurnyi    schedule 14.03.2011
comment
Спасибо, @ivan-chepurnyi! Это сработало отлично! Тем не менее, я все еще немного смущен. Если я перебираю продукты в коллекции и распечатываю каждый, продукт содержит «атрибут» с именем «is_salable». Это сгенерированный элемент, который нельзя отфильтровать? Поэтому он отличается от других фильтруемых атрибутов? - person BrianVPS; 14.03.2011
comment
Оформить заказ с помощью функции isSalable() в Mage_Catalog_Model_Product. Часто обычные старые атрибуты не имеют определенного метода. В этом случае похоже, что он вызывает функцию isSalable() еще одного класса, Mage_Catalog_Model_Product_Type_Simple (или Mage_Catalog_Model_Product_Type_Grouped или Mage_Catalog_Model_Product_Type_Configurable в зависимости от типа продукта) - person shaune; 14.03.2011
comment
Свойство @BrianVPS is_salable в списке продуктов является индексированным значением возможного вызова метода isSalable. Результат вызова метода isSalable может быть разным в зависимости от типа продукта и логики, заданной в наблюдателях модуля Mage_CatalogInventory. Также он может отличаться от фактического вызова метода, если при разработке пользовательского модуля не были настроены соответствующие индексы. - person Ivan Chepurnyi; 14.03.2011
comment
Спасибо, Иван, я новичок в SO, поэтому не знаю протокола :) Я ценю всю вашу помощь! - person BrianVPS; 15.03.2011

попробуйте и это...

$stockCollection = Mage::getModel('cataloginventory/stock_item')->getCollection()->addFieldToFilter('qty', array('gteq' => 1))->addFieldToFilter('type_id', 'simple');

addFieldFilter('кол-во',массив('gteq' =>1))

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

addFieldToFilter('type_id', 'простой')

фильтровать по простым продуктам

person Oğuz Çelikdemir    schedule 15.03.2011
comment
Это решение не будет работать, если вы не управляете уровнем своих запасов в Magento и используете только флаги наличия/отсутствия на складе, поскольку вам не нужно указывать количество, чтобы продукт был виден во внешнем интерфейсе. - person Bery; 23.06.2015

Я столкнулся с проблемой, что isSaleable() всегда возвращает false для моих продуктов, проблема заключалась в том, что я получал коллекцию, но не добавлял цену атрибута в коллекцию. В функции isSaleable() есть проверка, чтобы убедиться, что цена не равна 0, ей нужен атрибут цены, чтобы проверить это:

Изменение:

$collection = Mage::getModel('catalog/product')->getCollection();
        $collection->addAttributeToSelect('name')
                ->addAttributeToSelect('image')
                ->addAttributeToSelect('url_path')
                ->addAttributeToSelect('status')
                ->addUrlRewrite();

To:

$collection = Mage::getModel('catalog/product')->getCollection();
        $collection->addAttributeToSelect('name')
                ->addAttributeToSelect('image')
                ->addAttributeToSelect('price')
                ->addAttributeToSelect('url_path')
                ->addAttributeToSelect('status')
                ->addUrlRewrite();

Сделал трюк :)

person Thomas Lang    schedule 26.05.2014
comment
Что делать с продуктами, которых нет в наличии? Их цена не равна нулю, но они не продаются. - person Marek Maurizio; 21.09.2015