如何在Magento2中获得当前产品?


15

我正在尝试在Magento 2的一个块中检索当前产品的属性。我可以获得一个产品,例如ID 1:

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

我不知道如何获取当前产品的ID。我怎么做?


您可以getProduct()Magento\Catalog\Block\Product\View
xanka '16

您想从哪里获得最新产品?
阿米特·贝拉

我要在产品页面的标​​签中添加一个模块来显示产品的规格(属性)。通过Rahil Patel的每个答案$ block-> getProduct()解决问题。
Tim Trampedach '16

请检查以下链接mageplaza.com/how-get-current-product-category-magento-2.html您可以使用注册表获取当前产品。谢谢 !!
Mukesh Prajapati

尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。- 来自评论
Jai

Answers:


11

为了获得当前产品,推荐的方法之一是:

  1. 扩展或使用块类:Magento\Catalog\Block\Product\View\AbstractView
  2. 使用:$block->getProduct()在您的phtml文件中获取产品。

6
或者您可以尝试使用此$ this-> _ coreRegistry-> registry('product'); 以及!!
Rahil Patel

#2运作良好。不知道为什么我自己不知道。谢谢你的帮助!
Tim Trampedach'2

您能帮我得到load()中的错误以获得产品ID $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ currentproduct = $ objectManager-> create('Vendor \ Module \ Model \ Queue')-> load($ productId);
Sushivam '16

@SachinS请提供更多详细信息,以便我可以为您提供帮助。
拉希尔·帕特尔

2
AbstractView以大写字母A Magento \ Catalog \ Block \ Product \ View \ AbstractView开头
Patrick van Bergen

29

尽管其他答案是正确的,但它们也不是推荐/正确的解决方案。

Magento 2中绝对禁止使用ObjectManager。因此,请不要依赖于此解决方案,而应使用适当的DI来实现。要了解如何在Magento 2中使用DI,请参见以下资源: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表示歉意,它说我还没有被允许评论,所以这就是我这样做的原因,以后我会使用适当的评论。:)
Wesley Vestjens

我已经有了模块,您能在当前模块中指导如何使用您的功能吗?我会说,您的解释是我需要在我的模块中实现的最好的解释。感谢
Sharma

嗨,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

@Wesley Vestjens解决方案也为我工作。只需确保注意访问修饰符,因为getProduct()在模板中使用private可能不是您想要的。在上面的示例中,它像getProductName()使用的公共方法一样工作。


通常建议不要将整个对象都提供给模板,而应传递其所需的数据,仅此而已。这就是为什么getProduct()私有和getProductName()公开的原因。在较新的Magento版本(2.2 / 2.3及更高版本)中,这些方法也被视为已弃用,而应改用View模型。
Wesley Vestjens
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.