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


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.


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.


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

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.

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.