Nhận bộ sưu tập sản phẩm theo danh mục gốc và tất cả các danh mục phụ của nó trong Magento 2?


7

Làm cách nào tôi có thể truy xuất bộ sưu tập sản phẩm theo danh mục gốc và từ tất cả các danh mục phụ của nó?

Ví dụ:

Danh mục gốc (2 sản phẩm)

  • Tiểu mục 1 (2 sản phẩm)
  • Tiểu thể loại 2 (3 sản phẩm)

Vì vậy, tôi muốn lấy tất cả 7 sản phẩm trong bộ sưu tập.

Câu trả lời:


3

Bạn có thể sử dụng như thế này:

/** \Magento\Catalog\Api\CategoryRepositoryInterface */
protected $categoryRepository;

/** \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */
protected $productCollectionFactory;

public function getAllProductOfSubcategories($categoryId, $storeId = null) {

    /** @var $result \Magento\Catalog\Model\ResourceModel\Product\Collection */
    $result = $this->productCollectionFactory->create();

    //get category at $storeId 
    try {
        $category = $this->categoryRepository->get($categoryId, $storeId);
    } catch (\Magento\Framework\Exception\NoSuchEntityException $noSuchEntityException) {
        return null;
    }

    return $result->addCategoryFilter($category);
}

* Lưu ý: Danh mục của bạn phải Kích hoạt Neo

Kích hoạt Anchor cho Danh mục

* Lưu ý: chạy php bin/magento indexer:reindexchỉ để đảm bảo


2

Mã cho tập tin lớp của bạn:

protected $_categoryHelper;
protected $_categoryRepository;

public function __construct(
    \Magento\Catalog\Helper\Category $categoryHelper,
    \Magento\Catalog\Model\CategoryRepository $categoryRepository,
    array $data = []
)
{
    $this->_categoryHelper = $categoryHelper;
    $this->_categoryCategoryRepository = $categoryRepository;        
    parent::__construct($context, $data);
}

public function getStoreCategories() 
{
    return $this->_categoryHelper->getStoreCategories();
}

public function getCategory($categoryId)
{
    return $this->_categoryRepository->get($categoryId);
}

Mã cho tệp mẫu của bạn:

$categories = $block->getStoreCategories();
foreach ($categories as $category) {
    echo $category->getName();
    echo ' ( ' . $category->getProductCount() . ' )';

    $subCategories = $block->getCategory($category->getId());
    foreach ($subCategories as $subCategory) {
        echo $subCategory->getName();
        echo ' ( ' . $subCategory->getProductCount() . ' )';
    }
}

Nguồn: Magento 2: Nhận danh mục phụ huynh, danh mục trẻ em & số lượng sản phẩm


1

Tôi đã giải quyết nó như dưới đây,

protected $_category;
protected $_productCollection;

/** You should provide your root category here, and it will return comma seperated sub category list */
public function getChildren($categoryId = false)
{
    if ($this->_category) {
        return $this->_category->getChildren();
    } else {
        return $this->getCategory($categoryId)->getChildren();
    }        
}    

protected function _getProductCollection()
{
    $childListStr   = $this->getChildren( 2 ); // Provide the root category ID
    $childList      = explode( ",", $childListStr );
    $catToLoad      = array();

    foreach( $childList as $item ){
        array_push( $catToLoad, $item );
    }

    if ($this->_productCollection === null) {
        $layer = $this->getLayer();
        $this->_productCollection = $layer->getProductCollection();            
    }

    $this->_productCollection->addCategoriesFilter(['in' => $catToLoad ]);  
    return $this->_productCollection;
}

0

Xin chào Tôi có một cách khác để lấy bộ sưu tập sản phẩm từ danh mục gốc ... hãy kiểm tra xem .. Tôi hy vọng sự giúp đỡ này

public function __construct(
    \Magento\Catalog\Model\Layer\Category $categoryLayer    
){
      $this->_categoryLayer = $categoryLayer;
}

public function getProductCollection($category){
     return $this->_categoryLayer->setCurrentCategory($category)->getProductCollection();
}

-5

Thử cái này

 $category = Mage::getModel('catalog/category')->load(2);
 $children = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
 $children->addAttributeToSelect('*')
          ->addAttributeToFilter('parent_id', $category->getId())
          ->addAttributeToFilter('is_active', 1)
          ->addAttributeToSort('position');
foreach($children as $child)
{

   $category=Mage::getModel('catalog/category')->load($child->entity_id);
}

4
Đây là Magento 1 cách.
Khoa TruongDinh
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.