回答:
以下の例を確認して、objectManagerを使用して親カテゴリIDを使用し、特定の親カテゴリのすべてのサブカテゴリのリストを取得します。
<?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>
=====
リポジトリを使用して親カテゴリIDを使用し、特定の親カテゴリのすべてのサブカテゴリのリストを表示するには、以下の例を確認してください。
まず、構成要素にCategoryRepositoryを追加します。
<?php
protected $categoryRepository;
public function __construct(
\Magento\Catalog\Model\CategoryRepository $categoryRepository
) {
$this->categoryRepository = $categoryRepository;
}
?>
これで、次の方法を使用できます。
<?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();
}
}
}
?>
クラスに依存関係を追加する必要があります\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
。
このような:
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;
}
ここgetDescendants
で、$category
オブジェクトをパラメーターとして、サブカテゴリーに必要なレベルの数(この場合は2)を使用して、メソッドを呼び出すだけです。
$block->getDescendents($category, 2)
がどこに$category
あるかを使用できます。(どこから取得したかわかりません)。
常にリポジトリを使用するようにしてください。ここに例があります。
CategoryRepository
構成によって挿入
protected $categoryRepository;
public function __construct(
\Magento\Catalog\Model\CategoryRepository $categoryRepository
) {
$this->categoryRepository = $categoryRepository;
}
これで、次の方法を使用できます。
$parent_category_id = 3;
$categoryObj = $this->categoryRepository->get($parent_category_id);
$subcategories = $categoryObj->getChildrenCategories();
foreach($subcategories as $subcategorie) {
echo ' --> '.$subcategorie->getName().'<br/>';
}
2レベルの子カテゴリの場合:
$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>
以下のコードを使用して、特定のカテゴリのすべてのアクティブな子カテゴリを取得します。
関数getChildCategories($ categoryId)は、すべての子カテゴリを提供します。$ categoryId-は親カテゴリIDです
<?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()-これにより、すべてのChidカテゴリーIDが提供されます。
$subcats = $subcategory->getChildrenCategories();