Удалить контейнер в классе блоков
Я хочу удалить некоторые элементы со страницы, когда применяются определенные условия. У меня есть решение, но мне интересно, нет ли лучшего способа сделать это.
Теперь у меня есть код для каждого блока, который я хочу удалить:
protected function _toHtml() {
if ($condition) {
return '';
}
return parent::_toHtml();
}
Теперь мне было интересно, есть ли способ удалить контейнер из файла макета вместо того, чтобы делать это для каждого блока внутри одного контейнера. Я пробовал что-то подобное, но это не работает:
protected function _toHtml() {
if ($condition) {
$this->getLayout()->removeOutputElement('container.name.in.layout');
return '';
}
return parent::_toHtml();
}
Кто-нибудь знаю, как удалить контейнеры со страницы макета в классе блоков, спасибо.
1 answers
Вы можете попробовать что-то вроде этого,
$myXml = '<referenceContainer name="container.name.in.layout" remove="true"/>';
$layout = $this->getLayout();
$layout->getUpdate()->addUpdate($myXml);
$layout->generateXml();
Или вы можете вызвать класс наблюдателя для события
layout_generate_blocks_before
и добавить приведенный ниже код в observer
$layout = $observer->getLayout();
$block = $layout->getBlock('container.name.in.layout');
if ($block) {
//you can apply or add you condition here.
$layout->unsetElement('container.name.in.layout');
}
Первый код также работает в Observer, просто нужно изменить эту строку $layout = $this->getLayout();
чтобы $layout = $observer->getLayout();