ฉันจะรับผลิตภัณฑ์ปัจจุบันใน Magento2 ได้อย่างไร


15

ฉันพยายามดึงคุณสมบัติของผลิตภัณฑ์ปัจจุบันในบล็อกใน Magento 2 ฉันสามารถรับผลิตภัณฑ์เช่น id 1:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\ProductRepository')->getById(1);

ฉันไม่ทราบวิธีรับรหัสผลิตภัณฑ์ปัจจุบัน ฉันจะทำอย่างไร


คุณสามารถเรียกใช้ฟังก์ชั่นgetProduct()ในMagento\Catalog\Block\Product\View
xanka

คุณอยากได้ผลิตภัณฑ์ปัจจุบันที่ไหน
Amit Bera

ฉันกำลังเพิ่มโมดูลเพื่อแสดงข้อมูลจำเพาะของผลิตภัณฑ์ (คุณสมบัติ) ในแท็บบนหน้าผลิตภัณฑ์ แก้ไขปัญหาผ่านทาง $ block-> getProduct () ต่อคำตอบจาก Rahil Patel
Tim Trampedach

โปรดตรวจสอบลิงค์ด้านล่างmageplaza.com/how-get-current-product-category-magento-2.htmlคุณสามารถรับผลิตภัณฑ์ปัจจุบันโดยใช้รีจิสตรี ขอบคุณ !!
Mukesh Prajapati

ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง - จากการตรวจสอบ
Jai

คำตอบ:


11

ในการรับผลิตภัณฑ์ปัจจุบันหนึ่งในวิธีที่แนะนำคือ:

  1. Magento\Catalog\Block\Product\View\AbstractViewขยายหรือระดับการใช้งานบล็อก:
  2. รับผลิตภัณฑ์โดยใช้: $block->getProduct()ในไฟล์ PHP ของคุณ

6
หรือคุณสามารถลองใช้ $ this -> _ coreRegistry-> registry ('product'); เช่นกัน !!
Rahil Patel

# 2 ทำงานได้ดีมาก ไม่แน่ใจว่าทำไมฉันไม่สามารถคิดออกเอง ขอบคุณสำหรับความช่วยเหลือของคุณ!
Tim Trampedach

คุณสามารถช่วยฉันได้รับข้อผิดพลาดในการโหลด () เพื่อรับรหัสผลิตภัณฑ์ $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam

@SachinS โปรดให้รายละเอียดเพิ่มเติมเพื่อให้ฉันสามารถช่วยคุณ
Rahil Patel

2
AbstractView เริ่มต้นด้วยเมืองหลวง A Magento \ Catalog \ Block \ Product \ View \ AbstractView
Patrick van Bergen

29

แม้ว่าคำตอบอื่น ๆ นั้นถูกต้อง แต่ก็ไม่ได้เป็นคำแนะนำที่เหมาะสม

การใช้ ObjectManager นั้นเป็นสิ่งต้องห้ามใน Magento 2 ดังนั้นโปรดอย่าพึ่งพาโซลูชันนี้ แต่ใช้ DI ที่เหมาะสมเพื่อให้ได้สิ่งนี้แทน หากต้องการเรียนรู้วิธีใช้ DI ใน Magento 2 ดูแหล่งข้อมูลนี้: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

ไม่จำเป็นต้องขยาย AbstractView หากคุณดูที่ฟังก์ชั่นดั้งเดิมใน AbstractView คุณจะเห็น Magento ใช้รีจิสทรีเพื่อดึงข้อมูลผลิตภัณฑ์ คุณไม่จำเป็นต้องขยายคลาสเฉพาะเพื่อทำสิ่งนี้เพียงแค่ฉีด Magento \ Framework \ Registry ลงในคอนสตรัคเตอร์ของคุณและขอรายการรีจิสตรี "ผลิตภัณฑ์"

ตัวอย่างรหัสแบบเต็ม:

<?php

// Example = Module namespace, Module = module name, rest of the namespace is just for example only, change this to whatever it is in your case.
namespace Example\Module\Block\Frontend\Catalog\Product\General;

use Magento\Catalog\Model\Product;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Framework\View\Element\Template;

class Information extends Template
{

    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var Product
     */
    private $product;

