Как отобразить/скрыть вкладку пользовательского продукта на странице сведений о продукте в соответствии со значением пользовательского атрибута продукта?
У меня есть пользовательский атрибут с именем "show_tab" в продуктах. У меня есть значение включения/выключения для этого продукта. Я хочу показать вкладку пользовательского продукта в соответствии со значением атрибута. Вкладка "Пользовательский продукт" успешно создана в соответствии с приведенным ниже способом. Но я не знаю, как применить условие для конкретного продукта в xml-файле?
Для начала создайте файл‘catalog_product_view.xml ’в папке приложения/код///просмотр/интерфейс/макет.
<?xml version="1.0"?>
<page layout="1column" 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="custom.tab" template="VendorName_ModuleName::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 в папке app/code///view/интерфейс/макет и добавил следующее
<?php echo "This is Custom tab in product detail page"; ?>
Как применить условие в приведенном выше коде? Кто-нибудь может, пожалуйста, помочь?
2 answers
Вам просто нужно создать для него пользовательский блок, как показано ниже. И примените свое условие, как показано ниже.
<?php
namespace VendorName\ModuleName\Block\Product;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\View\Element\Template;
class Tab extends \Magento\Framework\View\Element\Html\Link
{
/**
* @var \Magento\Framework\Registry
*/
protected $_registry;
/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param array $data
*/
public function __construct(
Context $context,
\Magento\Framework\Registry $registry,
array $data = []
) {
$this->_helper = $helper;
$this->_registry = $registry;
parent::__construct($context, $data);
}
public function _toHtml()
{
if($this->getProduct()) {
$showTab = $this->getProduct()->getShowTab();
if (!$showTab) {
return '';
}
}
return parent::_toHtml();
}
public function getProduct()
{
return $this->_registry->registry('current_product');
}
}
Теперь вызовите выше пользовательский файл блока в xml-файле в начале блока "Magento\Каталог\Блок\Продукт\Просмотр"
<?xml version="1.0"?>
<page layout="1column" 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="VendorName\ModuleName\Block\Product\Tab" name="custom.tab" template="VendorName_ModuleName::custom_tab.phtml" group="detailed_info" >
<arguments>
<argument translate="true" name="title" xsi:type="string">Custom Tab</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
Попробуйте следующее решение:
Создать events.xml в вашем модуле
[ Поставщик]/[Модуль]/etc/frontend/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="layout_load_before">
<observer name="load_custom_tab_handler" instance="[Vendor]\[Module]\Observer\LayoutLoadBefore" />
</event>
</config>
В вашем [Поставщике][Модуле]\Observer\LayoutLoadBefore.php файл, записанный ниже кода
<?php
namespace [Vendor]\[Module]\Observer;
class LayoutLoadBefore implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Framework\Registry
*/
private $registry;
public function __construct(
............
\Magento\Framework\Registry $registry,
............
) {
$this->registry = $registry;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$product = $this->registry->registry('current_product');
if (!$product) {
return $this;
}
if (!$product->getshowTab()) { // your condition
$layout = $observer->getLayout();
$layout->getUpdate()->addHandle('catalog_product_view_customtab');
}
return $this;
}
}
Криты catalog_product_view_customtab.xml
[ Поставщик][Модуль]\view\frontend\layout\catalog_product_view_customtab.xml файл, записанный ниже кода
<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="custom.tab" remove="true" />
</body>
</page>