Magento2: Додайте спеціальний шаблон на сторінку деталей продукту нижче, щоб додати до розділу кошика


10

Я намагаюся додати спеціальний шаблон на сторінку продукту в розділі соціального обміну. У своєму модулі я наступний код у файлі макета default.xml

 <body>
 <referenceContainer name="product.info.social">
  <block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
  </block>
 </referenceContainer>
</body>

content.phtml

<p>Hey there !</p>
<?php //$_product = $block->getProduct();

Це добре працює і показує вміст шаблону на сторінці продукту. Коли я використовую блок-клас Magento\Catalog\Block\Product\Viewзамість того, Magento\Framework\View\Element\Templateщоб я міг отримати об’єкт продукту у своєму шаблоні за допомогою $block->getProduct();, він показує порожню сторінку.

1. Яку помилку я роблю тут?
2. Який найкращий спосіб змінити сторінку продукту?
3. Чи є у моєму модулі файл довідкового макета, який я можу використовувати для додавання нових шаблонів до будь-якого розділу коду макета сторінки сторінки продукту?


@amiteshree може бути, ваш файл phtml включає функції, визначені в Magento \ Каталог \ Блок \ Продукт \ Переглянути блок-файл
Shaheer Ali

@ShaheerAli: У своєму файлі phtml я намагаюся отримати об'єкт продукту за $_product = $block->getProduct();допомогою Magento\Catalog\Block\Product\Viewблоку.
amitshree

Тоді чому ви призначаєте блоку Magento \ Framework \ View \ Element \ Template.
Шахер Алі

1
@amiteshree, якщо ви хочете використовувати функції перегляду продукту, тоді вам потрібно призначити Magento \ Каталог \ Блок \ Продукт \ Перегляд до вашого шаблону phtml. І ваш метод додавання користувацького шаблону на сторінку продукту правильний
Шахер Алі

1
Порожня сторінка зазвичай означає, що сталася якась помилка. Ви шукали у своєму error.log? журнал виключень magento? Який режим ви використовуєте?
Антон Криль

Відповіді:


24

Помилка "білої сторінки" виникає через те, Magento\Framework\View\Element\Templateщо немає getProduct()методу.

Тому я думаю, що "найчистіший" спосіб це зробити - це створити спеціальний модуль із спеціальним блоком, компонуванням та шаблоном (не хвилюйтесь, це займе кілька хвилин, і ви виконали деякі частини)

Файли модулів:

введіть тут опис зображення

(Я пропускаю /etc/module.xmlі registration.phpтому, що тривіально, проте ви можете знайти повний приклад тут .)

Почнемо з файлу «Заблокувати php»:

Тест \ Каталог \ Блок \ Продукт \ Перегляд \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Як бачите, це просто конкретний клас, що розширює (ІМО) найлегший блок абстрактних продуктів. Ви також можете розширити, Magento\Framework\View\Element\Templateале в цьому випадку вам потрібно буде реалізувати getProduct()метод та змінити контекст у конструкторі, щоб отримати доступ до реєстру.

Тож давайте перейдемо до файлу "Макет":

Тест / Каталог / Перегляд / frontend / layout / catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

І нарешті файл шаблону:

Тест / Каталог / Перегляд / frontend / шаблони / продукт / view / extra.phtml

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

Як бачите, це досить просто, простіше, ніж M1-

Пам'ятайте, що вся ваша власна логіка повинна бути реалізована в Extra.phpкласі блоку, щоб зберегти вигляд в чистоті.

тобто:

У класі Extra.php :

public function getSomething()
{
    return 'something'
}

у перегляді extra.phtml :

<?php echo $block->getSomething() ?>

2
Отже, макет каталогу_product_view.xml мого модуля автоматично завантажується, коли я перебуваю на сторінці продукту?
amitshree

2
Абсолютно! він дуже схожий на M1, але тепер кожна ручка знаходиться в окремому файлі.
MauroNigrele

5

Додаток до прийнятого відповіді

Прийнятий відповідь хороший, але AbstractProductце НЕ рекомендуються в даний час.

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

Отже, нам потрібно використовувати блокMagento\Framework\Registry для досягнення Блоку , зразок Блоку знаходиться нижче:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

        return $this->product;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.