Magento 2 mendapatkan Id kategori saat ini menggunakan registri

13

Adakah yang tahu bagaimana saya bisa mendapatkan id kategori menggunakan registri kategori saat ini di Magento 2?

Pratik
sumber
Referensikan blog, rakeshjesadiya.com/...
Rakesh Jesadiya

Jawaban:

0

Saya pikir Anda telah melakukan di controller Anda mungkin Anda harus mendapatkan manajer objek yang akan diinisialisasi dengan menggunakan kelas konteks dalam metode __construct.

Niranjan B
sumber
Hai saya sudah memanggil metode pembangunan dalam file kelas blok saya, silakan cek tautan di bawah ini untuk lebih detail codebeautify.org/alleditor/0b796a Dan terima kasih atas bantuannya.
Pratik
Ini seharusnya bukan jawaban yang diterima. Anda seharusnya tidak menggunakan Objectmanager dalam cara yang dijelaskan.
seanbreeden
22

Jika Anda membutuhkan ID kategori di Magento2, maka Anda bisa mendapatkan nilai menggunakan langkah-langkah berikut untuk diikuti

1. Sertakan penggunaan Magento\Framework\Registrydalam file kelas Anda.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2. Buat objek untuk itu menggunakan objek Manager atau jika Anda menggunakannya di controller kemudian menetapkan dalam __construct()fungsi Anda sebagai \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Kemudian Anda cukup menggunakannya dengan kelas sebagai:

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

echo $category->getId();

Untuk Referensi lebih lanjut dalam Magento2 Implementasi konsep ini merujuk file kelas dan fungsi yang disebut fungsi publik _initCategory(). Dalam metode ini mereka mendaftarkan kategori saat ini.

Niranjan B
sumber
Hai Saya ikuti langkah dan periksa hasil yang menunjukkan Ada kesalahan saat memproses permintaan Anda, Obyek DOMDocument harus dibuat.
Pratik
Properti pribadi Anda berada di tempat yang salah.
LM_Fielding
10

Coba kode ini. ini pasti akan membantu Anda.

<?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();
?>
Makwana Ketan
sumber
4
Anda seharusnya tidak menggunakan manajer objek dalam kode Anda seperti itu. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721
3

Di atas kelihatannya benar, tetapi saya berpikir bahwa melompat langsung ke Registry bukanlah pendekatan terbaik. Magento menyediakan Layer Resolver yang telah merangkum fungsionalitas itu. (Lihat Blok TopMenu di Plugin Katalog)

Saya sarankan menyuntikkan kelas \ Magento \ Catalog \ Model \ Layer \ Resolver dan menggunakannya untuk mendapatkan kategori saat ini. Ini kodenya:

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

Inilah yang dilakukan oleh metode getCurrentCategory () di kelas 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;
}

Seperti yang Anda lihat, itu masih menggunakan registri tetapi memberikan cadangan jika gagal.

drew7721
sumber