Produktkollektion nach Stammkategorie und allen Unterkategorien in Magento 2 abrufen?

7

Wie kann ich eine Produktsammlung nach einer Stammkategorie und aus allen ihren Unterkategorien abrufen?

Z.B:

Wurzelkategorie (2 Produkte)

  • Unterkategorie 1 (2 Produkte)
  • Unterkategorie 2 (3 Produkte)

Ich möchte also alle 7 Produkte in der Sammlung abrufen.

nuwaus
quelle

Antworten:

3

Sie können wie folgt verwenden:

/** \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);
}

* Hinweis: Ihre Kategorie muss Anker aktivieren

Anker für Kategorie aktivieren

* Hinweis: php bin/magento indexer:reindexNur zur Sicherheit ausführen

Rubelia
quelle
2

Code für Ihre Klassendatei:

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

Code für Ihre Vorlagendatei:

$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() . ' )';
    }
}

Quelle: Magento 2: Übergeordnete Kategorie, untergeordnete Kategorien und Produktanzahl abrufen

Mukesh Chapagain
quelle
1

Ich habe es wie folgt gelöst,

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;
}
nuwaus
quelle
0

Hallo, ich habe eine andere Möglichkeit, eine Produktkollektion aus der Stammkategorie zu erhalten. Probieren Sie es aus. Ich hoffe, diese Hilfe

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

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

Versuche dies

 $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);
}
Ravi Thanki
quelle
4
Dies ist Magento 1 Weg.
Khoa TruongDinh