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


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.


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ę.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.