Вкладка "Мой пользовательский продукт" не отображается в Magento 2
Я пытаюсь вставить свою вкладку "Пользовательский продукт" в витрину магазина на странице просмотра продукта, но она не отображается. Для этого я пишу ниже код.
Registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Test_ProductTabs',
__DIR__
);
Test/ProductTabs/Block/CustomTab.php
<?php
namespace Test\ProductTabs\Block;
use Magento\Catalog\Model\Product;
class CustomTab extends \Magento\Framework\View\Element\Template{
/**
* @var Product
*/
protected $_product = null;
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry = null;
/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Framework\Registry $registry,
array $data = []
) {
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
/**
* @return Product
*/
public function getProduct()
{
if (!$this->_product) {
$this->_product = $this->_coreRegistry->registry('product');
}
return $this->_product;
}
}
Test/ProductTabs/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Test_ProductTabs" setup_version="1.0.0">
<sequence>
<module name="Magento_Catalog"/>
</sequence>
</module>
</config>
Test/ProductTabs/view/layout/catalog_product_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.details">
<block class="Test\ProductTabs\Block\CustomTab" name="mycustom.tab" as="mycustom" template="Test_ProductTabs::kit.phtml" group="detailed_info">
<arguments>
<argument name="title" translate="true" xsi:type="string">Kit Components</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
Тест/Вкладки продуктов/просмотр/шаблоны/kit.phtml
<h1>Kit Components</h1>
Приведенный выше код не работает для меня. Есть какая-нибудь помощь в этом?
7 answers
Попробуйте сделать это в файле макета
<referenceBlock name="product.info.details">
<block class="Magento\Catalog\Block\Product\View" name="mycustom.tab" as="mycustom" template="Test_ProductTabs::kit.phtml" group="detailed_info">
<arguments>
<argument translate="true" name="title" xsi:type="string">Kit Components</argument>
</arguments>
</block>
</referenceBlock>
Все сведения, связанные с продуктом, доступны в Magento\Catalog\Block\Product\View
, поэтому нет необходимости создавать пользовательский блок для получения сведений о продукте.
Обновление
Неверное расположение файла макета! это должно быть
Test/ProductTabs/view/frontend/layout/catalog_product_view.xml
Ваш код в порядке, просто простая ошибка, вы сделали две ошибки
Пожалуйста, измените имя файла
catalog_product_view_.xml
До
catalog_product_view.xml
Измените макет интерфейса и расположение файла tempplate
Test/ProductTabs/view/layout/catalog_product_view_.xml
До
Test/ProductTabs/view/frontend/layout/catalog_product_view.xml
Изменить расположение файла шаблона
Test/ProductTabs/view/templates/kit.phtml
До
Test/ProductTabs/view/frontend/templates/kit.phtml
Я думаю, что лучший способ сделать это - следовать тому же подходу, который Magento использует для добавления атрибута description
в качестве одной из вкладок на странице сведений о продукте.
Сначала создайте свой атрибут, допустим, это tech_spec
и добавьте его в любой набор атрибутов, который вы хотите, чтобы я мог обновляться со страницы "Управление продуктами".
Затем создайте/обновите свое приложение\код[Пространство имен][Имя модуля]\view\frontend\layout\catalog_product_view.xml файл с помощью:
<referenceBlock name="product.info.details">
<block class="Magento\Catalog\Block\Product\View\Description" name="product.info.tech.spec" template="product/view/attribute.phtml" group="detailed_info">
<arguments>
<argument name="at_call" xsi:type="string">getTechSpec</argument>
<argument name="at_code" xsi:type="string">tech_spec</argument>
<argument name="css_class" xsi:type="string">tech-spec</argument>
<argument name="at_label" xsi:type="string">none</argument>
<argument name="title" translate="true" xsi:type="string">Technical Specification</argument>
</arguments>
</block>
</referenceBlock>
В качестве альтернативы, если вы не хотите добавлять атрибут, вы можете вместо этого добавить шаблон.
<referenceBlock name="product.info.details">
<block class="Magento\Catalog\Block\Product\View" name="product.info.tech.spec" template="Magento_Catalog::product/view/tech-spec.phtml" group="detailed_info" >
<arguments>
<argument translate="true" name="title" xsi:type="string">Technical Specification</argument>
</arguments>
</block>
</referenceBlock>
Попробуйте этот код компоновки:
<referenceContainer name="content">
<referenceBlock name="product.info.details">
<block class="Test\ProductTabs\Block\CustomTab" name="customtab_display" template="template="Test_ProductTabs::kit.phtml" group="detailed_info">
<arguments>
<argument translate="true" name="title" xsi:type="string">Kit Components</argument>
</arguments>
</block>
</referenceBlock>
</referenceContainer>
Я добавляю свои открытия в качестве нового ответа, чтобы он был лучше виден и мог быть одобрен. Действительно, были некоторые ошибки в именовании файлов/структуре папок. Но этого недостаточно...
TL; ДР :
- Добавьте значение
sort_order
в свой блок вкладок:<argument name="sort_order" xsi:type="string">99</argument>
- Убедитесь, что это
sort_order
значение УНИКАЛЬНО среди других вкладок - Выполнить
php bin/magento indexer:reindex
иphp bin/magento cache:clear
Причины, по которым :
Все происходит в \Magento\Catalog\Block\Product\View\Details::getGroupSortedChildNames()
- Если вы хотите, чтобы ваша вкладка была вытянута
getGroupChildNames()
, вам необходимо переиндексировать , прежде чем (php bin/magento indexer:reindex
) -
getGroupSortedChildNames()
метод выполняет сортировку по вкладкам с использованием значений блоковsort_order
. Еслиsort_order
не найдено, резервным вариантом будет0
. Если несколько блоков вкладок определены безsort_order
, последний из них, который будет указан0
, заменит все предыдущие вкладки в конечном отсортированном массиве вкладок. В моем случае последней была вкладка из модуля Mageplaza_Faq...
Я надеюсь, что это помешает другим людям потянуть их за волосы на пару часов, как это сделал я.
Сначала перейдите в панель администратора вашего магазина Magento, а затем перейдите к Магазины -> Товар. Нажмите "Добавить новый атрибут" и создайте новый атрибут. (Установите метку атрибута ДЕМО и код атрибута демо)
Теперь перейдите в раздел Магазины ->Набор атрибутов и добавьте набор атрибутов.
Теперь нажмите на свой набор атрибутов и перетащите неназначенный атрибут (который вы создали на первом шаге) в Сведения о продукте и нажмите Сохранить.
Теперь перейдите на страницу редактирования вашего продукта в панели администратора и измените имя атрибута и имя шаблона, которые вы создали на первом и втором шаге.
В app/code/Test/ProductTabs/etc/module.xml вставьте этот код.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Test_ProductTabs" setup_version="1.0.0"></module>
</config>
- В app/code/Test/ProductTabs/registration.php , вставьте этот код.
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Test_ProductTabs',
__DIR__
);
- В app/code/Test/ProductTabs/view/frontend/layout/catalog_product_view.xml , вставьте этот код.
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.details">
<block class="Magento\Catalog\Block\Product\View" name="demo.tab" template="Test_ProductTabs::custom_tab.phtml" group="detailed_info" >
<arguments>
<argument translate="true" name="title" xsi:type="string">Custom Tab</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
- Теперь в приложение/код/Тест/Вкладки продуктов/просмотр/интерфейс/шаблоны/custom_tab.phtml вставьте этот код.
<?php
$product = $block->getProduct();
?>
<h1 style="color: #00aeed"><?php echo $product->getData('demo'); ?></h1>
- Теперь откройте страницу вашего продукта.
Я следую инструкциям по созданию пользовательской вкладки. И отображается вкладка. Теперь вкладка отображается на каждой странице продукта. Даже если атрибута нет в наборе атрибутов.
"пользовательская вкладка" включена "Неприсвоенные атрибуты"для " набор атрибутов по умолчанию".
"пользовательская вкладка" находится в разделе "Присвоенные атрибуты" для набора атрибутов "att_set1".
'пользовательская вкладка' включена 'Неприсвоенные атрибуты'для 'att_set2' набор атрибутов
Все еще " пользовательская вкладка " отображается на всех страницах продукта?
Нужно ли мне что-то еще менять?