Magento 2: Як відфільтрувати колекцію продуктів за ідентифікатором магазину


11

Використовуючи предмет фабрики продукту, я можу створити продукт, захопити колекцію продукту та отримати перший елемент цієї колекції

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

Однак якщо я спробую додати store_id до фільтру колекції

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

Я отримую таку помилку

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

Те саме відбувається, якщо я намагаюся використовувати сховище продуктів для фільтрації по store_id (сховища використовують колекції під кришкою).

Це помилка? Чи змінилися відносини між магазинами, веб-сайтами та продуктами в Magento 2 таким чином, що це вже не є законним запитом? Обидва? Ні? Щось ще?


Я дуже новачок у M2, але чи не можете ви використовувати цей github.com/magento/magento2/blob/develop/app/code/Magento/… ?
fmrng

@fnng Використовуйте метод, щоб знати, але я хочу сказати "будь ласка, перекажіть мені список усіх продуктів, що входять до магазину X". Не впевнений, як setStoreId зробив би це.
Алан Шторм

Відповіді:


5

Це можна зробити методом addStoreFilter(), дивMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

addStoreFilter()функція приймає ідентифікатор магазину або Storeоб'єкт в якості параметра.

EG, щоб отримати всі товари для поточного магазину:

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

Сподіваємось, це допомагає.


Дякую @amitbeta! Якщо у вас є момент - чи знаєте ви, чи можна створити фільтр магазину за допомогою сховищ продуктів? magento.stackexchange.com/questions/91278/…
Alan Storm

звичайно .. я буду дивитись
Аміт Бера

@AmitBera, будь ласка, можете пояснити, як використовувати addStoreFilter () для колекції продуктів.

5

Наразі це схоже на помилку, оскільки немає можливості застосувати магазинний фільтр із ProductRepository::getList()методом, передаючи ідентифікатор магазину як фільтр SearchCriteria .

У реалізації getList ви можете виявити, що всі фільтри з SearchCriteria застосовані до колекції

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

В Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionє спеціальна обробка категорії фільтра , але не один для магазину.

Отже, слід додати додаткову умову, Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionяка перевіряє, чи є у нас фільтр магазину, і якщо у нас є - встановити ідентифікатор магазину для збору, щось на зразок:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

Створено внутрішню помилку для цієї проблеми, її номер MAGETWO-45950


Будь-які новини з цього приводу? Я не можу знайти посилання на номер квитка в Github.
Фабіан Шменглер

1
У Magento 2 продукти призначаються веб-сайтам, а не магазинам. Отже, початкова поведінка, описана Аланом, є правильною, оскільки суб'єкт продукту не має посилання Store Id, а лише посилання на ідентифікатор веб-сайту. І внутрішній квиток - це про введення атрибута Extension з ProductWebsiteLinkInterface в ProductInterface
Ігор Міняйло

Крім асоціації магазину / веб-сайту, також не setStore()вказано, які саме значення атрибутів зберігаються для зберігання? Або це робиться по-іншому?
Фабіан Шменглер

Існують методи setStoreId / getStoreId у впровадженні моделі продукту, але таких немає в ProductInterface, тому не рекомендується покладатися на них у вашій бізнес-логіці.
Ігор Міняйло

Наразі вирішення значень рівня StoreView (наприклад, локалізація атрибутів), зроблене частиною StoreID URL в API REST
Ігор Міняйло

0

Якщо ви користуєтеся власною моделлю з декількох таблиць, додайте назви_типу table_name: addFieldToFilter('**table_name.**column_name', 1)


Не могли б ви поділитися всім фрагментом для завантаження колекції продуктів з моєї колонки, скажіть, ідентифікатор особи, як ви сказали вище
Sushivam

0

1) Клас \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) Тоді метод є $collection->setStoreId(0);


PS замість 0 ви можете поставити ідентифікатор магазину 1, 2, ...
Гедріус Тумеліс

Мета: Чомусь із мого повідомлення тут було видалено символ зірки.
Гедрій Тумеліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.