Magento 2 - Obtenez des sous-catégories de catégorie parent spécifique


9

Ce que j'aimerais faire, c'est saisir toutes les catégories enfants d'une catégorie parent spécifique. Je suppose que la meilleure façon de le faire est d'utiliser l'ID du parent et de ces catégories d'enfants qui sont retournées, je voudrais également récupérer leurs catégories d'enfants.


Comment puis-je obtenir des catégories d'enfants triées après$subcats = $subcategory->getChildrenCategories();
Kamlesh Yaduwanshi

Réponses:


16

Consultez l'exemple ci-dessous pour obtenir la liste de toutes les sous-catégories d'une catégorie parent spécifique à l'aide de l'ID de la catégorie parent à l'aide de 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>

=====

Consultez l'exemple ci-dessous pour répertorier toutes les sous-catégories d'une catégorie parent spécifique à l'aide de l'ID de la catégorie parent à l'aide du référentiel.

Tout d'abord, ajoutez CategoryRepository dans la construction:

<?php
    protected $categoryRepository;

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

Vous pouvez maintenant utiliser la méthode suivante:

<?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
travaille pour moi...!
Devidas

2
Vous ne devez pas utiliser le gestionnaire d'objet comme celui-ci. Référence: magento.stackexchange.com/questions/117098/…
Frank Groot

14

Vous devez ajouter une dépendance à votre classe \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory.

Comme ça:

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

il vous suffit maintenant d'appeler la méthode getDescendantsavec l' $categoryobjet en paramètre et le nombre de niveaux dont vous avez besoin pour les sous-catégories (2 dans votre cas).


Je donne un coup de feu à cela, mais pouvez-vous préciser quel code doit être utilisé dans le fichier phtml?
Paul

vous devez ajouter ce code à votre classe de bloc, et dans votre phtml, vous pouvez utiliser $block->getDescendents($category, 2)où se $categorytrouve la catégorie principale. (Je ne sais pas d'où ça vient).
Marius

@Marius Hé Marius, je connais un ancien post mais comment déterminer ce qui devrait être où les ... sont?
Jon Holland

@Marius Super answer (y)
sheraz khan

10

Essayez toujours d'utiliser le référentiel. Voici un exemple.

Injecter CategoryRepositorypar construction

protected $categoryRepository;

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

Vous pouvez maintenant utiliser la méthode suivante:

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

Pour la catégorie enfant à 2 niveaux:

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

cela vous donnera seulement 1 niveau de sous-catégories. L'OP a demandé 2 niveaux.
Marius

1
Encore mieux que d'utiliser directement le modèle de référentiel, utilisez l'interface. \Magento\Catalog\Api\CategoryRepositoryInterface
Andrei

Comment limiter getChildrenCategories à 4 uniquement? J'ai besoin des 4 premières catégories d'enfants de la catégorie parent
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>

Je veux être trié par catégories d'enfants, par nom de catégorie, aidez-moi à ce sujet?
Kamlesh Yaduwanshi

Vous devez utiliser et obtenir l'ID de catégorie pour le nom de la catégorie
Baharuni Asif

2

Utilisez le code ci-dessous pour obtenir toutes les catégories enfants actives d'une catégorie spécifique.

La fonction getChildCategories ($ categoryId) donne toutes les catégories enfants. Où $ categoryId - est l'ID de catégorie parent

<?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 () - Cela donnera à tous les identifiants des catégories d'enfants.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.