Magento 2 получить идентификатор текущей категории, используя реестр

13

Кто-нибудь знает, как я могу получить идентификатор категории, используя текущий реестр категорий в Magento 2?

Pratik
источник
См. Блоги, rakeshjesadiya.com/…
Ракеш Джесадия,

Ответы:

0

Я думаю, что вы сделали в своем контроллере, может быть, вы должны получить инициализацию менеджера объектов, используя контекстный класс в методе __construct.

Ниранджан Б
источник
Привет, я уже вызываю метод конструкции в моем файле классов блоков, пожалуйста, проверьте ниже ссылку для более подробной информации codebeautify.org/alleditor/0b796a И спасибо за помощь.
Пратик
Это не должно быть принятым ответом. Вы не должны использовать Objectmanager, как описано выше.
Seanbreeden
22

Если вам нужен идентификатор категории в Magento2, вы можете получить значения, выполнив следующие шаги

1. Включите использование Magento\Framework\Registryв вашем файле класса.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2. Создайте объект для этого с помощью диспетчера объектов или, если вы используете его в контроллере, назначьте в вашей __construct()функции \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Затем вы можете просто использовать его с классом как:

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

echo $category->getId();

Для дальнейшего использования в Magento2 Реализация этой концепции приведена в файле класса и функции, называемой public function _initCategory(). В этом методе они регистрируют текущую категорию.

Ниранджан Б
источник
Привет! Я следую за шагом и проверяю результат его отображения. Произошла ошибка при обработке вашего запроса. Должен быть создан объект DOMDocument.
Пратик
Ваша частная собственность находится не в том месте.
LM_Fielding
10

Попробуйте этот код. это определенно поможет вам.

<?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
Вы не должны использовать менеджер объектов в вашем коде, как это. devdocs.magento.com/guides/v2.0/extension-dev-guide/...
drew7721
3

Вышеуказанное кажется правильным, но я думаю, что прыгать прямо в Реестр - не лучший подход. Magento предоставляет Resolver Layer, который уже инкапсулирует эту функциональность. (Смотрите блок TopMenu в каталоге плагинов)

Я предлагаю ввести класс \ Magento \ Catalog \ Model \ Layer \ Resolver и использовать его для получения текущей категории. Вот код:

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

Вот что делает метод getCurrentCategory () в классе 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;
}

Как вы можете видеть, он по-прежнему использует реестр, но он обеспечивает запасной вариант в случае сбоя.

drew7721
источник