Segmentando várias alças de layout no XML de layout

22

Eu tenho um controlador personalizado acessado no caminho /custommodule/customer/infoque está carregando o 2columns-left.phtmlmodelo no rootnó da seguinte maneira:

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

O que eu gostaria de fazer é atualizar o modelo raiz para clientes que não estão conectados, 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>

Entendo que não posso segmentar várias alças de layout dessa maneira, mas a intenção deve ser clara; atualize o modelo raiz para esse identificador de layout enquanto os clientes não estiverem conectados.

Eu pensei que poderia direcionar o identificador do meu controlador com o seguinte:

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

Na verdade, isso atualiza o modelo raiz com o 1column.phtmlmodelo, mas é o que parece ser todas as páginas, em vez de apenas a página direcionada no meu referencenó.

Eu tentei várias permutações dessa atualização de layout, mas nenhuma parece funcionar. Como posso segmentar esse identificador de layout enquanto usa o customer_logged_outidentificador de layout?

- edit - Para ficar claro, este é realmente um módulo de terceiros.

pspahn
fonte

Respostas:

18

Como você está usando seu próprio controlador, não precisa usar apenas os identificadores padrão. Com base no status de logon, você pode adicionar seu método infoAction

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

ou

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

e, em seguida, no seu arquivo layout.xml, use

<mymodule_customer_info_logged_in>

e

<mymodule_customer_info_logged_out>

- adição após sua edição abaixo -

Como você não deseja editar o controlador (uma vez que é uma extensão de terceiros), eu criaria uma extensão separada que apenas observe o 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 na Fooman
fonte
Snazzy. Isso não é o ideal, mas é uma solução relativamente limpa. Como mencionei no meu outro comentário abaixo, prefiro não precisar modificar um módulo de terceiros, mas parece que não há muita escolha aqui. Que vergonha, porque as customer_logged_in/outalças podem ser muito poderosas, mas são limitadas por causa dessa limitação.
Pspahn
14

Alan Storm respondeu algo semelhante a este:

/programming//a/5601579/1157493

Você pode usar um auxiliar para fazer sua lógica de verificar se o costume está conectado.

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

Ele chamará Mage::helper('mymodule/myhelper')->switchTemplateIf(); esse auxiliar, você pode decidir mudar o modelo ou apenas mantê-lo assim.

Eu acredito que define o modelo para o que você returnnessa função.

Seria algo como isto:

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

Não testado

Rick Kuipers
fonte
Eu também tinha esse pensamento, mas esperava ter que confiar apenas no XML de layout do módulo para fazer isso sem precisar contar com classes adicionais no módulo - a filosofia de "se isso pode ser feito em XML, faça-o" em XML, não crie recursos adicionais de módulo, se não for necessário ".
Pspahn
@pspahn Obviamente, o objetivo é tentar fazê-lo com o sistema de layout XML que o Magento fornece, infelizmente ele tem suas limitações e acredito que esse seja um deles. Embora eu ainda ache que essa é uma solução perfeitamente viável, apesar do recurso extra do módulo.
Rick Kuipers
@pspahn Fooman tem uma boa solução alternativa que eu recomendaria sobre a minha. Requer menos codificação!
21413 Rick Stiplin
Nesse caso, estou lidando com um módulo de terceiros. Prefiro não precisar editar o módulo (uma vez que as atualizações podem quebrá-lo) e preferir não colocá-lo na classe auxiliar de um módulo separado (já que vincula o módulo e o módulo no quadril).
Pspahn
6

Recentemente, eu precisava desse tipo de funcionalidade e estava ficando difícil adicionar mais e mais identificadores de layout para todas as combinações diferentes de identificadores existentes, então criei uma extensão magento para adicionar a capacidade de direcionar vários identificadores de layout diretamente do xml de layout.

Aqui está o link para a extensão - https://github.com/mridul89/MultipleHandles.git

Você usaria assim -

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

Isso dirá ao magento para usar apenas esse customer_logged_outidentificador de layout específico se o custommodule_customer_infoidentificador de layout também estiver presente.

Mridul Aggarwal
fonte