如果有人想根据某些条件从产品详细信息页面中删除像 product.info.main 这样的容器(块),或者产品具有分配了值的属性。那么实现这一点的最佳方法是什么?
谢谢
如果有人想根据某些条件从产品详细信息页面中删除像 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_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');
}
}
}
可能...这将有助于某人...
谢谢,
使用站点范围的事件从特定页面中删除容器/块是多余的,而不是最佳方法,因为每次页面加载都会评估您的状况,从而为所有页面增加一点开销。
从特定页面删除容器/块最好通过为要删除容器/块的页面的控制器方法创建after
插件来实现。execute
使用这种方法,您的条件仅在加载预期页面时执行。
public function afterExecute(\Magento\[Module]\Controller\[ControllerName] $subject, $result)
{
if ([your condition]) {
$result->getLayout()->unsetElement('name_of_container_or_block');
}
return $result;
}