Làm cách nào để có được sản phẩm hiện tại trong Magento2?


15

Tôi đang cố truy xuất các thuộc tính của sản phẩm hiện tại trong một khối trong Magento 2. Tôi có thể nhận được một sản phẩm, như id 1:

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

Tôi không biết làm thế nào để có được ID của sản phẩm hiện tại. Làm thế nào để làm điều đó?


bạn có thể gọi hàm getProduct()trongMagento\Catalog\Block\Product\View
xanka

bạn muốn lấy sản phẩm hiện tại ở đâu?
Amit Bera

Tôi đang thêm một mô-đun để hiển thị thông số kỹ thuật (thuộc tính) của sản phẩm trong một tab trên trang sản phẩm. Vấn đề được giải quyết thông qua $ block-> get SẢNt () cho mỗi câu trả lời từ Rahil Patel.
Tim Trampedach

Vui lòng kiểm tra các liên kết bên dưới mageplaza.com/how-get-civerse-product-carget-magento-2.html Bạn có thể nhận được sản phẩm hiện tại bằng cách sử dụng đăng ký. Cảm ơn !!
Mukesh Prajapati

Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
Jai

Câu trả lời:


11

Để có được sản phẩm hiện tại, một trong những cách được đề xuất là:

  1. Mở rộng hoặc sử dụng lớp khối : Magento\Catalog\Block\Product\View\AbstractView.
  2. Nhận sản phẩm bằng cách sử dụng: $block->getProduct()trong tệp phtml của bạn.

6
Hoặc bạn có thể thử $ this -> _ coreRegistry-> registry ('sản phẩm'); cũng!!
Rahil Patel

# 2 hoạt động rất tốt. Không chắc chắn tại sao tôi không thể tìm ra điều đó bản thân mình. Cảm ơn bạn đã giúp đỡ!
Tim Trampedach

Bạn có thể giúp tôi nhận được lỗi trong load () để lấy id sản phẩm $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> tạo ('Nhà cung cấp \ Mô-đun \ Mô hình \ Hàng đợi') -> tải ($ sản phẩmId);
Sushivam

@SachinS Vui lòng cung cấp thêm chi tiết để tôi có thể hỗ trợ bạn.
Rahil Patel

2
AbstractView bắt đầu bằng vốn A Magento \ Catalog \ Block \ Product \ View \ AbstractView
Patrick van Bergen

28

Mặc dù các câu trả lời khác là chính xác, chúng cũng không phải là giải pháp được đề xuất / phù hợp.

Sử dụng ObjectManager hoàn toàn bị cấm trong Magento 2. Vì vậy, vui lòng không dựa vào giải pháp này mà hãy sử dụng DI thích hợp để đạt được điều này thay vào đó. Để tìm hiểu cách sử dụng DI trong Magento 2, hãy xem tài nguyên này: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Mở rộng AbstractView là không cần thiết. Nếu bạn nhìn vào chức năng ban đầu trong Tóm tắt, bạn có thể thấy Magento đã sử dụng sổ đăng ký để tìm nạp sản phẩm. Bạn không cần phải mở rộng một lớp cụ thể để làm điều này, chỉ cần tiêm Magento \ Framework \ Registry vào hàm tạo của bạn và yêu cầu mục đăng ký "sản phẩm".

Ví dụ mã đầy đủ:

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

}

Chào mừng đến với Magento SE. Nếu bạn có ý kiến ​​về các câu trả lời khác, vui lòng sử dụng liên kết "thêm nhận xét" để làm như vậy. Vui lòng viết câu trả lời dựa trên câu trả lời nhiều nhất có thể và đừng dựa vào các câu trả lời khác. Các câu trả lời khác có thể bị xóa hoặc có thể "biến mất" đến các khu vực thấp hơn của trang.
7ochem

@ 7ochem xin lỗi, nó nói tôi chưa được phép bình luận, đó là lý do tại sao tôi làm như thế này, tôi sẽ sử dụng những bình luận thích hợp trong tương lai. :)
Wesley Vestjens 04/12/2016

Tôi đã có mô-đun và bạn có thể vui lòng hướng dẫn cách sử dụng chức năng của bạn trong mô-đun hiện tại của tôi không? VÀ tôi sẽ nói, bạn giải thích là tốt nhất mà tôi cần phải thực hiện trong mô-đun của tôi. Cảm ơn
Sharma

Xin chào Sharma, thật khó để nói chính xác mà không nhìn thấy mã, nhưng ý tưởng vẫn giống nhau: trong hàm tạo của bạn (cái có 2 dấu gạch dưới), thêm một đối số mới và đưa Magento \ Framework \ Registry vào khối của bạn. Sau đó, sử dụng sổ đăng ký để nhận sản phẩm như thế này: $ this-> sản phẩm = $ this-> registry-> registry ('sản phẩm');
Wesley Vestjens

1
Đăng ký không được chấp nhận và phương pháp của @ rafael-Corrêa-gomes phải được sử dụng thay thế.
Barshe Ferreboeuf

5

Nếu bạn đang sử dụng Magento 2.1 hoặc chính, bạn có thể sử dụng helperphương pháp này vì phương pháp cũ không được dùng nữa.

...
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

@Wesley Giải pháp Vestjens cũng làm việc cho tôi. Chỉ cần đảm bảo chú ý đến công cụ sửa đổi truy cập, vì riêng tư có thể không phải là điều bạn muốn nếu bạn đang sử dụng getProduct()trong mẫu của mình. Trong ví dụ trên, nó hoạt động như getProductName()là phương thức công khai để sử dụng.


Nói chung, không nên cung cấp toàn bộ các đối tượng cho một mẫu mà thay vào đó truyền dữ liệu mà nó yêu cầu và không có gì hơn. Đó là lý do tại sao getProduct()là riêng tư và getProductName()là công khai. Trong các phiên bản Magento mới hơn (2.2 / 2.3 trở đi), các phương thức này cũng được coi là không dùng nữa và nên sử dụng Mô hình xem thay thế.
Wesley Vestjens 23/03/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.