Comment puis-je obtenir la catégorie actuelle dans magento2 ?
Je veux obtenir le nom et l'id de la catégorie dans un fichier phtml personnalisé.
Essayez ce code. cela va certainement vous aider.
<?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();
?>
Magento définit le registre pour les catégories auxquelles l'utilisateur accède. Donc, pour obtenir la catégorie actuelle, utilisez la méthode suivante:
/**
* @param \Magento\Framework\Registry $registry
*/
protected $_registry;
public function __construct(
\Magento\Framework\Registry $registry
) {
$this->_registry = $registry;
}
et ensuite utiliser:
$category = $this->_registry->registry('current_category');//get current category
Vous pouvez maintenant accéder à la collection et récupérer des détails tels que $ category-> getName ()
Ce qui précède semble correct, mais je pense que passer directement au registre n’est pas la meilleure approche. Magento fournit un résolveur de couche qui encapsule déjà cette fonctionnalité. (Voir le bloc TopMenu dans les plugins du catalogue)
Je suggère d'injecter la classe\Magento\Catalog\Model\Layer\Resolver et de l'utiliser pour obtenir la catégorie actuelle. Voici le code:
<?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();
}
}
Voici ce que fait la méthode getCurrentCategory () dans la classe de résolveur.
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;
}
Comme vous pouvez le constater, il utilise toujours le registre, mais il offre une solution de secours en cas d'échec.
Ajouter un thème de code XML/namespace/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" />
Créer un nouveau thème de fichier/namespace/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();
}
?>