Как я могу получить текущий продукт в 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 Вы можете получить текущий продукт, используя реестр. Благодарность !!
Мукеш Праджапати

Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из Обзора
Jai

Ответы:


11

Для того, чтобы получить текущий продукт, один из рекомендуемых способов:

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

6
Или вы можете попробовать этот реестр $ this -> _ coreRegistry-> ('product'); также!!
Рахиль Патель

# 2 работает очень хорошо. Не уверен, почему я не мог понять это сам. Спасибо за вашу помощь!
Тим Трампедах

Не могли бы вы помочь, как я получаю ошибку в load (), чтобы получить идентификатор продукта $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Сушивам

@ SachinS Пожалуйста, предоставьте более подробную информацию, чтобы я мог помочь вам.
Рахиль Патель

2
AbstractView начинается с заглавной буквы A 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 в ваш конструктор и запросите элемент реестра «product».

Пример полного кода:

<?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-> registry-> registry ('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 и выше) эти методы также считаются устаревшими, и вместо них следует использовать View Models.
Уэсли Вестьенс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.