Come posso ottenere la categoria corrente in magento2?Come ottenere la categoria corrente in Magento2?
Desidero ottenere il nome della categoria e l'ID della categoria nel file phtml personalizzato.
Come posso ottenere la categoria corrente in magento2?Come ottenere la categoria corrente in Magento2?
Desidero ottenere il nome della categoria e l'ID della categoria nel file phtml personalizzato.
Prova questo codice. questo ti aiuterà sicuramente.
<?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 imposta il registro per le categorie a cui si accede. Quindi, per ottenere categoria currenct, l'uso seguente metodo:
/**
* @param \Magento\Framework\Registry $registry
*/
protected $_registry;
public function __construct(
\Magento\Framework\Registry $registry
) {
$this->_registry = $registry;
}
e quindi utilizzare:
$category = $this->_registry->registry('current_category');//get current category
Ora è possibile accedere alla raccolta e recuperare i dettagli, come $ categoria-> getName()
Questa è la risposta corretta perché, a differenza di quella scelta sopra, questo codice rispetta il principio di dipendenza delle dipendenze e non utilizzare objectManager direttamente nel codice – user2270248
Sono d'accordo, è una cattiva pratica usare 'ObjectManager' in Magento 2 – cjohansson
Quanto sopra sembra corretto, ma penso che saltare direttamente al registro non sia l'approccio migliore. Magento fornisce un Layer Resolver che incapsula già quella funzionalità. (Vedere il blocco TopMenu nei plugin del catalogo)
Suggerisco di inserire la classe \ Magento \ Catalog \ Model \ Layer \ Resolver e usarla per ottenere la categoria corrente. Ecco il codice:
<?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();
}
}
Ecco cosa l'attuale getCurrentCategory() metodo non nella classe 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;
}
Come si può vedere, utilizza ancora il registro ma fornisce un fallback in caso di esito negativo.
+1 per non reinventare la ruota! Non è esattamente * quello che l'OP ha richiesto, ma probabilmente è una soluzione migliore rispetto alle altre risposte a causa del meccanismo di fallback. So che era per me. – Eric
Grazie @Makwana Ketan –
Non rispetta il principio di dipendenza dipendenza –
Qualche motivo per contrassegnare il mio commento? @Makwana, dovresti imparare meglio dai tuoi errori e condividere buone pratiche (magari correggere la tua risposta) invece di fare il bullismo di persone come questa –