Как отобразить/скрыть вкладку пользовательского продукта на странице сведений о продукте в соответствии со значением пользовательского атрибута продукта?


У меня есть пользовательский атрибут с именем "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"; ?>

Как применить условие в приведенном выше коде? Кто-нибудь может, пожалуйста, помочь?

Author: Dhwani Kothari, 2021-07-02

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>
  1
Author: ZealousWeb, 2021-07-02 05:33:53

Попробуйте следующее решение:

Создать 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>
  0
Author: madani.codes, 2021-07-02 05:53:02