Câu trả lời:
Kiểm tra ví dụ dưới đây để lấy danh sách tất cả các danh mục con của danh mục chính cụ thể bằng ID danh mục chính bằng cách sử dụng objectManager.
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$catId = 2; //Parent Category ID
$subCategory = $objectManager->create('Magento\Catalog\Model\Category')->load($catId);
$subCats = $subCategory->getChildrenCategories();
$_helper = $this->helper('Magento\Catalog\Helper\Output');
?>
<ul class="sub-cat-ul">
<?php
foreach ($subCats as $subcat) {
$_category = $objectManager->create('Magento\Catalog\Model\Category')->load($subcat->getId());
$subcaturl = $subcat->getUrl();
$_imgHtml = '';
if ($_imgUrl = $_category->getImageUrl()) {
$_imgHtml = '<img src="' . $_imgUrl . '" />';
$_imgHtml = $_helper->categoryAttribute($_category, $_imgHtml, 'image');
} ?>
<li class="cat-li">
<div class="cat-image">
<a href="<?php echo $subcaturl ?>"><?php echo $_imgHtml;?></a>
</div>
<div class="info">
<h4><?php echo $subcat->getName(); ?></h4>
<a class="link" href="<?php echo $subcaturl ?>"><?php /* @escapeNotVerified */ echo __('View more') ?></a>
</div>
</li>
<?php } ?>
</ul>
=====
Kiểm tra ví dụ dưới đây để liệt kê tất cả các danh mục con của danh mục cha mẹ cụ thể bằng ID danh mục mẹ bằng cách sử dụng kho lưu trữ.
Trước hết, thêm CategoryRep repository trong cấu trúc:
<?php
protected $categoryRepository;
public function __construct(
\Magento\Catalog\Model\CategoryRepository $categoryRepository
) {
$this->categoryRepository = $categoryRepository;
}
?>
Bây giờ bạn có thể sử dụng cách sau:
<?php
$categoryId = [YOUR_CATEGORY_ID];
$category = $this->categoryRepository->get($categoryId);
$subCategories = $category->getChildrenCategories();
foreach($subCategories as $subCategory) {
echo $subCategory->getName();
/* For Sub Categories */
if($subcategorie->hasChildren()) {
$childCategoryObj = $this->categoryRepository->get($subCategory->getId());
$childSubcategories = $childCategoryObj->getChildrenCategories();
foreach($childSubcategories as $childSubcategory) {
echo $childSubcategory->getName();
}
}
}
?>
Bạn cần thêm một phụ thuộc vào lớp học của bạn \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
.
Như thế này:
protected $categoryCollectionFactory;
public function __construct(
...
\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
...
) {
...
$this->categoryCollectionFactory = $categoryCollectionFactory;
...
}
public function getDescendants($category, $levels = 2)
{
if ((int)$levels < 1) {
$levels = 1;
}
$collection = $this->categoryCollectionFactory->create()
->addPathsFilter($category->getPath().'/')
->addLevelFilter($category->getLevel() + $levels);
return $collection;
}
bây giờ bạn chỉ cần gọi phương thức getDescendants
với $category
đối tượng là tham số và số cấp độ bạn cần cho các danh mục con (2 trong trường hợp của bạn).
$block->getDescendents($category, 2)
ở đâu $category
là danh mục chính. (Tôi không biết bạn lấy nó từ đâu).
Luôn cố gắng sử dụng kho lưu trữ. Đây là một ví dụ.
Tiêm CategoryRepository
bằng xây dựng
protected $categoryRepository;
public function __construct(
\Magento\Catalog\Model\CategoryRepository $categoryRepository
) {
$this->categoryRepository = $categoryRepository;
}
Bây giờ bạn có thể sử dụng cách sau:
$parent_category_id = 3;
$categoryObj = $this->categoryRepository->get($parent_category_id);
$subcategories = $categoryObj->getChildrenCategories();
foreach($subcategories as $subcategorie) {
echo ' --> '.$subcategorie->getName().'<br/>';
}
Đối với loại 2 cấp độ trẻ em:
$categoryObj = $this->categoryRepository->get($parent_category_id);
$subcategories = $categoryObj->getChildrenCategories();
foreach($subcategories as $subcategorie) {
echo ' --> '.$subcategorie->getName().'<br/>';
if($subcategorie->hasChildren()) {
$childCategoryObj = $this->categoryRepository->get($subcategorie->getId());
$childSubcategories = $childCategoryObj->getChildrenCategories();
foreach($childSubcategories as $childSubcategorie) {
echo ' --> '.$childSubcategorie->getName().'<br/>';
}
}
}
\Magento\Catalog\Api\CategoryRepositoryInterface
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category
$catId = $category->getId(); // Parent Category ID
$subcategory = $objectManager->create('Magento\Catalog\Model\Category')->load($catId);
$subcats = $subcategory->getChildrenCategories();
$categoryHelper = $this->getCategoryHelper();
<div class="category_bg mobile">
<ul id="main_cat_bg" class="main_cat_bg">
<?php
$cat_togg = 0;
foreach ($subcats as $subcat) {
if (!$subcat->getIsActive()) {
continue;
}
$_category = $objectManager->create('Magento\Catalog\Model\Category')->load($subcat->getId());
//$_outputhelper = $this->helper('Magento\Catalog\Helper\Output');
$helper = $this->helper('SR\CategoryImage\Helper\Category');
$subcaturl = $subcat->getUrl();
$imageUrlthum = $helper->getImageUrl($_category->getData('thumbnail'));
//$imageUrlthum = resize($_category->getData('thumbnail'),153,153);
//$cat_desc = $_category->getCatDescription();
$_imgHtml = '';
if ($imageUrlthum) {
$_imgHtml = '<img src="' . $imageUrlthum. '" />';
//$_imgHtml = $_outputhelper->categoryAttribute($_category, $_imgHtml, 'image');
/* @escapeNotVerified */
}
?>
<li>
<div class="sub_cat_content_main">
<div class="cat_image_text">
<a href="<?php echo $subcaturl ?>">
<?php echo $_imgHtml;?>
<!--<div class="desicription_part">-->
<?php //echo $cat_desc; ?>
<!--</div>-->
</a>
<div class="sub_name_bg">
<a href="<?php echo $subcaturl ?>">
<?php echo $subcat->getName(); ?>
</a>
</div>
<!-- Start 3rd Level Chiled Category-->
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_managertwo = $objectManager->create('Magento\Catalog\Model\Category')->load($subcat->getId());
$subcatslevelthird = $object_managertwo->getChildrenCategories();
?>
<?php if ($subcatslevelthird->count() > 0) { ?>
<ul class="sub_cat_bg">
<?php
foreach ($subcatslevelthird as $subcatthird) {
$_outputhelper = $this->helper('Magento\Catalog\Helper\Output');
$subcaturl = $subcatthird->getUrl();
?>
<li class="cat_image_bg">
<a class="level-top" href="<?php //echo $subcaturl ?>">
<span><?php //echo $subcatthird->getName(); ?></span>
</a>
<div class="child_name_bg">
<span><?php echo $subcatthird->getName(); ?></span>
</div>
<!-- Start 4th Level Chiled Category-->
<?php
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_managerthree = $_objectManager->create('Magento\Catalog\Model\Category')->load($subcatthird->getId());
$subcatslevel = $object_managerthree->getChildrenCategories();
?>
<?php if ($subcatslevel->count() > 0){?>
<ul class="chiled_cat_bg">
<?php
foreach ($subcatslevel as $subcatlevel) {
$_outputhelper = $this->helper('Magento\Catalog\Helper\Output');
$subcaturl = $subcatlevel->getUrl();
?>
<li class="cat_image_bg">
<a class="level-top" href="<?php echo $subcaturl ?>">
<span><?php echo $subcatlevel->getName(); ?></span>
</a>
</li>
<?php } ?>
</ul>
<?php } ?>
<!-- End 4th level Chiled Category-->
</li>
<?php } ?>
</ul>
<?php } ?>
<!-- End 3rd level Chiled Category-->
</div>
</div>
</li>
<?php } ?>
</ul>
<div id="view_more">
View more
</div>
</div>
Sử dụng mã dưới đây để có được tất cả các loại con hoạt động của một thể loại cụ thể.
Hàm getChildC loại ($ categoryId) cung cấp cho tất cả các danh mục con. Trong đó $ categoryId - là id danh mục chính
<?php
namespace YourModuleName\CategoryLink\Block;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Catalog\Model\CategoryFactory;
/**
* Category link block
*/
class Link extends Template
{
/**
* @var Magento\Catalog\Model\CategoryFactory
*/
protected $_categoryFactory;
/**
*
* @param Context $context
* @param array $data
*/
public function __construct(
Context $context,
CategoryFactory $categoryFactory,
array $data = []
) {
parent::__construct($context, $data);
$this->_categoryFactory = $categoryFactory;
}
/**
* Get children categories
*
* @param $categoryId Parent category id
* @return Magento\Catalog\Model\ResourceModel\Category\Collection
*/
public function getChildCategories($categoryId)
{
$_category = $this->_categoryFactory->create();
$category = $_category->load($categoryId);
//Get category collection
$collection = $category->getCollection()
->addIsActiveFilter()
->addOrderField('name')
->addIdFilter($category->getChildren());
return $collection;
}
}
$ category-> getChildren () - Điều này sẽ cung cấp cho tất cả các id danh mục chid.
$subcats = $subcategory->getChildrenCategories();