Условно показывать/скрывать блоки в XML-формате макета


Как условно добавить блок (в зависимости от конфигурации в панели администратора) в XML-файл макета Magento?

Мы можем проверить, верна ли конфигурация для действий. В приведенном ниже примере, если sample/config/show_toplinks конфигурация из панели администратора (в Системе->Конфигурация) истинна, то файл шаблона links.phtml будет использоваться для отображения верхних ссылок. Если sample/config/show_toplinks равно false, то будет использоваться шаблон по умолчанию.

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

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

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
    
    <!-- OR set completely empty template -->
    <action method="setTemplate">
        <template>page/template/empty_template_for_links.phtml</template>
    </action>
</reference>

В этом случае, если sample/config/show_toplinks равно истинно , то будет использоваться шаблон links.phtml и будут отображаться верхние ссылки. но если sample/config/show_toplinks равно false, то будет использоваться шаблон empty_template_for_links.phtml, и этот шаблон полностью пуст, поэтому он не возвращает никакого HTML, и верхние ссылки не будут видны.

  1. Есть ли какой-либо другой способ условно показывать или скрывать блоки в зависимости от настройка в панели администратора?
  2. Безопасно ли это обходное решение?
  3. Может ли это привести к каким-либо неожиданным ошибкам?

ИЗМЕНИТЬ:

Основываясь на всех ответах, я думаю, что решение Рика Кейперса выглядит наиболее удобным для моего случая. Но у меня есть еще один связанный с этим вопрос:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <!-- ...add more blocks here -->
    
    <reference name="footer">
        <action method="append" ifconfig="sample/config/show_toplinks">
            <block>my_block</block>
        </action>
        <!-- ...append more blocks here -->
    </reference>

Если у меня есть много блоков для добавления подобным образом (с использованием метода append и ifconfig), скажем, 50, влияет ли это на производительность ? Только некоторые блоки будут действительно отображаться (это зависит от настроек пользователя в системе -> Конфигурация), но мне нужно добавить все эти блоки, прежде чем я условно добавлю их внутрь <reference name="footer">...</reference>.

Мгновенно ли Magento обрабатывает все блоки, добавленные подобным образом?

    <block type="core/template" name="my_block" template="my/block.phtml" />

Или блоки обрабатываются только в том случае, если они должны быть окончательно отображены в шаблоне? Так придется ли Magento обрабатывать все мои 50 блоков, несмотря на то, что нужно отобразить только некоторые из этих блоков?

Author: Community, 2013-05-02

3 answers

Я хотел бы добавить свой вариант в отличие от ответа Бенмарка.

Мой подход заключается в использовании действия добавления:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>
 29
Author: Rick Kuipers, 2013-05-04 12:04:20

Использование свойства _template для скрытия вывода - это новый подход. Я бы предпочел изменить значения параметра конфигурации так, чтобы Yes = 0 (возможно, пользовательская исходная модель) и вызвать unsetChild в родительском головном блоке:

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>
 15
Author: benmarks, 2014-11-28 09:48:01

Что касается ваших вопросов:

  1. Мой метод просто расширяет ваш

  2. Я не понимаю, почему бы и нет

  3. Опять же, ваш код довольно безопасен для методов, которые не будут вызывать исключений (getStoreConfig для одного, просто вернет ложные значения, поэтому ваш условный дескриптор не будет добавлен), но вы получите исключение, если пустой файл шаблона не существует. Используйте самозакрывающийся тег для передачи пустого значения (например, <template />)

Если бы я был развивая это, я бы расширил ваше решение, включив наблюдателя, который проверяет конфигурацию и условно добавляет дескриптор в ваш макет. Затем в файле макета вы можете задать оба действия внутри разных дескрипторов - default и show_toplinks

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

, А затем в вашей модели Observer...

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

Аааа и, наконец, в вашем макете:

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>
 13
Author: mpw, 2013-05-04 09:37:17