Orientación de múltiples controladores de diseño en XML de diseño

22

Tengo un controlador personalizado al que se accede en la ruta /custommodule/customer/infoque está cargando la 2columns-left.phtmlplantilla en el rootnodo de la siguiente manera:

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

Lo que me gustaría hacer es actualizar la plantilla raíz para los clientes que no han iniciado sesión, algo como:

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

Entiendo que no puedo apuntar a varios controladores de diseño de esta manera, pero la intención debe ser clara; actualice la plantilla raíz para este controlador de diseño mientras los clientes no hayan iniciado sesión.

Pensé que podría apuntar al controlador de mi controlador con lo siguiente:

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

De hecho, esto actualiza la plantilla raíz con la 1column.phtmlplantilla, pero lo está haciendo en lo que parecen ser todas las páginas en lugar de solo la página destinada en mi referencenodo.

He intentado varias permutaciones de esta actualización de diseño, pero ninguna parece funcionar. ¿Cómo puedo apuntar a este controlador de diseño mientras al mismo tiempo uso el customer_logged_outcontrolador de diseño?

- editar - Para ser claros, este es en realidad un módulo de terceros.

pspahn
fuente

Respuestas:

18

Como está usando su propio controlador, no necesita usar solo los controladores predeterminados. Según el estado de inicio de sesión, puede agregar su información Método de acción

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

o

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

y luego en su archivo layout.xml use

<mymodule_customer_info_logged_in>

y

<mymodule_customer_info_logged_out>

- Además después de su edición a continuación -

Al ver que no desea editar el controlador (ya que es una extensión de terceros), crearía una extensión separada que solo observe 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
    }
Kristof en Fooman
fuente
Elegante. Esto no es ideal, pero es una solución relativamente limpia. Como mencioné en mi otro comentario a continuación, prefiero no tener que modificar un módulo de terceros, pero parece que no hay muchas opciones aquí. Es una pena, porque los customer_logged_in/outmangos podrían ser tan poderosos, pero se les da miedo debido a esta limitación.
pspahn
14

Alan Storm ha respondido algo similar a esto:

/programming//a/5601579/1157493

Puede usar un ayudante para hacer su lógica de verificar si la costumbre está conectada.

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

Se llamará Mage::helper('mymodule/myhelper')->switchTemplateIf(); En ese ayudante puede decidir cambiar la plantilla o simplemente mantenerlo así.

Creo que establece la plantilla a lo que sea returnen esa función.

Se vería algo así:

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

No probado

Rick Kuipers
fuente
También tuve este pensamiento, pero esperaba tener que confiar solo en el diseño XML del módulo para realizar esto sin tener que depender de clases adicionales en el módulo: la filosofía de "si se puede hacer en XML, hazlo en XML, no cree recursos de módulo adicionales si no es necesario ".
pspahn
@pspahn Por supuesto, el objetivo es intentar hacerlo con el sistema de diseño XML que proporciona Magento, desafortunadamente tiene sus limitaciones y creo que este es uno de ellos. Aunque sigo pensando que esta es una solución perfectamente viable a pesar del recurso de módulo adicional.
Rick Kuipers
@pspahn Fooman tiene una buena solución alternativa que recomendaría sobre la mía. ¡Requiere menos codificación!
Rick Kuipers el
En este caso, en realidad estoy tratando con un módulo de terceros. Prefiero no tener que editar su módulo (ya que las actualizaciones pueden romperlo) y prefiero no colocar esto en la clase auxiliar de un módulo separado (ya que eso une su módulo y módulo en la cadera).
pspahn
6

Recientemente necesitaba este tipo de funcionalidad y me resultaba difícil agregar más y más identificadores de diseño para todas las diferentes combinaciones de identificadores de diseño existentes, así que creé una extensión magento para agregar la capacidad de apuntar a múltiples identificadores de diseño directamente desde el xml de diseño.

Aquí está el enlace a la extensión: https://github.com/mridul89/MultipleHandles.git

Lo usarías así:

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

Esto le indicará a magento que solo use este customer_logged_outcontrolador de diseño en particular si el custommodule_customer_infocontrolador de diseño también está presente.

Mridul Aggarwal
fuente