филтриране на събирането на продукти на 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 ('qty',array('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