Я пытаюсь добавить пользовательский шаблон на страницу продукта в разделе социальных сетей. В моем модуле я следующий код в файле макета 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>
содержание social.phtml
<p>Hey there !</p>
<?php //$_product = $block->getProduct();
Он работает нормально и показывает содержимое шаблона на странице продукта. Когда я использую класс блока Magento\Catalog\Block\Product\View
вместо того, Magento\Framework\View\Element\Template
чтобы я мог получить объект product в своем шаблоне $block->getProduct();
, он показывает пустую страницу.
1. Какую ошибку я здесь делаю?
2. Как лучше всего изменить страницу товара?
3. Есть ли файл справочного макета, который я могу использовать для добавления новых шаблонов в любой раздел кода макета страницы продукта в моем модуле?
$_product = $block->getProduct();
используяMagento\Catalog\Block\Product\View
блок.Ответы:
Ошибка «белой страницы» происходит потому,
Magento\Framework\View\Element\Template
что не имеютgetProduct()
метода.Поэтому я считаю, что самый «чистый» способ сделать это - создать собственный модуль с пользовательским блоком, макетом и шаблоном (не волнуйтесь, это займет всего несколько минут, и вы выполнили некоторые части)
Файлы модуля:
(Я пропущу
/etc/module.xml
иregistration.php
потому что это тривиально, однако вы можете найти полный пример здесь .)Давайте начнем с блокировки файла php:
Как видите, это всего лишь конкретный класс, расширяющий (IMO) самый легкий абстрактный блок продукта. Вы также можете расширить,
Magento\Framework\View\Element\Template
но в этом случае вам нужно будет реализоватьgetProduct()
метод и изменить контекст в конструкторе, чтобы получить доступ к реестру.Итак, давайте перейдем к файлу макета:
И, наконец, файл шаблона:
Как видите, довольно просто, проще, чем M1-
Помните, что вся ваша пользовательская логика должна быть реализована в
Extra.php
классе блоков, чтобы поддерживать чистоту представления.то есть:
источник
Дополнение к принятому ответу
Принятый ответ хорош, но
AbstractProduct
сейчас не рекомендуется .Итак, мы должны использовать
Magento\Framework\Registry
для достижения блока , пример блока ниже:источник