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

时间:2016-01-20 04:53:56

标签: magento2 magento-2.0

如何在 magento2 中获取当前类别?

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

6 个答案:

答案 0 :(得分:13)

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

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

protected $_registry;

public function __construct(
    \Magento\Framework\Registry $registry
) {
    $this->_registry = $registry;
}

然后使用:

$category = $this->_registry->registry('current_category');//get current category

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

答案 1 :(得分:6)

试试这段代码。这肯定对你有帮助。

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

答案 2 :(得分:4)

以上看起来是正确的,但我认为直接跳到注册表并不是最好的方法。 Magento提供了一个已经封装该功能的图层解析器。 (请参阅目录插件中的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();
    }
}

以下是实际的 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;
}

正如您所看到的,它仍然使用注册表,但它会在失败的情况下提供后备。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:-1)

添加XML代码主题/名称空间/ Magento_Catalog / templates / product / view

<block class="Magento\Catalog\Block\Product\View" name="product.info.category" after="product.price.final" template="product/view/current_category.phtml" />

创建新文件主题/名称空间/ Magento_Catalog / templates / product / view

<?php 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $product = $objectManager->get('Magento\Framework\Registry')->registry('current_product');
    $categories = $product->getCategoryIds(); /*will return category ids array*/
    foreach($categories as $category){
        $cat = $objectManager->create('Magento\Catalog\Model\Category')->load($category);
        echo $cat->getName();
    }

?>

答案 5 :(得分:-2)

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category
    $catId = $category->getId();
    $catId = $category->getName();
?>