Magento 2使用注册表获取当前类别ID


Answers:


0

我认为您在控制器中所做的可能是您应该通过使用__construct方法中的上下文类来初始化对象管理器。


嗨,我已经在我的块类文件中调用了construct方法,请检查以下链接以获取更多详细信息 codebeautify.org/alleditor/0b796a 并感谢您的帮助。
Pratik

这不应是公认的答案。您不应以上述方式使用Objectmanager。
seanbreeden

22

如果您需要在Magento2中使用类别ID,则可以按照以下步骤获取值

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应该被创建。
Pratik

您的私人财产放错了地方。
LM_Fielding '16

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

如何获得列表页面中的类别名称?不使用objectmanager?
贾法尔·品哈尔

3

上面的说法似乎是正确的,但我认为直接跳到注册表不是最佳方法。Magento提供了已经封装了该功能的Layer Resolver。(请参阅目录插件中的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;
}

如您所见,它仍然使用注册表,但是在失败的情况下提供了备用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.