Magento 2 ruft die aktuelle Kategorie-ID mithilfe der Registrierung ab


Antworten:


0

Ich denke, Sie haben in Ihrem Controller getan, möglicherweise sollten Sie den Objektmanager mithilfe der Kontextklasse in der __construct-Methode initialisieren lassen.


Hallo, ich rufe die Konstruktmethode bereits in meiner Blockklassendatei auf. Bitte überprüfen Sie den folgenden Link für weitere Details. Codebeautify.org/alleditor/0b796a Und danke für Hilfe.
Pratik

Dies sollte nicht die akzeptierte Antwort sein. Sie sollten den Objectmanager nicht auf die beschriebene Weise verwenden.
Seanbreeden

22

Wenn Sie die Kategorie-ID in Magento2 benötigen, können Sie die Werte anhand der folgenden Schritte ermitteln

1.Nehmen Sie die Verwendung Magento\Framework\Registryin Ihre Klassendatei auf.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.Erstellen Sie ein Objekt dafür mit dem Objekt-Manager oder, falls Sie es in der Steuerung verwenden, weisen Sie es in Ihrer __construct()Funktion zu als \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Dann können Sie es einfach mit der Klasse verwenden als:

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

echo $category->getId();

Weitere Informationen zur Implementierung dieses Konzepts in Magento2 finden Sie in der Klassendatei und der Funktion public function _initCategory(). Bei dieser Methode registrieren sie die aktuelle Kategorie.


Hallo, ich folge Schritt und überprüfe das Ergebnis. Es ist ein Fehler bei der Verarbeitung Ihrer Anfrage aufgetreten. Das Objekt DOMDocument sollte erstellt werden.
Pratik

Ihr Privatbesitz befindet sich am falschen Ort.
LM_Fielding

10

Versuchen Sie diesen Code. das wird dir definitiv helfen.

<?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
Sie sollten den Objektmanager in Ihrem Code nicht so verwenden. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721 17.11.17

3

Das Obige scheint korrekt zu sein, aber ich denke, dass es nicht der beste Ansatz ist, direkt in die Registrierung zu springen. Magento bietet einen Layer Resolver, der diese Funktionalität bereits enthält. (Siehe den TopMenu Block in den Catalog Plugins)

Ich schlage vor, die Klasse \ Magento \ Catalog \ Model \ Layer \ Resolver zu injizieren und diese zu verwenden, um die aktuelle Kategorie abzurufen. Hier ist der 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();
    }

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

Die Methode getCurrentCategory () in der Resolver-Klasse führt die folgenden Aktionen aus.

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;
}

Wie Sie sehen, wird die Registrierung weiterhin verwendet, es wird jedoch ein Fallback für den Fall bereitgestellt, dass dies fehlschlägt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.