如何获得magento2中的当前类别?

Mak*_*tan 8 magento2 magento-2.0

我怎样才能获得magento2中的当前类别?

我想在自定义phtml文件中获取类别名称和类别ID.

Man*_*Joy 13

Magento为所访问的类别设置注册表.因此,要获得currenct类别,请使用以下方法:

/**
 * @param \Magento\Framework\Registry $registry
 */

protected $_registry;

public function __construct(
    \Magento\Framework\Registry $registry
) {
    $this->_registry = $registry;
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

$category = $this->_registry->registry('current_category');//get current category
Run Code Online (Sandbox Code Playgroud)

现在您可以访问集合并获取详细信息,例如$ category-> getName()

  • 这是正确的答案,因为,与上面选择的一个不同,这个代码尊重依赖注入原则,不要在代码中直接使用objectManager (5认同)
  • 我同意,在Magento 2中使用`ObjectManager`是不好的做法 (2认同)

Mil*_*dro 9

无需使用对象管理器或注入类。您可以通过Magento\Catalog\Helper\Data以下方式使用内置帮助器类。

<?php 
    $catalogHelperData = $this->helper('Magento\Catalog\Helper\Data');
    $categoryObject = $catalogHelperData->getCategory();
    $categoryId = $categoryObject->getId();
    $categoryName = $categoryObject->getName();
?>
Run Code Online (Sandbox Code Playgroud)

此代码段适用于与产品列表页面或产品详细信息页面相关的任何 phtml内置或自定义)文件。


Mak*_*tan 7

试试这个代码.这肯定会对你有所帮助.

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

  • 不尊重依赖注入原则 (10认同)
  • 标记我的评论的任何理由?@Makwana,你应该更好地从你的错误中吸取教训并分享好的做法(也许可以解决你的答案),而不是欺负这样的人 (2认同)
  • 我同意@YonnTrimoreau你应该遵循依赖注入原则.直接使用对象管理器是一种不好的做法 (2认同)
  • 是的,像这样直接使用 OM 确实是很糟糕的做法。来自[官方 Magento 开发文档](http://devdocs.magento.com/guides/v2.0/extension-dev-guide/object-manager.html) - Magento 禁止在代码中直接使用 ObjectManager,因为它隐藏了类的真正依赖关系。 (2认同)
  • 好吧,它会工作得很好。但在 Magento 中使用 objectManager 并不受欢迎。 (2认同)

dre*_*721 6

上面的说法似乎是正确的,但我认为直接跳到注册表不是最佳方法。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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实际的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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1,因为没有重新发明轮子!这并不是OP所要求的“完全”,但由于后备机制,它可能是比其他答案更好的解决方案。我知道这是给我的。 (2认同)