Magento 2 ottiene l'attuale ID categoria utilizzando il registro


Risposte:


0

Penso che tu abbia fatto nel tuo controller potrebbe essere che dovresti far inizializzare il gestore oggetti usando la classe di contesto nel metodo __construct.


Ciao, ho già chiamato il metodo di costruzione nel mio file di classe di blocco, controlla sotto il link per maggiori dettagli codebeautify.org/alleditor/0b796a E grazie per l'aiuto.
Pratik,

Questa non dovrebbe essere la risposta accettata. Non utilizzare Objectmanager nel modo descritto.
seanbreeden,

22

Se hai bisogno dell'ID categoria in Magento2, puoi ottenere i valori usando i seguenti passi da seguire

1. Includi l'uso Magento\Framework\Registrynel tuo file di classe.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2. Creare un oggetto per quello utilizzando Gestione oggetti oppure se lo si utilizza nel controller, assegnare nella __construct()funzione come \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

class BlueLine
{
    ...
    private $registry;
    ...

    public function __construct(Registry $registry) 
    {
        $this->registry = $registry;
    }

    ...

3. Quindi puoi semplicemente usarlo con la classe come:

$category = $this->registry->registry('current_category');

echo $category->getId();

Per ulteriori riferimenti in Magento2 L'implementazione di questo concetto si riferisce al file di classe e alla funzione chiamata funzione pubblica _initCategory(). In questo metodo stanno registrando la categoria corrente.


Salve, seguo il passaggio e controllo il risultato che mostra. Si è verificato un errore durante l'elaborazione della richiesta. È necessario creare l'oggetto DOMDocument.
Pratik,

La tua proprietà privata è nel posto sbagliato.
LM_Fielding

10

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

4
Non dovresti usare il gestore oggetti nel tuo codice in questo modo. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721

3

Quanto sopra sembra corretto, ma penso che saltare direttamente al registro non sia l'approccio migliore. Magento fornisce un resolver di livelli che già incapsula quella funzionalità. (Vedi il blocco TopMenu nel plugin del catalogo)

Suggerisco di iniettare la classe \ Magento \ Catalog \ Model \ Layer \ Resolver e di 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();
    }

    public function getCurrentCategoryId()
    {
        return $this->getCurrentCategory()->getId();
    }
}

Ecco cosa fa l'attuale metodo getCurrentCategory () 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 puoi vedere, utilizza ancora il registro ma fornisce un fallback in caso di errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.