Magento 2 - Nhận các danh mục con của danh mục phụ huynh cụ thể


8

Những gì tôi muốn làm là lấy tất cả các loại con của một loại cha mẹ cụ thể. Tôi giả định cách tốt nhất để làm điều này là sử dụng ID của cha mẹ và của các danh mục con được trả lại, tôi cũng muốn lấy các danh mục con của chúng.


Làm thế nào tôi có thể sắp xếp các danh mục trẻ em sau$subcats = $subcategory->getChildrenCategories();
Kam Meat Yaduwanshi

Câu trả lời:


16

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

2
làm việc cho tôi...!
Devidas

2
Bạn không nên sử dụng objectManager như thế này. Tham khảo: magento.stackexchange.com/questions/117098/ trộm
Frank Groot

14

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 getDescendantsvớ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).


Tôi đang thử, nhưng bạn có thể làm rõ mã nào nên được sử dụng trong tệp phtml không?
Paul

bạn cần phải thêm mã này vào lớp khối của bạn, và trong phtml của bạn, bạn có thể sử dụng $block->getDescendents($category, 2)ở đâu $categorylà danh mục chính. (Tôi không biết bạn lấy nó từ đâu).
Marius

@Marius Này Marius, tôi biết một bài viết cũ nhưng làm thế nào để tìm ra cái ... nên ở đâu?
Jon Holland

@Marius Siêu câu trả lời (y)
sheraz khan

10

Luôn cố gắng sử dụng kho lưu trữ. Đây là một ví dụ.

Tiêm CategoryRepositorybằ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/>';
        }
    }
}

điều này sẽ giúp bạn chỉ có 1 cấp độ của danh mục con. OP yêu cầu 2 cấp độ.
Marius

1
Thậm chí tốt hơn so với sử dụng mô hình kho lưu trữ trực tiếp, sử dụng giao diện. \Magento\Catalog\Api\CategoryRepositoryInterface
Andrei

Làm cách nào để giới hạn getChildrenC loại chỉ còn 4? Tôi cần 4 hạng mục con đầu tiên của thể loại phụ huynh
jafar pinjar

2
    $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>

Tôi muốn được sắp xếp các danh mục trẻ em, theo tên danh mục, xin vui lòng giúp đỡ về điều này?
Kam Meat Yaduwanshi

Bạn cần sử dụng và nhận id danh mục cho tên của danh mục
Baharuni Asif

2

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.

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.