Magento2에서 현재 제품을 얻으려면 어떻게해야합니까?


15

Magento 2의 블록에서 현재 제품의 속성을 검색하려고합니다. id 1과 같은 제품을 얻을 수 있습니다.

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

그래도 현재 제품의 ID를 얻는 방법을 모르겠습니다. 어떻게합니까?


u는 함수를 호출 할 수 getProduct()Magento\Catalog\Block\Product\View
xanka

현재 제품을 어디서 구하고 싶습니까?
Amit Bera

제품 페이지의 탭에 제품 사양 (속성)을 표시하는 모듈을 추가하고 있습니다. Rahil Patel의 답변 당 $ block-> getProduct ()를 통해 문제가 해결되었습니다.
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()phtml 파일에서 다음을 사용하여 제품을 가져 옵니다.

6
아니면 이것을 시도해보십시오 $ this-> _ coreRegistry-> registry ( 'product'); 게다가!!
Rahil Patel

# 2는 매우 잘 작동합니다. 내가 왜 그것을 알아낼 수 없었는지 모르겠습니다. 당신의 도움을 주셔서 감사합니다!
Tim Trampedach

제품 ID를 얻기 위해 load ()에서 오류가 발생하도록 도와 줄 수 있습니까? $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> 만들기 ( 'Vendor \ Module \ Model \ Queue')-> load ($ productId);
Sushivam

@SachinS 자세한 정보를 제공해 주시면 도와 드리겠습니다.
Rahil Patel

2
추상보기 자본 젠토 \ 카탈로그 \ 블록 \ 제품 \보기 \ 추상보기 시작
패트릭 반 베르겐

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 이상)에서는 이러한 방법이 더 이상 사용되지 않는 것으로 간주되며 대신 모델보기를 사용해야합니다.
Wesley Vestjens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.