Blöcke in Layout-XML bedingt ein- / ausblenden


32

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_toplinkswird 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_toplinksist 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_toplinksist wahr , dann wird die Vorlage links.phtmlwird verwendet , und Top - Links angezeigt werden. Ist dies sample/config/show_toplinksjedoch falsch , wird die empty_template_for_links.phtmlVorlage verwendet und diese Vorlage ist vollständig leer, sodass kein HTML zurückgegeben wird und die Top-Links nicht sichtbar sind.

  1. Gibt es eine andere Möglichkeit, Blöcke abhängig von der Konfiguration im Admin-Bereich bedingt anzuzeigen oder auszublenden?
  2. Ist diese Problemumgehung sicher?
  3. 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 appendMethode 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?

Antworten:


28

Ich möchte meine Option anstelle der Antwort von benmarks hinzufügen.

Mein Ansatz ist es, die Append-Aktion zu verwenden:

    <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
Dies kann in bestimmten Fällen zutreffen (und war ursprünglich ein Gedanke von mir), in diesem Fall wird der betreffende Block ( top.links ) jedoch standardmäßig vom Core aus aufgerufen.
benmarks

@benmarks ah du meinst, um es modular zu haben? Dann wäre Ihr Ansatz in diesem Fall der beste.
Rick Kuipers

1
@RickKuipers 1. Können Sie klären, wie diese Methode zum Anhängen funktioniert? Bewegt es sich my_blockinnerhalb 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?
zitix

1
@zitix Befindet sich die Blockdefinition im <reference name="root">(oder in einem anderen Nicht- core/text_listBlock), wird sie nur dann automatisch angezeigt, wenn sie von aufgerufen wird getChildHtml(). 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 finden Mage_Core_Block_Abstract. Aber jede Methode, die dem Block gehört, kann mit aufgerufen werden <action>.
Rick Kuipers

@ RickKuipers Und wie wirkt sich diese Methode auf die Leistung aus? (Ich habe meine Frage bearbeitet.) Der Block muss hinzugefügt werden, <block type="core/template" name="my_block" template="my/block.phtml" />auch wenn er nicht endgültig angezeigt wird.
zitix

15

Die Verwendung der _templateEigenschaft 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) und unsetChildden übergeordneten Kopfblock aufzurufen :

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

1
Vielen Dank, das ist sehr gut, erfordert aber das Invertieren aller Konfigurationsfelder in System -> Config. Ich müsste mich ändern: Top Links: [enable/disable]zu so etwas wie Hide Top Links: [Yes/No].
zitix

1
Quellmodelle für die Systemkonfiguration sind unglaublich einfach, und dieser Pfad ist viel einfacher als das Hinzufügen eines benutzerdefinierten Handles für die Layoutaktualisierung über Observer.
benmarks

12

Zu Ihren Fragen:

  1. Meine Methode erweitert nur Ihre

  2. Ich kann nicht verstehen, warum es nicht so wäre

  3. Auch hier ist Ihr Code ziemlich sicher hinter Methoden, die keine Ausnahmen verursachen ( getStoreConfigzum 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 defaultund festlegenshow_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>

Und dann in Ihrem ObserverModell ...

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

Aaaand endlich in Ihrem Layout:

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

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

Vielen Dank, ich wusste das nicht, ich werde diese Methode in Zukunft auf jeden Fall anwenden. Aber für das, was ich jetzt tun muss, ist zu viel zusätzlicher Code erforderlich.
Zitix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.