Magento 2 pobiera bieżący identyfikator kategorii za pomocą rejestru

13

Czy ktoś wie, w jaki sposób mogę uzyskać identyfikator kategorii za pomocą bieżącego rejestru kategorii w Magento 2?

Pratik
źródło
Odnoś się do blogów, rakeshjesadiya.com/…
Rakesh Jesadiya,

Odpowiedzi:

0

Myślę, że zrobiłeś w swoim kontrolerze być może powinieneś zainicjować menedżera obiektów za pomocą klasy kontekstu w metodzie __construct.

Niranjan B.
źródło
Cześć, już wywołałem metodę konstruowania w moim pliku klasy bloków, proszę sprawdzić poniższy link, aby uzyskać więcej szczegółów codebeautify.org/alleditor/0b796a I dzięki za pomoc.
Pratik
To nie powinna być zaakceptowana odpowiedź. Nie należy używać Objectmanagera w opisany sposób.
seanbreeden
22

Jeśli potrzebujesz identyfikatora kategorii w Magento2, możesz uzyskać wartości, wykonując następujące kroki

1. Uwzględnij użycie Magento\Framework\Registryw swoim pliku klasy.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2. Stwórz obiekt dla tego za pomocą Object Managera lub jeśli używasz go w kontrolerze, przypisz w swojej __construct()funkcji jako \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Następnie możesz po prostu użyć go z klasą jako:

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

echo $category->getId();

Dalsze informacje na temat implementacji tej koncepcji w Magento2 znajdują się w pliku klasy i funkcji o nazwie funkcja publiczna _initCategory(). W tej metodzie rejestrują bieżącą kategorię.

Niranjan B.
źródło
Cześć Idę krok i sprawdzam wynik jego wyświetlania Wystąpił błąd podczas przetwarzania Twojego żądania Obiekt DOMDocument powinien zostać utworzony.
Pratik
Twoja własność prywatna znajduje się w niewłaściwym miejscu.
LM_Fielding,
10

Wypróbuj ten kod. to na pewno ci pomoże.

<?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
źródło
4
Nie powinieneś używać menedżera obiektów w swoim kodzie w ten sposób. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721,
jak uzyskać nazwę kategorii na stronie listy? bez użycia menedżera obiektów?
jafar pinjar
3

Powyższe wydaje się poprawne, ale myślę, że przejście do rejestru nie jest najlepszym podejściem. Magento zapewnia Layer Resolver, który już zawiera tę funkcjonalność. (Zobacz blok TopMenu we wtyczkach katalogu)

Sugeruję wstrzyknięcie klasy \ Magento \ Catalog \ Model \ Layer \ Resolver i użycie jej do uzyskania bieżącej kategorii. Oto kod:

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

Oto, co robi rzeczywista metoda getCurrentCategory () w klasie 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;
}

Jak widać, nadal korzysta z rejestru, ale zapewnia awarię w przypadku niepowodzenia.

drew7721
źródło