2016-01-20 23 views

risposta

2

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

Grazie @Makwana Ketan –

+3

Non rispetta il principio di dipendenza dipendenza –

+1

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 –

10

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

+3

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

+0

Sono d'accordo, è una cattiva pratica usare 'ObjectManager' in Magento 2 – cjohansson

1

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.

+0

+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