    public function __construct(Template\Context $context,
                                Registry $registry,
                                array $data)
    {
        $this->registry = $registry;

        parent::__construct($context, $data);
    }


    /**
     * @return Product
     */
    private function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');

            if (!$this->product->getId()) {
                throw new LocalizedException(__('Failed to initialize product'));
            }
        }

        return $this->product;
    }

    public function getProductName()
    {
        return $this->getProduct()->getName();
    }

}

ยินดีต้อนรับสู่ Magento SE หากคุณมีความคิดเห็นเกี่ยวกับคำตอบอื่น ๆ โปรดใช้ลิงก์ "เพิ่มความคิดเห็น" เพื่อทำเช่นนั้น โปรดเขียนคำตอบที่เป็นของตัวเองให้มากที่สุดและไม่ต้องพึ่งพาคำตอบอื่น ๆ คำตอบอื่น ๆ อาจถูกลบหรืออาจ "หายไป" ที่บริเวณด้านล่างของหน้า
7ochem

@ 7ochem ขอโทษที่บอกว่าฉันยังไม่ได้รับอนุญาตให้แสดงความคิดเห็นนั่นเป็นเหตุผลที่ฉันทำแบบนี้ฉันจะใช้ความคิดเห็นที่เหมาะสมในอนาคต :)
เวสลีย์ Vestjens

ฉันมีโมดูลอยู่แล้วและคุณสามารถช่วยแนะนำวิธีการใช้ฟังก์ชั่นของคุณในโมดูลปัจจุบันของฉันได้อย่างไร และฉันจะบอกว่าคำอธิบายที่ดีที่สุดที่ฉันต้องใช้ในโมดูลของฉัน ขอบคุณ
Sharma

สวัสดีชาร์มันยากที่จะพูดอย่างแน่นอนโดยไม่เห็นโค้ด แต่ความคิดยังคงเหมือนเดิม: ในคอนสตรัคเตอร์ของคุณ (อันที่มีขีดล่าง 2 อัน) เพิ่มอาร์กิวเมนต์ใหม่และฉีด Magento \ Framework \ Registry ลงในบล็อกของคุณ จากนั้นใช้รีจิสตรีเพื่อรับผลิตภัณฑ์เช่นนี้: $ this-> product = $ this-> registry-> registry ('product');
Wesley Vestjens

2
การลงทะเบียนถูกเลิกใช้แล้วและต้องใช้วิธีการของ @ rafael-corrêa-gomes แทน
Christophe Ferreboeuf

5

หากคุณใช้ Magento 2.1 หรือสาขาใหญ่คุณสามารถใช้วิธีนี้ได้helperเนื่องจากวิธีการเดิมนั้นเลิกใช้แล้ว

...
use Magento\Catalog\Helper\Data;
...

public function __construct(
        Context $context,
        Data $helper,
        array $data = []
    ){
        $this->context = $context;
        $this->helper = $helper;
        $this->data = $data;
        parent::__construct($context, $data);
    }

...

public function getProduct(){
    if(is_null($this->_product)){
        $this->_product = $this->helper->getProduct();
    }
    return $this->_product;
}

0

@ แก้ปัญหาเวสลีย์ Vestjens ทำงานสำหรับฉันเช่นกัน เพียงให้ความสนใจกับตัวปรับการเข้าถึงเนื่องจากความเป็นส่วนตัวอาจไม่ใช่สิ่งที่คุณต้องการหากคุณใช้getProduct()ในแม่แบบของคุณ ในตัวอย่างข้างต้นมันทำงานตามที่getProductName()เป็นวิธีการสาธารณะที่จะใช้


โดยทั่วไปจะแนะนำไม่ให้วัตถุทั้งหมดให้กับแม่แบบ แต่แทนที่จะส่งผ่านข้อมูลที่ต้องการและไม่มีอะไรเพิ่มเติม นั่นเป็นเหตุผลที่getProduct()เป็นส่วนตัวและgetProductName()เป็นสาธารณะ ในเวอร์ชันวีโอไอพีที่ใหม่กว่า (2.2 / 2.3 ขึ้นไป) วิธีการเหล่านี้ยังถูกพิจารณาว่าเลิกใช้แล้วและควรใช้ View Models แทน
Wesley Vestjens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.