Warunkowo pokaż / ukryj bloki w układzie XML

32

Jak warunkowo dodać blok (w zależności od konfiguracji w panelu administracyjnym) w układzie XML Magento?

Możemy sprawdzić, czy config jest prawdziwy dla akcji. W poniższym przykładzie, jeśli sample/config/show_toplinkskonfiguracja z panelu administracyjnego (w System-> Konfiguracja) jest prawdziwa , plik szablonu links.phtmlzostanie użyty do renderowania Górnych łączy. Jeśli sample/config/show_toplinksma wartość false , zostanie użyty szablon domyślny.

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

Znalazłem to obejście gdzieś w sieci. Możemy ustawić pusty szablon jako domyślny szablon dla Top Links, w następujący sposób:

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

W takim przypadku, jeśli sample/config/show_toplinksjest to prawda , szablon links.phtmlzostanie użyty i zostaną wyświetlone Górne łącza. ale jeśli sample/config/show_toplinksjest to fałsz , empty_template_for_links.phtmlszablon zostanie użyty, a szablon będzie całkowicie pusty, więc nie zwróci żadnego kodu HTML, a górne linki nie będą widoczne.

  1. Czy istnieje inny sposób warunkowego pokazywania lub ukrywania bloków w zależności od konfiguracji w panelu administracyjnym?
  2. Czy to obejście jest bezpieczne?
  3. Czy może to powodować nieoczekiwane błędy?

EDYTOWAĆ:

Na podstawie wszystkich odpowiedzi uważam, że rozwiązanie Ricka Kuipersa wygląda najwygodniej w moim przypadku. Ale mam inne powiązane pytanie:

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

Jeśli mam wiele bloków do dodania w ten sposób (przy użyciu appendmetody i ifconfig), powiedzmy 50, czy to wpływa na wydajność ? Tylko niektóre bloki będą naprawdę wyświetlane (to zależy od ustawień użytkownika w Systemie -> Konfiguracja), ale muszę dodać wszystkie te bloki, zanim warunkowo je dołączę <reference name="footer">...</reference>.

Czy Magento natychmiast przetwarza wszystkie dodane bloki w ten sposób?

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

Czy bloki są przetwarzane tylko wtedy, gdy muszą zostać ostatecznie wyświetlone w szablonie? Czy więc Magento będzie musiało przetworzyć wszystkie moje 50 bloków, mimo że tylko niektóre z tych bloków muszą zostać wyświetlone?

zitix
źródło

Odpowiedzi:

28

Chciałbym dodać moją opcję zamiast odpowiedzi benmarków.

Moje podejście polega na użyciu operacji dołączania:

    <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>
Rick Kuipers
źródło
1
Może to mieć zastosowanie w niektórych przypadkach (co początkowo było moim zdaniem), jednak w tym przypadku dany blok ( top.links ) jest domyślnie wywoływany z rdzenia.
benmarks
@benmarks ah masz na myśli to, że masz modułowość? Wtedy twoje podejście byłoby najlepszym podejściem w tym przypadku.
Rick Kuipers
1
@RickKuipers 1. Czy możesz wyjaśnić, jak działa ta metoda „append”? Czy przeniesie się my_blockdo „głowy”, czy doda kolejną kopię tego bloku do „głowy”, a pierwsza kopia będzie nadal wyświetlana gdzie indziej (jak wcześniej blok był już dodawany <reference name="head">)? 2. W którym pliku PHP mogę znaleźć wszystkie te metody układu, takie jak „append” lub „unsetChild”?
zitix
1
@zitix Jeśli definicja bloku znajduje się w <reference name="root">(lub innym niebloku core/text_list), to nie zostanie wyświetlona automatycznie, chyba że zostanie wywołana przez getChildHtml(). Nie przenosi bloku, będzie kopią, dzięki czemu można go wielokrotnie dodawać. <action>wywołuje metodę w bloku. To zależy od tego, o którym bloku mówimy. Możesz znaleźć kilka standardowych w Mage_Core_Block_Abstract. Ale każdą metodę będącą własnością bloku można wywołać za pomocą <action>.
Rick Kuipers
@RickKuipers A jak ta metoda wpływa na wydajność? (Zredagowałem moje pytanie) Blok musi zostać dodany, <block type="core/template" name="my_block" template="my/block.phtml" />nawet jeśli nie zostanie w końcu wyświetlony.
zitix
15

Zastosowanie _templatewłaściwości do ukrywania danych wyjściowych jest nowatorskim podejściem. Wolałbym odwrócić wartości w opcji config, aby Tak = 0 (być może niestandardowy model źródłowy) i wywołać unsetChildnadrzędny blok główny :

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>
zalety
źródło
1
Dziękuję, jest to bardzo dobre, ale wymaga odwrócenia wszystkich pól konfiguracji w Systemie -> Konfiguracja. Musiałbym się zmienić: Top Links: [enable/disable]na coś takiego Hide Top Links: [Yes/No].
zitix
1
Modele źródłowe konfiguracji systemu są niezwykle łatwe, a ścieżka ta jest o wiele mniej skomplikowana niż dodanie niestandardowego uchwytu aktualizacji układu za pośrednictwem obserwatora.
benmarks
12

Co do twoich pytań:

  1. Moja metoda rozszerza się na twoją

  2. Nie rozumiem, dlaczego tak nie byłoby

  3. Ponownie, twój kod jest dość bezpieczny w stosunku do metod, które nie spowodują wyjątków ( getStoreConfigna przykład, po prostu zwrócą wartości fałszowania, więc twój uchwyt warunkowy nie zostanie dodany), ale otrzymasz wyjątek, jeśli pusty plik szablonu nie istnieje. Użyj tagu samozamykającego, aby przekazać pustą wartość (np. <template />)

Gdybym to rozwijał, rozszerzyłbym twoje rozwiązanie o obserwatora, który sprawdza konfigurację i warunkowo dodaje uchwyt do twojego układu. Następnie w pliku układu możesz ustawić obie akcje w różnych uchwytach defaultishow_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>

A potem w twoim Observermodelu ...

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

Aaa i wreszcie w twoim układzie:

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

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>
mpw
źródło
Dziękuję, nie wiedziałem o tym, na pewno będę korzystać z tej metody w przyszłości. Ale do tego, co muszę teraz zrobić, wymaga zbyt wiele dodatkowego kodu.
zitix