ใครรู้ว่าฉันจะได้รับรหัสหมวดหมู่โดยใช้การลงทะเบียนประเภทปัจจุบันใน Magento 2 ได้อย่างไร
ใครรู้ว่าฉันจะได้รับรหัสหมวดหมู่โดยใช้การลงทะเบียนประเภทปัจจุบันใน Magento 2 ได้อย่างไร
คำตอบ:
ฉันคิดว่าคุณได้ทำในคอนโทรลเลอร์ของคุณแล้วคุณควรจะให้ object manager เริ่มต้นด้วยการใช้คลาสบริบทในเมธอด __ โครงสร้าง
หากคุณต้องการรหัสหมวดหมู่ใน 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()
แนวคิดนี้ดูไฟล์ชั้นเรียนและฟังก์ชั่นที่เรียกว่าฟังก์ชั่นที่สาธารณะ ในวิธีการนี้พวกเขากำลังลงทะเบียนหมวดหมู่ปัจจุบัน
ลองรหัสนี้ สิ่งนี้จะช่วยคุณได้อย่างแน่นอน
<?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();
?>
ด้านบนที่ดูเหมือนจะถูกต้อง แต่ฉันคิดว่าการกระโดดไปที่ 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;
}
อย่างที่คุณเห็นมันยังคงใช้รีจิสตรี แต่จะมีทางเลือกในกรณีที่ล้มเหลว