Ciblage de plusieurs descripteurs de présentation dans la présentation XML

22

J'ai un contrôleur personnalisé accédé au chemin /custommodule/customer/infoqui charge le 2columns-left.phtmlmodèle sur le rootnœud comme suit:

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

Ce que je voudrais faire, c'est mettre à jour le modèle racine pour les clients qui ne sont pas connectés, par exemple:

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

Je comprends que je ne peux pas cibler plusieurs descripteurs de disposition de cette manière, mais l'intention doit être claire; mettre à jour le modèle racine pour ce descripteur de mise en page alors que les clients ne sont pas connectés.

J'avais pensé que je pouvais cibler la poignée de mon contrôleur avec ce qui suit:

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

Cela met en effet à jour le modèle racine avec le 1column.phtmlmodèle, mais il le fait sur ce qui semble être toutes les pages au lieu de simplement la page ciblée dans mon referencenœud.

J'ai essayé plusieurs permutations de cette mise à jour de mise en page, mais aucune ne semble fonctionner. Comment puis-je cibler cette poignée de mise en page tout en utilisant la customer_logged_outpoignée de mise en page?

- modifier - Pour être clair, il s'agit en fait d'un module tiers.

pspahn
la source

Réponses:

18

Puisque vous utilisez votre propre contrôleur, vous n'avez pas besoin d'utiliser uniquement les poignées par défaut. En fonction de l'état de connexion, vous pouvez ajouter votre méthode infoAction

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

ou

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

puis dans votre fichier layout.xml, utilisez

<mymodule_customer_info_logged_in>

et

<mymodule_customer_info_logged_out>

- ajout après votre modification ci-dessous -

Étant donné que vous ne souhaitez pas modifier le contrôleur (car il s'agit d'une extension tierce), je créerais une extension distincte qui n'observe que 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 chez Fooman
la source
Snazzy. Ce n'est pas idéal, mais c'est une solution relativement propre. Comme je l'ai mentionné dans mon autre commentaire ci-dessous, je préfère ne pas avoir à modifier un module tiers, mais il semble qu'il n'y ait pas beaucoup de choix ici. Dommage, car les customer_logged_in/outpoignées pourraient être si puissantes, mais elles se font deviner à cause de cette limitation.
pspahn
14

Alan Storm a répondu à quelque chose de similaire comme ceci:

/programming//a/5601579/1157493

Vous pouvez utiliser un assistant pour faire votre logique de vérifier si la connexion personnalisée est connectée.

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

Il appellera Mage::helper('mymodule/myhelper')->switchTemplateIf(); Dans cet assistant, vous pouvez décider de changer de modèle ou de simplement le conserver comme ceci.

Je crois que cela définit le modèle pour tout ce que vous return dans cette fonction.

Cela ressemblerait à quelque chose comme ceci:

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

Non testé

Rick Kuipers
la source
J'avais également cette pensée, mais j'espérais ne compter que sur la disposition XML du module pour effectuer cela sans avoir à s'appuyer sur des classes supplémentaires dans le module - la philosophie de "si cela peut être fait en XML, faites-le en XML, ne créez pas de ressources de module supplémentaires si ce n'est pas nécessaire ".
pspahn
@pspahn Bien sûr, l'objectif est d'essayer de le faire avec le système de mise en page XML fourni par Magento, malheureusement il a ses limites et je pense que c'est l'un d'entre eux. Bien que je pense toujours que c'est une solution parfaitement viable malgré la ressource de module supplémentaire.
Rick Kuipers
@pspahn Fooman a une bonne solution alternative que je recommanderais par rapport à la mienne. Cela nécessite moins de codage!
Rick Kuipers
Dans ce cas, j'ai en fait affaire avec un module tiers. Je préfère ne pas avoir à modifier leur module (car les mises à jour peuvent le casser) et je préfère ne pas le placer dans une classe d'assistance de module distinct (car cela lie leur module et module ensemble à la hanche).
pspahn
6

J'ai récemment eu besoin de ce type de fonctionnalité et il devenait difficile d'ajouter de plus en plus de poignées de disposition pour toutes les différentes combinaisons de poignées de disposition existantes, j'ai donc créé une extension magento pour ajouter la possibilité de cibler plusieurs poignées de disposition directement à partir du XML de disposition.

Voici le lien vers l'extension- https://github.com/mridul89/MultipleHandles.git

Vous l'utiliseriez comme ça-

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

Cela indiquera à magento de n'utiliser cette customer_logged_outpoignée de mise en page particulière que si la custommodule_customer_infopoignée de mise en page est également présente.

Mridul Aggarwal
la source