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

时间:2018-03-10 12:45:17

标签: layout rendering block magento2 magento2.2

如果有人希望根据某些条件从产品详细信息页面中删除product.info.main之类的容器(块),或者产品具有已分配值的属性。 那么实现这个目标的最佳方法是什么?

谢谢

2 个答案:

答案 0 :(得分:2)

我们可以使用Event Observer方法......

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');
        }
    }
}

可能......这对某人有帮助......

谢谢,

答案 1 :(得分: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;
}