Magento2で現在の製品を入手するにはどうすればよいですか?


15

Magento 2のブロックで現在の製品の属性を取得しようとしています。ID1のような製品を取得できます。

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

しかし、現在の製品のIDを取得する方法がわかりません。それ、どうやったら出来るの?


uで関数getProduct()を呼び出すことができますMagento\Catalog\Block\Product\View
-xanka

現在の製品はどこで入手できますか?
アミットベラ

製品ページのタブに製品の仕様(属性)を表示するモジュールを追加しています。Rahil Patelの回答ごとに、$ block-> getProduct()で問題を解決しました。
ティムトランペダッハ

以下のリンクを確認してくださいmageplaza.com/how-get-current-product-category-magento-2.htmlレジストリを使用して現在の製品を取得できます。ありがとう!!
ムケシュプラジャパティ

このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- 口コミより
ジャイ

回答:


11

現在の製品を入手するための推奨される方法の1つは次のとおりです。

  1. ブロッククラスを拡張または使用しますMagento\Catalog\Block\Product\View\AbstractView
  2. 次を使用$block->getProduct()して製品を入手します:phtmlファイル。

6
または、これを試すことができます$ this-> _ coreRegistry-> registry( 'product'); 同様に!!
ラヒルパテル

#2は非常にうまく機能します。なぜ自分でそれを理解できなかったのか分かりません。ご協力いただきありがとうございます!
ティムトランペダッハ

load()でエラーを取得して製品IDを取得するのを手伝ってもらえますか$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ currentproduct = $ objectManager-> create( 'Vendor \ Module \ Model \ Queue')-> load($ productId);
Sushivam

@SachinS詳細をお知らせください。
ラヒルパテル

2
AbstractViewは大文字のA Magento \ Catalog \ Block \ Product \ View \ AbstractViewで始まります
パトリックヴァンベルゲン

28

他の答えは正しいですが、推奨/適切な解決策でもありません。

ObjectManagerの使用はMagento 2では絶対に禁止されています。したがって、このソリューションに頼るのではなく、代わりに適切な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謝罪、まだコメントすることは許可されていないと言っていたので、このようにしたので、将来は適切なコメントを使用します。:)
ウェスリーヴェストジェン16

モジュールは既にありますが、現在のモジュールで関数を使用する方法を教えてください。そして、あなたの説明は私のモジュールに実装する必要がある最高のものです。ありがとう
シャルマ

こんにちはSharma、コードを見ずに正確に言うのは難しいですが、考え方は同じままです:コンストラクター(2つのアンダースコアを持つもの)で、新しい引数を追加し、ブロックにMagento \ Framework \ Registryを注入します。次に、レジストリを使用して次のような製品を取得します。$ this-> product = $ this-> registry-> registry( 'product');
ウェスリーヴェストジェン

1
レジストリは廃止され、代わりに@rafael-corrêa-gomesのメソッドを使用する必要があります。
クリストフフェレボフ

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()テンプレートで使用している場合、プライベートはあなたが望むものではないかもしれないので、アクセス修飾子に注意してください。上記の例でgetProductName()は、使用するパブリックメソッドと同じように機能します。


通常、オブジェクト全体をテンプレートに渡すのではなく、必要なデータだけを渡すことをお勧めします。それgetProduct()がプライベートでgetProductName()パブリックな理由です。新しいバージョンのMagento(2.2 / 2.3以降)では、これらのメソッドも非推奨と見なされるため、代わりにビューモデルを使用する必要があります。
ウェスリーヴェストジェンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.