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. )
Янис Элмерис
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
Анас Мансури
источник