Magento 2: Áp dụng bộ lọc trạng thái và khả năng hiển thị trên bộ sưu tập sản phẩm


11

Tôi muốn áp dụng khả năng hiển thị và bộ lọc trạng thái trên bộ sưu tập sản phẩm. Giống như trong Magento 1 chúng tôi làm:

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

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

Tôi nhận được bộ sưu tập sản phẩm trong Magento 2 nhưng không tìm thấy chức năng để áp dụng các bộ lọc ở trên.

Câu trả lời:


15

Để nhận bộ sưu tập sản phẩm với trạng thái cho phép và khả năng hiển thị:

bạn phải giữ mã bên dưới trong tập tin khối.

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;
}

Mã trên làm việc cho loại khả năng hiển thị cho:

  • TẦM NHÌN
  • TẦM NHÌN
  • TẦM NHÌN

Tôi đã triển khai theo cách tương tự @Rakesh, tôi cần lấy kết quả của các sản phẩm theo các bộ lọc được áp dụng, nhưng các sản phẩm không được hiển thị theo các bộ lọc ... cần trợ giúp ở đây ... magento.stackexchange.com/questions / 136959 / Nhận
Sushivam

@Rakesh Jesadiya Có cách nào để hiển thị "không nhìn thấy được cách riêng rẽ" Sản phẩm trong trang danh sách sản phẩm
amith lal

Làm cách nào để thêm bộ lọc SearchCriteriaBuilderkhi sử dụng ProductRepositoryInterface? (Xem magento.stackexchange.com/a/84347/60128. )
Jāni Elmeris

3

Điều này sẽ làm việc cho bạn:

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

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

Các lớp được sử dụng là:

/**
 * @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;

Xem lại các lớp này để kiểm tra các phương thức khác để có được các giá trị trạng thái hoặc khả năng hiển thị.

Tuy nhiên, xem lại khái niệm về kho lưu trữ, theo như tôi thấy Magento 2 khuyên bạn nên sử dụng kho lưu trữ để truy cập dữ liệu sản phẩm thay vì sử dụng bộ sưu tập. Ví dụ:

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

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

Xin chào, có thể kiểm tra xem câu hỏi của tôi có giống với câu hỏi này không và tôi có phải sử dụng searchCriteria không? Tôi đã thử nó nhưng nó phá vỡ tất cả. magento.stackexchange.com/questions/117112/ Google
ntzz

0

cho bộ sưu tập sản phẩm có bật trạng thái và khả năng hiển thị:

bạn có thể thử với mã dưới đây

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;
}

cho mã này làm việc cho loại khả năng hiển thị như:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.