Умовно показати / приховати блоки в макеті XML


32

Як умовно додати блок (залежно від конфігурації на панелі адміністратора) у макеті XML макета Magento?

Ми можемо перевірити, чи конфігурація вірна для дій. У наведеному нижче прикладі, якщо sample/config/show_toplinksконфігурація з панелі адміністратора (у системі-> Конфігурація) є правдою , то файл шаблону links.phtmlбуде використовуватися для візуалізації верхніх посилань. Якщо sample/config/show_toplinksце брехня , то буде використовуватися шаблон за замовчуванням.

<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це брехня , то empty_template_for_links.phtmlшаблон буде використовуватися , і цей шаблон повністю порожній, тому він не повертає HTML і Top посилання не буде видно.

  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 блоків, незважаючи на те, що потрібно відображати лише деякі з цих блоків?

Відповіді:


28

Я хотів би додати свій варіант на відміну від відповіді орієнтирів.

Мій підхід полягає у використанні додавання дії:

    <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>

1
Це може застосовуватися в певних випадках (і це було початковою моєю думкою), однак у цьому випадку відповідний блок ( top.links ) викликається за замовчуванням з ядра.
орієнтири

@benmarks ах, ви маєте на увазі, щоб мати його модульним? Тоді ваш підхід був би найкращим у цьому випадку.
Рік Куйперс

1
@RickKuipers 1. Чи можете ви уточнити, як працює цей метод "додавання"? Чи буде він переміщуватися my_blockвсередину "head", чи додасть іншу копію цього блоку всередині "head", і перша копія все ще буде відображатися десь в іншому місці (як блок вже додавались раніше <reference name="head">)? 2. У якому PHP-файлі я можу знайти всі ті способи компонування, як-от "додавати" чи "невстановити дітя"?
zitix

1
@zitix Якщо визначення блоку знаходиться у <reference name="root">(або будь-якому іншому неблоковому core/text_list), воно не відображатиметься автоматично, якщо його не викликає getChildHtml(). Він не перемістить блок, це буде копія, щоб ви могли додавати його кілька разів. <action>викликає метод у блоці. Тож залежить від того, про який блок ми говоримо. Ви можете знайти кілька стандартних в Mage_Core_Block_Abstract. Але будь-який метод, що належить блоку, можна викликати за допомогою <action>.
Рік Куйперс

@RickKuipers І як цей метод впливає на продуктивність? (Я відредагував своє запитання) Блок потрібно додати, <block type="core/template" name="my_block" template="my/block.phtml" />навіть якщо він остаточно не відображатиметься.
zitix

15

Використання _templateвластивості для приховування результатів є новим підходом. Я вважаю за краще зворотні значення параметра config, щоб так = 0 (можливо, власна модель джерела) та дзвонити unsetChildна батьківський головний блок:

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

1
Дякую, це дуже добре, але для цього потрібно інвертувати всі конфігураційні поля в Системі -> Налаштувати. Мені потрібно було б змінити: Top Links: [enable/disable]на щось подібне Hide Top Links: [Yes/No].
zitix

1
Вихідні моделі для конфігурації системи неймовірно прості, і цей шлях набагато менш складний, ніж додавання користувальницької ручки оновлення макета за допомогою спостерігача.
орієнтири

12

Щодо Ваших питань:

  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>

Дякую, я цього не знав, я точно буду використовувати цей метод у майбутньому. Але для того, що мені зараз потрібно зробити, він вимагає занадто багато додаткового коду.
zitix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.