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_toplinks
konfiguracja z panelu administracyjnego (w System-> Konfiguracja) jest prawdziwa , plik szablonu links.phtml
zostanie użyty do renderowania Górnych łączy. Jeśli sample/config/show_toplinks
ma 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_toplinks
jest to prawda , szablon links.phtml
zostanie użyty i zostaną wyświetlone Górne łącza. ale jeśli sample/config/show_toplinks
jest to fałsz , empty_template_for_links.phtml
szablon 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.
- Czy istnieje inny sposób warunkowego pokazywania lub ukrywania bloków w zależności od konfiguracji w panelu administracyjnym?
- Czy to obejście jest bezpieczne?
- 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 append
metody 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?
my_block
do „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”?<reference name="root">
(lub innym nieblokucore/text_list
), to nie zostanie wyświetlona automatycznie, chyba że zostanie wywołana przezgetChildHtml()
. 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 wMage_Core_Block_Abstract
. Ale każdą metodę będącą własnością bloku można wywołać za pomocą<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
nawet jeśli nie zostanie w końcu wyświetlony.Zastosowanie
_template
wł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ćunsetChild
nadrzędny blok główny :źródło
Top Links: [enable/disable]
na coś takiegoHide Top Links: [Yes/No]
.Co do twoich pytań:
Moja metoda rozszerza się na twoją
Nie rozumiem, dlaczego tak nie byłoby
Ponownie, twój kod jest dość bezpieczny w stosunku do metod, które nie spowodują wyjątków (
getStoreConfig
na 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
default
ishow_toplinks
A potem w twoim
Observer
modelu ...Aaa i wreszcie w twoim układzie:
źródło