Magento 2 รับ ID หมวดหมู่ปัจจุบันโดยใช้รีจิสตรี


คำตอบ:


0

ฉันคิดว่าคุณได้ทำในคอนโทรลเลอร์ของคุณแล้วคุณควรจะให้ object manager เริ่มต้นด้วยการใช้คลาสบริบทในเมธอด __ โครงสร้าง


สวัสดีฉันเรียกวิธีการสร้างในไฟล์คลาสบล็อกของฉันแล้วโปรดตรวจสอบลิงค์ด้านล่างเพื่อดูรายละเอียดเพิ่มเติม codebeautify.org/alleditor/0b796a และขอขอบคุณสำหรับความช่วยเหลือ
Pratik

นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ คุณไม่ควรใช้ Objectmanager ตามที่อธิบายไว้
seanbreeden

22

หากคุณต้องการรหัสหมวดหมู่ใน 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 _initCategory()แนวคิดนี้ดูไฟล์ชั้นเรียนและฟังก์ชั่นที่เรียกว่าฟังก์ชั่นที่สาธารณะ ในวิธีการนี้พวกเขากำลังลงทะเบียนหมวดหมู่ปัจจุบัน


สวัสดีฉันทำตามขั้นตอนและตรวจสอบผลลัพธ์ที่แสดงว่ามีข้อผิดพลาดในการประมวลผลคำขอของคุณควรสร้างวัตถุ DOMDocument
Pratik

ทรัพย์สินส่วนตัวของคุณอยู่ผิดที่
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

ด้านบนที่ดูเหมือนจะถูกต้อง แต่ฉันคิดว่าการกระโดดไปที่ Registry โดยตรงไม่ใช่วิธีที่ดีที่สุด Magento ได้จัดเตรียม Resolver ชั้นที่ห่อหุ้มฟังก์ชันการทำงานนั้นไว้แล้ว (ดูบล็อก 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 Class

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

อย่างที่คุณเห็นมันยังคงใช้รีจิสตรี แต่จะมีทางเลือกในกรณีที่ล้มเหลว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.