4

如果有人想根据某些条件从产品详细信息页面中删除像 product.info.main 这样的容器(块),或者产品具有分配了值的属性。那么实现这一点的最佳方法是什么?

谢谢

4

2 回答 2

6

我们可以使用事件观察者方法......

YOUR_VENDOR\YOUR_MODULE\etc\frontend\events.xml文件中,需要添加以下代码:

<event name="layout_generate_blocks_after">
    <observer name="personalize-theme-pdp-customize" instance="YOUR_VENDOR\YOUR_MODULE\Observer\ApplyThemeCustomizationObserver" />
</event>

YOUR_VENDOR\YOUR_MODULE\Observer\ApplyThemeCustomizationObserver.php文件中,需要添加以下代码:

public function execute(Observer $observer)
{
    $action = $observer->getData('full_action_name');
    if ($action !== 'catalog_product_view') {
        return;
    }

    $product = $this->_registry->registry('product');

    if ($product) {
        $attribute = $product->getCustomAttribute('g3d_app_url_default');
        if ($attribute && $attribute->getValue()) {
            /** @var \Magento\Framework\View\Layout $layout */
            $layout = $observer->getData('layout');
            $layout->unsetElement('product.info.main');
        }
    }
}

可能...这将有助于某人...

谢谢,

于 2018-03-12T06:58:11.467 回答
0

使用站点范围的事件从特定页面中删除容器/块是多余的,而不是最佳方法,因为每次页面加载都会评估您的状况,从而为所有页面增加一点开销。

从特定页面删除容器/块最好通过为要删除容器/块的页面的控制器方法创建after插件来实现。execute使用这种方法,您的条件仅在加载预期页面时执行。

public function afterExecute(\Magento\[Module]\Controller\[ControllerName] $subject, $result)
{
    if ([your condition]) {
        $result->getLayout()->unsetElement('name_of_container_or_block');
    }

    return $result;
}
于 2019-02-11T10:13:01.833 回答