Magento 2:製品コレクションに可視性フィルターとステータスフィルターを適用する


11

製品コレクションに可視性とステータスフィルターを適用したい。Magento 1と同様に、次のようにします。

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

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

Magento 2で製品コレクションを取得しましたが、上記のフィルターを適用する機能が見つかりません。

回答:


15

ステータスの有効化と可視性を備えた製品コレクションを取得するには:

以下のコードをブロックファイルに保持する必要があります。

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 lal

SearchCriteriaBuilder使用時にフィルターを追加するにはどうすればよいProductRepositoryInterfaceですか?(magento.stackexchange.com/a/84347/60128を参照してください
JānisElmeris 2017年

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

0

ステータスを有効にして可視化する製品コレクションの場合:

以下のコードで試すことができます

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.