Magento 2 - Dapatkan Subkategori Kategori Induk Khusus


9

Yang ingin saya lakukan adalah mengambil semua kategori anak dari kategori induk tertentu. Saya berasumsi cara terbaik untuk melakukan ini adalah dengan menggunakan ID orang tua dan dari kategori anak yang dikembalikan, saya ingin mengambil kategori anak mereka juga.


Bagaimana saya bisa mendapatkan kategori anak-anak yang diurutkan setelah$subcats = $subcategory->getChildrenCategories();
Kamlesh Yaduwanshi

Jawaban:


16

Lihat contoh di bawah ini untuk mendapatkan daftar semua subkategori kategori induk spesifik menggunakan ID kategori induk menggunakan 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>

=====

Lihat contoh di bawah ini untuk mendaftar semua subkategori kategori induk tertentu menggunakan ID kategori induk menggunakan repositori.

Pertama-tama, tambahkan CategoryRepository dalam konstruk:

<?php
    protected $categoryRepository;

    public function __construct(
        \Magento\Catalog\Model\CategoryRepository $categoryRepository
    ) {
        $this->categoryRepository = $categoryRepository;
    }
?>

Sekarang Anda dapat menggunakan cara berikut:

<?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
bekerja untukku ...!
Devidas

2
Anda seharusnya tidak menggunakan objectManager seperti ini. Referensi: magento.stackexchange.com/questions/117098/...
Frank Groot

14

Anda perlu menambahkan dependensi ke kelas Anda \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory.

Seperti ini:

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

sekarang Anda hanya perlu memanggil metode getDescendantsdengan $categoryobjek sebagai parameter dan jumlah level yang Anda butuhkan untuk subkategori (2 dalam kasus Anda).


Saya mencoba ini, tetapi bisakah Anda mengklarifikasi kode apa yang harus digunakan dalam file phtml?
Paul

Anda perlu menambahkan kode ini ke kelas blok Anda, dan dalam phtml Anda, Anda dapat menggunakan di $block->getDescendents($category, 2)mana $categorykategori utama. (Saya tidak tahu dari mana Anda mendapatkannya).
Marius

@Marius Hei Marius, saya tahu posting lama tapi bagaimana cara kerjanya di mana ... di mana?
Jon Holland

@Marius Super answer (y)
sheraz khan

10

Selalu mencoba menggunakan repositori. Berikut ini sebuah contoh.

Suntikkan CategoryRepositorydengan konstruk

protected $categoryRepository;

public function __construct(
    \Magento\Catalog\Model\CategoryRepository $categoryRepository
) {
    $this->categoryRepository = $categoryRepository;
}

Sekarang Anda dapat menggunakan cara berikut:

$parent_category_id = 3;
$categoryObj = $this->categoryRepository->get($parent_category_id);
$subcategories = $categoryObj->getChildrenCategories();
foreach($subcategories as $subcategorie) {
    echo '    --> '.$subcategorie->getName().'<br/>';
}

Untuk kategori anak 2 tingkat:

$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/>';
        }
    }
}

ini hanya memberi Anda 1 tingkat subkategori. OP meminta 2 level.
Marius

1
Bahkan lebih baik daripada menggunakan model repositori secara langsung, gunakan antarmuka. \Magento\Catalog\Api\CategoryRepositoryInterface
Andrei

Bagaimana membatasi hanya 4 anak-anak? Saya perlu 4 anak pertama kategori kategori orang tua
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>

Saya ingin diurutkan kategori anak-anak, dengan nama kategori, tolong bantu ini?
Kamlesh Yaduwanshi

Anda perlu menggunakan dan mendapatkan id kategori untuk nama kategori
Baharuni Asif

2

Gunakan kode di bawah ini untuk mendapatkan semua kategori anak aktif dari kategori tertentu.

Function getChildCategories ($ categoryId) memberikan semua kategori anak. Di mana $ categoryId - adalah id kategori induk

<?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 () - Ini akan memberikan semua id kategori chid.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.