Magento 2: Застосовуйте фільтри видимості та статусу для колекції продуктів


11

Я хочу застосувати фільтр видимості та статусу до колекції продуктів. Як і в Magento 1, ми робимо:

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);

Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

Я отримую колекцію продуктів у Magento 2, але не знаходжу функцію застосувати вищевказані фільтри.

Відповіді:


16

Щоб отримати колекцію продуктів із включенням статусу та видимістю:

ви повинні зберегти код нижче в файлі блоку.

protected $productCollectionFactory;
protected $productVisibility;
protected $productStatus;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,        
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility,
    array $data = []
)
{
    $this->productCollectionFactory = $productCollectionFactory;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;
    parent::__construct($context, $data);
}

public function getProductCollection()
{
    $collection = $this->productCollectionFactory->create();
    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());
    return $collection;
}

Вищий код, що працює для типу видимості для:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH

Я реалізував аналогічно @Rakesh, мені потрібно отримати результати продуктів відповідно до застосованих фільтрів, але продукти не відображаються відповідно до фільтрів ... потрібна допомога тут ... magento.stackexchange.com/questions / 136959 /…
Сушівам

@Rakesh Jesadiya Чи є можливість відобразити товари "не видно окремо" Товари на сторінці списку товарів
amith lal

Як додати фільтри під SearchCriteriaBuilderчас використання ProductRepositoryInterface? (Див. Magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris

3

Це повинно працювати для вас:

    $collection = $this->collectionFactory->create();

    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());

Використовувані заняття:

/**
 * @var \Magento\Catalog\Model\Resource\Product\CollectionFactory
 */
protected $collectionFactory;

/**
 * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
 */
protected $productStatus;

/**
 * @var \Magento\Catalog\Model\Product\Visibility
 */
protected $productVisibility;

Перегляньте ці класи, щоб перевірити інші методи, щоб отримати можливі значення статусу чи видимості.

Однак перегляньте концепцію сховищ, наскільки я бачив, Magento 2 рекомендує використовувати сховище для доступу до даних про продукт замість використання колекції. Наприклад:

$searchCriteria = $this->searchCriteriaBuilder->create();

$products = $this->productRepository->getList($searchCriteria)->getItems();

Привіт, я можу перевірити, чи моє запитання подібне до цього, і я повинен використовувати критерії пошуку? Я теж спробував це, але це все порушує. magento.stackexchange.com/questions/117112/…
ntzz

1

для колекції продуктів із включенням статусу та видимістю:

ви можете спробувати з наведеним нижче кодом

protected $productCollectionFactory;
protected $productVisibility;
protected $productStatus;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,        
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility,
    array $data = []
)
{
    $this->productCollectionFactory = $productCollectionFactory;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;
    parent::__construct($context, $data);
}

public function getProductCollection()
{
    $collection = $this->productCollectionFactory->create();
    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());
    return $collection;
}

для цього коду, що працює для типу видимості, наприклад:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.