如何以编程方式有条件地从布局中删除块或容器



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

谢谢

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

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

<event name="layout_generate_blocks_after">
    <observer name="personalize-theme-pdp-customize" instance="YOUR_VENDORYOUR_MODULEObserverApplyThemeCustomizationObserver" />
</event>

而在YOUR_VENDOR\YOUR_MODULE\观察者\应用主题自定义观察者.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 MagentoFrameworkViewLayout $layout */
            $layout = $observer->getData('layout');
            $layout->unsetElement('product.info.main');
        }
    }
}

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

从特定页面中删除容器/块的最佳方法是为要删除容器/块的页面控制器的execute方法创建一个after插件来实现。使用此方法,只有在加载预期页面时才会执行条件。

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

最新更新