Mostra / nascondi condizionalmente blocchi nel layout XML


32

Come aggiungere condizionalmente un blocco (a seconda della configurazione nel pannello di amministrazione) nel layout XML di Magento?

Possiamo verificare se la configurazione è vera per le azioni. Nell'esempio seguente, se la sample/config/show_toplinksconfigurazione dal pannello di amministrazione (in Sistema-> Configurazione) è vera , il file modello links.phtmlverrà utilizzato per eseguire il rendering dei collegamenti principali. Se sample/config/show_toplinksè falso , verrà utilizzato il modello predefinito.

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

Ho trovato questa soluzione alternativa da qualche parte nel web. Possiamo impostare un modello vuoto come modello predefinito per i collegamenti principali, in questo modo:

<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 questo caso, se sample/config/show_toplinksè vero , links.phtmlverrà utilizzato il modello e verranno visualizzati i collegamenti principali. ma se sample/config/show_toplinksè falso , empty_template_for_links.phtmlverrà utilizzato il modello e quel modello è completamente vuoto, quindi non restituisce alcun HTML e i collegamenti principali non saranno visibili.

  1. Esiste un altro modo per mostrare o nascondere in modo condizionale i blocchi a seconda della configurazione nel pannello di amministrazione?
  2. Questa soluzione alternativa è sicura?
  3. Ciò può causare errori imprevisti?

MODIFICARE:

Sulla base di tutte le risposte, penso che la soluzione di Rick Kuipers sia la più conveniente per il mio caso. Ma ho un'altra domanda correlata:

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

Se ho molti blocchi da aggiungere in questo modo (usando il appendmetodo e ifconfig), diciamo 50, influisce sulle prestazioni ? Solo alcuni dei blocchi verranno realmente visualizzati (ciò dipende dalle impostazioni dell'utente nel Sistema -> Config), ma devo aggiungere tutti quei blocchi prima di aggiungerli condizionalmente all'interno <reference name="footer">...</reference>.

Magento elabora istantaneamente tutti i blocchi aggiunti in questo modo?

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

O i blocchi vengono elaborati solo se devono essere finalmente visualizzati nel modello? Quindi Magento dovrà elaborare tutti i miei 50 blocchi nonostante il fatto che solo alcuni di questi blocchi debbano essere visualizzati?

Risposte:


28

Vorrei aggiungere la mia opzione anziché la risposta di Benmarks.

Il mio approccio è usare l'azione append:

    <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
Questo può applicarsi in alcuni casi (ed è stato un mio pensiero iniziale), tuttavia in questo caso il blocco in questione ( top.links ) è invocato di default dal core.
benmarks

@benmarks ah vuoi dire per il gusto di averlo modulare? Quindi il tuo approccio sarebbe l'approccio migliore in questo caso.
Rick Kuipers,

1
@RickKuipers 1. Puoi chiarire come funziona questo metodo "append"? Si sposterà my_blockall'interno di "head" o aggiungerà un'altra copia di quel blocco all'interno di "head" e la prima copia verrà comunque visualizzata altrove (poiché il blocco era già stato aggiunto in precedenza <reference name="head">)? 2. In quale file PHP posso trovare tutti quei metodi di layout come "append" o "unsetChild"?
zitix,

1
@zitix Se la definizione del blocco si trova nel <reference name="root">(o in qualsiasi altro non core/text_listblocco), non verrà visualizzata automaticamente a meno che non venga chiamata da getChildHtml(). Non sposta il blocco, sarà una copia in modo da poterlo aggiungere più volte. <action>chiama un metodo nel blocco. Quindi dipende da quale blocco stiamo parlando. Puoi trovarne alcuni standard in Mage_Core_Block_Abstract. Ma qualsiasi metodo di proprietà del blocco può essere chiamato utilizzando <action>.
Rick Kuipers,

@RickKuipers E in che modo questo metodo influisce sulle prestazioni? (Ho modificato la mia domanda) Il blocco deve essere aggiunto <block type="core/template" name="my_block" template="my/block.phtml" />anche se non verrà finalmente visualizzato.
zitix,

15

Utilizzando la _templateproprietà per nascondere l'output è un nuovo approccio. Io preferirei valori invertire l'opzione di configurazione in modo che sì = 0 (forse un modello di origine personalizzato) e la chiamata unsetChildsul genitore testa di blocco:

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

1
Grazie, questo è molto buono ma richiede l'inversione di tutti i campi di configurazione nel Sistema -> Config. Avrei bisogno di cambiare: Top Links: [enable/disable]a qualcosa del genere Hide Top Links: [Yes/No].
zitix,

1
I modelli di origine per la configurazione del sistema sono incredibilmente facili e questo percorso è molto meno complicato rispetto all'aggiunta di un handle di aggiornamento del layout personalizzato tramite l'osservatore.
benmarks

12

Per quanto riguarda le tue domande:

  1. Il mio metodo si espande solo sul tuo

  2. Non riesco a capire perché non lo sia

  3. Ancora una volta, il tuo codice è abbastanza sicuro dietro metodi che non causeranno eccezioni ( getStoreConfigper esempio, restituirà solo valori falsi, quindi il tuo handle condizionale non verrà aggiunto) ma otterrai un'eccezione se il file modello vuoto non esiste. Utilizzare un tag a chiusura automatica per passare un valore vuoto (ad es. <template />)

Se lo stavo sviluppando, estenderei la tua soluzione per includere un osservatore che controlla la configurazione e aggiunge condizionalmente un handle al layout. Quindi, nel tuo file di layout puoi impostare entrambe le azioni all'interno di diversi handle defaulteshow_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>

E poi nel tuo Observermodello ...

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

Aaaand finalmente nel tuo layout:

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

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

Grazie, non lo sapevo, sicuramente userò questo metodo in futuro. Ma per quello che devo fare ora, richiede troppo codice aggiuntivo.
zitix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.