Як отримати поточний продукт у Magento2?


15

Я намагаюся отримати атрибути поточного продукту в блоці в Magento 2. Я можу отримати продукт, наприклад id 1:

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

Я не знаю, як отримати ідентифікатор поточного продукту. Як це зробити?


Ви можете викликати функцію getProduct()вMagento\Catalog\Block\Product\View
xanka

де ти хочеш отримати поточний продукт?
Аміт Бера

Я додаю модуль для відображення специфікацій (атрибутів) продукту на вкладці на сторінці продукту. Проблема вирішена за допомогою $ block-> getProduct () за відповідь від Рахіля Пателя.
Тім Трампедах

Перевірте нижче посилання mageplaza.com/how-get-current-product-category-magento-2.html Ви можете отримати поточний продукт за допомогою реєстру. Спасибі !!
Mukesh Prajapati

Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Джай

Відповіді:


11

Для отримання поточного продукту одним із рекомендованих способів є:

  1. Продовжити або використовувати блок класу: Magento\Catalog\Block\Product\View\AbstractView.
  2. Отримайте продукт за допомогою: $block->getProduct()у вашому файлі phtml.

6
Або ви можете спробувати цей $ this -> _ coreRegistry-> register ('product'); так само!!
Рахіль Патель

№2 працює дуже добре. Не знаю, чому я не міг цього зрозуміти. Спасибі за вашу допомогу!
Тім Трампедах

Чи можете ви допомогти мені отримати помилку в load (), щоб отримати продукт product $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> завантаження ($ productId);
Сушівам

@SachinS Будь ласка, надайте більше деталей, щоб я міг вам допомогти.
Рахіль Патель

2
AbstractView починається з великої літери Magento \ Каталог \ Блок \ Продукт \ Перегляд \ AbstractView
Патрік ван Берген

29

Хоча інші відповіді правильні, вони також не є рекомендованим / правильним рішенням.

Використання ObjectManager абсолютно заборонено в Magento 2. Тому, будь ласка, не покладайтеся на це рішення, а використовуйте належний DI для досягнення цього. Щоб дізнатися, як використовувати DI в Magento 2, дивіться цей ресурс: 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. Якщо у вас є коментарі щодо інших відповідей, будь ласка, скористайтеся посиланням "Додати коментар", щоб зробити це. Будь ласка, напишіть відповідь, яка стоїть самостійно якомога більше і не покладайтеся на інші відповіді. Інші відповіді можуть бути видалені або можуть "зникнути" в нижчих регіонах сторінки.
7оч.

@ 7ochem вибачте, він сказав, що я ще не дозволяв коментувати, тому я зробив це так, я буду використовувати належні коментарі в майбутньому. :)
Веслі Вестєнс

У мене вже є модуль, і ви можете, будь ласка, вказувати, як використовувати вашу функцію в моєму поточному модулі? І я б сказав, вам найкраще пояснення, яке мені потрібно реалізувати у своєму модулі. Спасибі
Шарма

Привіт Шарма, важко сказати точно, не бачачи коду, але ідея залишається такою ж: у своєму конструкторі (той, який має дві підкреслення) додайте новий аргумент і введіть Magento \ Framework \ Registry у свій блок. Потім скористайтеся реєстром, щоб отримати такий продукт: $ this-> product = $ this-> register-> register ('product');
Веслі Вестєнс

2
Реєстр застарілий, а замість нього слід використовувати метод @ 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 і вище) ці методи також вважаються застарілими, а замість них слід використовувати Моделі перегляду.
Веслі Вестєнс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.