마 젠토 2 : 제품 컬렉션에 가시성 및 상태 필터 적용


11

제품 컬렉션에 가시성 및 상태 필터를 적용하고 싶습니다. 마 젠토 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 /…
Sushivam

@Rakesh Jesadiya "보이지 개별적으로"제품 제품 목록 페이지에 표시 할 어떤 방법이 있나요
랄 amith

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();

안녕, 내 질문이 이것과 비슷한 지 확인할 수 있고 searchCriteria를 사용해야합니까? 나는 그것을 시도했지만 모든 것을 망칩니다. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.