Magento2'deki mevcut ürünü nasıl edinebilirim?


16

Magento 2'deki bir blokta mevcut ürünün özelliklerini almaya çalışıyorum. 1 gibi bir ürün alabilirim:

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

Mevcut ürünün kimliğini nasıl alacağımı bilmiyorum. Bunu nasıl yaparım?


u işlevini çağırabilirsiniz getProduct()içindeMagento\Catalog\Block\Product\View
xanka

Mevcut ürünü nereden almak istersiniz?
Amit Bera

Ürünün özelliklerini (niteliklerini) ürün sayfasındaki bir sekmede göstermek için bir modül ekliyorum. Rahil Patel'in cevabı başına $ block-> getProduct () ile problem çözüldü.
Tim Trampedach

Lütfen aşağıdaki bağlantıları kontrol edin mageplaza.com/how-get-current-product-category-magento-2.html Mevcut ürünü kayıt defterini kullanarak alabilirsiniz. Teşekkürler !!
Mukesh Prajapati

Bu bağlantı soruyu cevaplayabilirken, cevabın önemli kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. - Yorumdan
Jai

Yanıtlar:


11

Mevcut ürünü almak için önerilen yollardan biri:

  1. Uzatmak veya kullanım blok sınıfı: Magento\Catalog\Block\Product\View\AbstractView.
  2. $block->getProduct()Phtml dosyanızda : kullanarak ürünü alın .

6
Veya bunu $ $ -> _ coreRegistry-> kayıt defterini ('ürün') deneyebilirsiniz; de !!
Rahil Patel

# 2 çok iyi çalışıyor. Bunu neden kendim anlayamıyorum emin değilim. Yardımın için teşekkürler!
Tim Trampedach

$ ObjectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); ürün kimliğini almak için load () hatasını almamda yardımcı olabilir misiniz? $ currentproduct = $ objectManager-> create ('Satıcı \ Modül \ Model \ Kuyruk') -> yükle ($ productId);
Sushivam

@SachinS Size yardımcı olabilmemiz için lütfen daha fazla ayrıntı sağlayın.
Rahil Patel

2
AbstractView başkent A Magento \ Catalogue \ Block \ Product \ View \ ile başlıyor AbstractView
Patrick van Bergen

29

Diğer cevaplar doğru olsa da, önerilen / uygun çözüm de değildir.

Magento 2'de ObjectManager'ı kullanmak kesinlikle yasaktır. Bu yüzden lütfen bu çözüme güvenmeyin, bunun yerine bunu gerçekleştirmek için uygun DI kullanın. Magento 2'de DI'yi nasıl kullanacağınızı öğrenmek için şu kaynağa bakın: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

AbstractView öğesini genişletmek gerekli değildir. AbstractView içindeki özgün işleve bakarsanız, Magento'nun ürünü getirmek için kayıt defterini kullandığını görebilirsiniz. Bunu yapmak için belirli bir sınıfı genişletmeniz gerekmez, sadece Magento \ Framework \ Registry dosyasını yapıcıya enjekte edin ve "ürün" kayıt defteri öğesini isteyin.

Tam kod örneği:

<?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'ye hoş geldiniz. Diğer yanıtlar hakkında yorumlarınız varsa, lütfen "yorum ekle" bağlantısını kullanın. Lütfen mümkün olduğunca kendi başına duran ve diğer yanıtlara güvenmeyen bir cevap yazın. Diğer yanıtlar silinebilir veya sayfanın alt bölgelerine "kaybolabilir".
7ochem

@ 7ochem özür dilerim, henüz yorum yapmama izin verilmediğini söyledi, bu yüzden böyle yaptım, gelecekte uygun yorumları kullanacağım. :)
Wesley Vestjens

Zaten modülüm var ve fonksiyonunuzu mevcut modülümde nasıl kullanacağınızı yönlendirebilir misiniz? VE söyleyebilirim, açıklama benim modülde uygulamak gerekir en iyisidir. Teşekkürler
Sharma

Merhaba Sharma, kodu görmeden tam olarak söylemek zor, ama fikir aynı kalıyor: yapıcıya (2 alt çizgiye sahip olan), yeni bir argüman ekleyin ve bloğunuza Magento \ Framework \ Registry'yi enjekte edin. Daha sonra, ürünü bu şekilde almak için kayıt defterini kullanın: $ this-> product = $ this-> kayıt defteri-> kayıt defteri ('product');
Wesley Vestjens

2
Kayıt defteri kullanımdan kaldırılmıştır ve bunun yerine @ rafael-corrêa-gomes yöntemi kullanılmalıdır.
Christophe Ferreboeuf

6

Magento 2.1 veya majör kullanıyorsanız helper, eski yöntem kullanımdan kaldırıldığı için bunu kullanabilirsiniz .

...
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 çözümü de benim için çalıştı. Erişim düzenleyiciye dikkat ettiğinizden emin olun, çünkü özel getProduct()şablonunuzda kullanıyorsanız istediğiniz şey olmayabilir . Yukarıdaki örnekte getProductName(), kullanılacak genel yöntem olduğu gibi çalışır .


Genellikle tüm nesneleri bir şablona vermemeniz, bunun yerine ihtiyaç duyduğu verileri iletmesi ve başka bir şey yapmamanız önerilir. Bu yüzden getProduct()özel ve getProductName()herkese açık. Daha yeni Magento versiyonlarında (2.2 / 2.3 ve sonrası) bu yöntemler de kullanımdan kaldırılmış olarak kabul edilir ve bunun yerine Görünüm Modelleri kullanılmalıdır.
Wesley Vestjens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.