Magento 2 obtém o ID da categoria atual usando o registro

13

Alguém sabe como posso obter a identificação da categoria usando o registro de categoria atual no Magento 2?

Pratik
fonte
Consulte blogs, rakeshjesadiya.com/…
Rakesh Jesadiya

Respostas:

0

Eu acho que você fez no seu controlador pode ser que você deve obter o gerenciador de objetos a ser inicializado usando a classe de contexto no método __construct.

Niranjan B
fonte
Oi, eu já chamo método de construção no meu arquivo de classe de bloco, verifique o link abaixo para obter mais detalhes codebeautify.org/alleditor/0b796a E obrigado pela ajuda.
Pratik
Esta não deve ser a resposta aceita. Você não deve usar o Objectmanager da maneira descrita.
Seanbreeden
22

Se você precisar do ID da categoria no Magento2, poderá obter os valores usando as seguintes etapas a serem seguidas

1. Inclua o uso Magento\Framework\Registryno seu arquivo de classe.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.Crie um objeto para isso usando o Gerenciador de objetos ou, se você o estiver usando no controlador, atribua na sua __construct()função como \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3.Em seguida, você pode simplesmente usá-lo com a classe como:

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

echo $category->getId();

Para referência adicional na implementação do Magento2 deste conceito, consulte o arquivo de classe e a função chamada função pública _initCategory(). Nesse método, eles estão registrando a categoria atual.

Niranjan B
fonte
Olá, sigo a etapa e verifico o resultado sendo exibido Ocorreu um erro ao processar sua solicitação O objeto DOMDocument deve ser criado.
Pratik
Sua propriedade privada está no lugar errado.
LM_Fielding
10

Experimente este código. isso definitivamente irá ajudá-lo.

<?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
fonte
4
Você não deve usar o gerenciador de objetos no seu código assim. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721
3

O texto acima parece correto, mas acho que pular direto para o Registro não é a melhor abordagem. O Magento fornece um resolvedor de camadas que já encapsula essa funcionalidade. (Veja o bloco TopMenu nos plugins do catálogo)

Sugiro injetar a classe \ Magento \ Catalog \ Model \ Layer \ Resolver e usá-la para obter a categoria atual. Aqui está o código:

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

Aqui está o que o método getCurrentCategory () real faz na 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;
}

Como você pode ver, ele ainda usa o registro, mas fornece um fallback no caso de falha.

drew7721
fonte