Wie füge ich einen Block (abhängig von der Konfiguration im Admin-Panel) in Magentos Layout-XML bedingt hinzu?
Wir können überprüfen, ob die Konfiguration für Aktionen wahr ist. Im folgenden Beispiel sample/config/show_toplinks
wird die Vorlagendatei zum Rendern der Top-Links verwendet , wenn die Konfiguration im Admin-Bereich (unter System-> Konfiguration) wahr ist links.phtml
. Wenn sample/config/show_toplinks
ist falsch , dann wird die Standard - Vorlage verwendet werden.
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
</reference>
Ich habe diese Problemumgehung irgendwo im Web gefunden. Wir können eine leere Vorlage als Standardvorlage für Top-Links festlegen, wie folgt:
<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>
In diesem Fall, wenn sample/config/show_toplinks
ist wahr , dann wird die Vorlage links.phtml
wird verwendet , und Top - Links angezeigt werden. Ist dies sample/config/show_toplinks
jedoch falsch , wird die empty_template_for_links.phtml
Vorlage verwendet und diese Vorlage ist vollständig leer, sodass kein HTML zurückgegeben wird und die Top-Links nicht sichtbar sind.
- Gibt es eine andere Möglichkeit, Blöcke abhängig von der Konfiguration im Admin-Bereich bedingt anzuzeigen oder auszublenden?
- Ist diese Problemumgehung sicher?
- Kann dies zu unerwarteten Fehlern führen?
BEARBEITEN:
Ausgehend von allen Antworten denke ich, dass die Lösung von Rick Kuipers für meinen Fall am bequemsten ist. Aber ich habe eine andere verwandte Frage:
<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>
Wenn ich so viele Blöcke hinzufügen muss (mithilfe von append
Methode und ifconfig
), sagen wir 50,
wirkt sich das auf die Leistung aus ? Es werden nur einige der Blöcke angezeigt (dies hängt von der Benutzereinstellung in System -> Config ab), aber ich muss alle diese Blöcke hinzufügen, bevor ich sie bedingt anhängen kann <reference name="footer">...</reference>
.
Verarbeitet Magento sofort alle so hinzugefügten Blöcke?
<block type="core/template" name="my_block" template="my/block.phtml" />
Oder werden Bausteine nur verarbeitet, wenn sie in der Vorlage endgültig angezeigt werden müssen? Muss Magento also alle meine 50 Blöcke verarbeiten, obwohl nur einige dieser Blöcke angezeigt werden müssen?
my_block
innerhalb von "head" oder fügt es eine weitere Kopie dieses Blocks innerhalb von "head" hinzu und die erste Kopie wird weiterhin an einer anderen Stelle angezeigt (da der Block bereits zuvor hinzugefügt wurde<reference name="head">
)? 2. In welcher PHP-Datei kann ich all diese Layout-Methoden wie "append" oder "unsetChild" finden?<reference name="root">
(oder in einem anderen Nicht-core/text_list
Block), wird sie nur dann automatisch angezeigt, wenn sie von aufgerufen wirdgetChildHtml()
. Der Block wird nicht verschoben, sondern kopiert, sodass Sie ihn mehrmals anhängen können.<action>
ruft eine Methode im Block auf. Es kommt also darauf an, um welchen Block es sich handelt. Sie können einige Standard in findenMage_Core_Block_Abstract
. Aber jede Methode, die dem Block gehört, kann mit aufgerufen werden<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
auch wenn er nicht endgültig angezeigt wird.Die Verwendung der
_template
Eigenschaft zum Ausblenden von Ausgaben ist ein neuartiger Ansatz. Ich würde es vorziehen, die Werte in der Konfigurationsoption umzukehren, sodass Yes = 0 (möglicherweise ein benutzerdefiniertes Quellmodell) undunsetChild
den übergeordneten Kopfblock aufzurufen :quelle
Top Links: [enable/disable]
zu so etwas wieHide Top Links: [Yes/No]
.Zu Ihren Fragen:
Meine Methode erweitert nur Ihre
Ich kann nicht verstehen, warum es nicht so wäre
Auch hier ist Ihr Code ziemlich sicher hinter Methoden, die keine Ausnahmen verursachen (
getStoreConfig
zum einen werden nur falsche Werte zurückgegeben, sodass Ihr bedingter Punkt nicht hinzugefügt wird), aber Sie erhalten eine Ausnahme, wenn die leere Vorlagendatei nicht vorhanden ist. Verwenden Sie ein selbstschließendes Tag, um einen leeren Wert zu übergeben (z. B.<template />
).Wenn ich dies entwickeln würde, würde ich Ihre Lösung um einen Beobachter erweitern, der die Konfiguration überprüft und Ihrem Layout unter bestimmten Bedingungen ein Handle hinzufügt. Anschließend können Sie in Ihrer Layoutdatei beide Aktionen in verschiedenen Handles
default
und festlegenshow_toplinks
Und dann in Ihrem
Observer
Modell ...Aaaand endlich in Ihrem Layout:
quelle