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


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

Author: David Manners, 2015-08-22

4 answers

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

 0
Author: Niranjan B, 2020-04-17 18:54:32

Если вам нужен идентификатор категории в 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 обратитесь к файл класса и функция, называемая общедоступной функцией _initCategory(). В этом методе они регистрируют текущую категорию.

 22
Author: Niranjan B, 2017-12-19 08:25:22

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

<?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();
?>
 11
Author: Makwana Ketan, 2016-01-20 05:07:15

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

Я предлагаю ввести класс \Magento\Каталог\Модель\Слой\Преобразователь и использовать его для получения текущей категории. Вот код:

<?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() в преобразователе Класс.

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;
}

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

 5
Author: drew7721, 2017-09-25 22:05:02