Magento 2 отримує поточну категорію Id за допомогою реєстру


Відповіді:


0

Я думаю, що ви зробили в своєму контролері, можливо, вам слід отримати ініціалізацію менеджера об'єктів за допомогою контекстного класу в методі __construct.


Привіт, я вже закликаю метод конструювання у файлі класового блоку, будь ласка, перевірте нижче посилання для більш детальної інформації codebeautify.org/alleditor/0b796a І дякую за допомогу.
Пратік

Це не має бути прийнятою відповіддю. Не слід використовувати Objectmanager описаним способом.
seanbreeden

22

Якщо вам потрібна категорія Id в Magento2, ви можете отримати значення, скориставшись наступними кроками

1.Включіть використання Magento\Framework\Registryу файлі вашого класу.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.Створіть для цього об'єкт за допомогою "Менеджера об'єктів", або якщо ви його використовуєте в контролері, то призначте у своїй __construct()функції як \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Тоді ви можете просто використовувати його з класом як:

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

echo $category->getId();

Для подальшої довідки в Magento2 Реалізація цієї концепції зверніться до файлу класу та функції, званої public function _initCategory(). У цьому методі вони реєструють поточну категорію.


Привіт, я дотримуюсь кроку та перевіряю його показ, який відображається. Під час обробки вашого запиту сталася помилка. Слід створити об’єкт DOMDocument
Пратік

Ваша приватна власність не в тому місці.
LM_Fielding

10

Спробуйте цей код. це вам точно допоможе.

<?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
Ви не повинні використовувати диспетчер об'єктів у своєму коді таким чином. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721

як отримати назву категорії на сторінці списку? без використання objectmanager?
jafar pinjar

3

Сказане здається правильним, але я вважаю, що стрибок прямо до Реєстру - не найкращий підхід. Magento пропонує роздільну здатність шару, яка вже інкапсулює цю функціональність. (Дивіться блок TopMenu у плагінах каталогу)

Я пропоную ввести клас \ Magento \ Catalog \ Model \ Layer \ Resolver і використовувати його для отримання поточної категорії. Ось код:

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

Ось що робить власне метод getCurrentCategory () у класі 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;
}

Як ви бачите, він все ще використовує реєстр, але він забезпечує резервний випадок у випадку невдачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.