Magento 2 obtient l'identifiant de catégorie actuel à l'aide du registre

13

Quelqu'un sait-il comment obtenir l'identifiant de catégorie en utilisant le registre de catégorie actuel dans Magento 2?

Pratik
la source
Refer blogs, rakeshjesadiya.com/…
Rakesh Jesadiya

Réponses:

0

Je pense que vous l'avez fait dans votre contrôleur, vous devriez peut-être initialiser le gestionnaire d'objets en utilisant la classe de contexte dans la méthode __construct.

Niranjan B
la source
Salut, j'appelle déjà la méthode de construction dans mon fichier de classe de bloc, veuillez vérifier le lien ci-dessous pour plus de détails codebeautify.org/alleditor/0b796a Et merci pour l'aide.
Pratik
Cela ne devrait pas être la réponse acceptée. Vous ne devez pas utiliser Objectmanager de la manière décrite.
seanbreeden
22

Si vous avez besoin de l'ID de catégorie dans Magento2, vous pouvez obtenir les valeurs en suivant les étapes suivantes à suivre

1.Incluez l'utilisation Magento\Framework\Registrydans votre fichier de classe.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.Créez un objet pour cela en utilisant le gestionnaire d'objets ou si vous l'utilisez dans le contrôleur, affectez-le dans votre __construct()fonction en tant que \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

class BlueLine
{
    ...
    private $registry;
    ...

    public function __construct(Registry $registry) 
    {
        $this->registry = $registry;
    }

    ...

3. Ensuite, vous pouvez simplement l'utiliser avec la classe comme:

$category = $this->registry->registry('current_category');

echo $category->getId();

Pour la référence supplémentaire dans la mise en œuvre de Magento2 de ce concept, reportez-vous au fichier de classe et à la fonction appelée fonction publique _initCategory(). Dans cette méthode, ils enregistrent la catégorie actuelle.

Niranjan B
la source
Bonjour, je suis l'étape et je vérifie le résultat de son affichage Une erreur s'est produite lors du traitement de votre demande. L'objet DOMDocument doit être créé.
Pratik
Votre propriété privée est au mauvais endroit.
LM_Fielding
10

Essayez ce code. cela vous aidera certainement.

<?php 
   $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
   $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category
    echo $category->getId();
    echo $category->getName();
?>
Makwana Ketan
la source
4
Vous ne devez pas utiliser le gestionnaire d'objets dans votre code comme ça. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721
3

Ce qui précède semble correct, mais je pense que sauter directement au Registre n'est pas la meilleure approche. Magento fournit un résolveur de calque qui encapsule déjà cette fonctionnalité. (Voir le bloc TopMenu dans les plugins du catalogue)

Je suggère d'injecter la classe \ Magento \ Catalog \ Model \ Layer \ Resolver et de l'utiliser pour obtenir la catégorie actuelle. Voici le code:

<?php

namespace FooBar\Demo\Block;

class Demo extends \Magento\Framework\View\Element\Template
{
    private $layerResolver;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->layerResolver = $layerResolver;
    }

    public function getCurrentCategory()
    {
        return $this->layerResolver->get()->getCurrentCategory();
    }

    public function getCurrentCategoryId()
    {
        return $this->getCurrentCategory()->getId();
    }
}

Voici ce que fait la méthode getCurrentCategory () dans la classe Resolver.

public function getCurrentCategory()
{
    $category = $this->getData('current_category');
    if ($category === null) {
        $category = $this->registry->registry('current_category');
        if ($category) {
            $this->setData('current_category', $category);
        } else {
            $category = $this->categoryRepository->get($this->getCurrentStore()->getRootCategoryId());
            $this->setData('current_category', $category);
        }
    }

    return $category;
}

Comme vous pouvez le voir, il utilise toujours le registre mais il fournit une solution de secours en cas d'échec.

drew7721
la source