Удалить контейнер в классе блоков


Я хочу удалить некоторые элементы со страницы, когда применяются определенные условия. У меня есть решение, но мне интересно, нет ли лучшего способа сделать это.

Теперь у меня есть код для каждого блока, который я хочу удалить:

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

Кто-нибудь знаю, как удалить контейнеры со страницы макета в классе блоков, спасибо.

Author: Arno Vande Cappelle, 2019-07-09

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();

 2
Author: Mohit Rane, 2019-07-09 10:27:49