Как условно добавить блок (в зависимости от конфигурации в админ-панели) в макет Magento XML?
Мы можем проверить, является ли config верным для действий. В приведенном ниже примере, если sample/config/show_toplinks
config из панели администратора (в System-> Configuration) имеет значение true , тогда файл шаблона links.phtml
будет использоваться для визуализации Top Links. Если sample/config/show_toplinks
это ложь , то будет использоваться шаблон по умолчанию.
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
</reference>
Я нашел этот обходной путь где-то в сети. Мы можем установить пустой шаблон в качестве шаблона по умолчанию для Top Links, например так:
<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
будет использоваться и будет отображаться Top Links. но если sample/config/show_toplinks
это ложь , то empty_template_for_links.phtml
шаблон будет использоваться , и этот шаблон полностью пуст, поэтому он не возвращает HTML и Top ссылка не будет видна.
- Есть ли другой способ условно показать или скрыть блоки в зависимости от конфигурации в админ-панели?
- Этот обходной путь безопасен?
- Может ли это привести к неожиданным ошибкам?
РЕДАКТИРОВАТЬ:
Исходя из всех ответов, я думаю, что решение Рика Койперса выглядит наиболее удобным для моего случая. Но у меня есть еще один связанный вопрос:
<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,
это влияет на производительность ? Только некоторые из блоков будут действительно отображаться (это зависит от настроек пользователя в System -> Config), но мне нужно добавить все эти блоки, прежде чем я добавлю их внутрь <reference name="footer">...</reference>
.
Magento мгновенно обрабатывает все добавленные блоки, как это?
<block type="core/template" name="my_block" template="my/block.phtml" />
Или блоки обрабатываются, только если они должны быть окончательно отображены в шаблоне? Так будет ли Magento обрабатывать все мои 50 блоков, несмотря на то, что нужно отображать только некоторые из этих блоков?
my_block
внутри «головы», или он добавит еще одну копию этого блока внутри «головы», и первая копия все равно будет отображаться где-то еще (как блок уже был добавлен ранее<reference name="head">
)? 2. В каком файле PHP я могу найти все эти методы компоновки, такие как "append" или "unsetChild"?<reference name="root">
(или любом другом неcore/text_list
блоке), то оно не будет автоматически отображаться, если оно не вызываетсяgetChildHtml()
. Он не будет перемещать блок, он будет копией, поэтому вы можете добавить его несколько раз.<action>
вызывает метод в блоке. Так что это зависит от того, о каком блоке мы говорим. Вы можете найти несколько стандартных вMage_Core_Block_Abstract
. Но любой метод, принадлежащий блоку, может быть вызван с помощью<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
даже если он не будет окончательно отображен.Использование
_template
свойства для скрытия вывода является новым подходом. Я бы предпочел обратить значения в опции config так, чтобы Yes = 0 (возможно, пользовательская исходная модель), и вызватьunsetChild
родительский головной блок:источник
Top Links: [enable/disable]
на что-то подобноеHide Top Links: [Yes/No]
.Что касается ваших вопросов:
Мой метод только расширяет ваш
Я не могу понять, почему это не будет
Опять же, ваш код довольно безопасен для методов, которые не будут вызывать исключения (например
getStoreConfig
, просто будут возвращать ложные значения, поэтому ваш условный дескриптор не будет добавлен), но вы получите исключение, если пустой файл шаблона не существует. Используйте самозакрывающийся тег для передачи пустого значения (например<template />
)Если бы я разрабатывал это, я бы расширил ваше решение, включив в него наблюдателя, который проверяет конфигурацию и условно добавляет дескриптор в ваш макет. Затем в файле макета вы можете установить оба действия в разных дескрипторах
default
иshow_toplinks
И тогда в вашей
Observer
модели ...Аааа наконец в твоем макете
источник