Targeting di più handle di layout nel layout XML


22

Ho un controller personalizzato accessibile nel percorso /custommodule/customer/infoche sta caricando il 2columns-left.phtmlmodello sul rootnodo come segue:

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

Quello che vorrei fare è aggiornare il modello di root per i clienti che non hanno effettuato l'accesso, ad esempio:

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

Capisco che non posso scegliere come target più handle di layout in questo modo, ma l'intento dovrebbe essere chiaro; aggiorna il modello radice per questo handle di layout mentre i clienti non sono connessi.

Pensavo di poter indirizzare l'handle del mio controller con il seguente:

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

Questo infatti aggiorna il modello di root con il 1column.phtmlmodello, ma lo sta facendo su quelle che sembrano essere tutte le pagine anziché solo la pagina scelta come target nel mio referencenodo.

Ho provato diverse permutazioni di questo aggiornamento del layout, ma nessuna sembra funzionare. Come posso indirizzare questo handle di layout usando contemporaneamente l' customer_logged_outhandle di layout?

- modifica - Per essere chiari, questo è in realtà un modulo di terze parti.

Risposte:


18

Poiché stai utilizzando il tuo controller non è necessario utilizzare solo gli handle predefiniti. In base allo stato di accesso è possibile aggiungere il metodo infoAction

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

o

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

e quindi nel file layout.xml utilizzare

<mymodule_customer_info_logged_in>

e

<mymodule_customer_info_logged_out>

- aggiunta dopo la modifica di seguito -

Visto che non vuoi modificare il controller (poiché è un'estensione di terze parti), creerei un'estensione separata che osserva solo controller_action_layout_load_before

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

Snazzy. Questo non è l'ideale, ma è una soluzione relativamente pulita. Come ho già detto nel mio altro commento qui sotto, preferirei non dover modificare un modulo di terze parti, ma sembra che qui non ci sia molta scelta. Peccato, perché le customer_logged_in/outimpugnature potrebbero essere così potenti, ma si lasciano a bocca aperta a causa di questa limitazione.
pspahn,

14

Alan Storm ha risposto a qualcosa di simile come questo:

/programming//a/5601579/1157493

Puoi usare un aiutante per fare la tua logica di controllo se l'accesso personalizzato è stato effettuato.

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

Chiamerà Mage::helper('mymodule/myhelper')->switchTemplateIf(); In quell'helper puoi decidere di cambiare il modello o semplicemente tenerlo così.

Credo che imposta il modello per qualunque cosa tu returnin quella funzione.

Sarebbe simile a questo:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

Non testato


Ho pensato anche a questo, ma speravo solo di fare affidamento sul layout XML del modulo per eseguire ciò senza dover fare affidamento su classi aggiuntive nel modulo - la filosofia di "se può essere fatto in XML, fallo in XML, non creare risorse aggiuntive per il modulo se non è necessario ".
pspahn,

@pspahn Naturalmente l'obiettivo è provare a farlo con il sistema di layout XML fornito da Magento, purtroppo ha i suoi limiti e credo che questo sia uno di questi. Anche se penso ancora che questa sia una soluzione perfettamente praticabile nonostante la risorsa aggiuntiva del modulo.
Rick Kuipers,

@pspahn Fooman ha una buona soluzione alternativa che consiglierei sulla mia. Richiede meno codifica!
Rick Kuipers,

In questo caso, in realtà ho a che fare con un modulo di terze parti. Preferirei non dover modificare il loro modulo (poiché gli aggiornamenti potrebbero interromperlo) e preferirei non inserirlo in una classe helper di un modulo separato (dal momento che lega il loro modulo e il modulo all'anca).
pspahn,

6

Di recente avevo bisogno di questo tipo di funzionalità ed è stato difficile aggiungere sempre più handle di layout per tutte le diverse combinazioni di handle di layout esistenti, quindi ho creato un'estensione magento per aggiungere la possibilità di indirizzare direttamente più handle di layout dal layout xml.

Ecco il link all'estensione- https://github.com/mridul89/MultipleHandles.git

Lo useresti in questo modo-

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

Questo dirà a Magento di usare questo particolare customer_logged_outhandle di custommodule_customer_infolayout solo se è presente anche l'handle di layout.

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.