Afficher / masquer de manière conditionnelle les blocs dans le XML de présentation


32

Comment ajouter conditionnellement un bloc (en fonction de la configuration dans le panneau d'administration) dans le XML de présentation de Magento?

Nous pouvons vérifier si la configuration est vraie pour les actions. Dans l'exemple ci-dessous, si sample/config/show_toplinksconfig à partir du panneau d'administration (dans Système-> Configuration) est true , le fichier de modèle links.phtmlsera utilisé pour rendre les liens Top. Si la valeur sample/config/show_toplinksest false , le modèle par défaut sera utilisé.

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

J'ai trouvé cette solution de contournement quelque part sur le Web. Nous pouvons définir un modèle vide comme modèle par défaut pour les liens principaux, comme ceci:

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

Dans ce cas, si sample/config/show_toplinksest true , le modèle links.phtmlsera utilisé et Top Links sera affiché. mais si la valeur sample/config/show_toplinksest false , le empty_template_for_links.phtmlmodèle sera utilisé et ce modèle est complètement vide. Il ne renvoie donc aucun code HTML et les liens supérieurs ne sont pas visibles.

  1. Existe-t-il un autre moyen d'afficher ou de masquer de manière conditionnelle des blocs en fonction de la configuration dans le panneau d'administration?
  2. Cette solution de contournement est-elle sûre?
  3. Est-ce que cela peut causer des erreurs inattendues?

MODIFIER:

Sur la base de toutes les réponses, je pense que la solution de Rick Kuipers semble la plus pratique pour mon cas. Mais j'ai une autre question connexe:

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

Si j'ai beaucoup de blocs à ajouter comme ceci (en utilisant appendmethod et ifconfig), disons 50, cela affecte-t-il les performances ? Seuls quelques-uns des blocs seront réellement affichés (cela dépend du paramétrage de l'utilisateur dans Système -> Config), mais je dois ajouter tous ces blocs avant de les ajouter conditionnellement à l'intérieur <reference name="footer">...</reference>.

Est-ce que Magento traite instantanément tous les blocs ajoutés comme ceci?

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

Ou les blocs ne sont traités que s’ils doivent être finalement affichés dans le modèle? Alors, Magento devra-t-il traiter la totalité de mes 50 blocs alors que seuls certains de ces blocs doivent être affichés?

Réponses:


28

Je voudrais ajouter mon option par opposition à la réponse de benmarks.

Mon approche consiste à utiliser l'action 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
Cela peut s’appliquer dans certains cas (et c’était une première pensée), mais dans ce cas, le bloc en question ( top.links ) est appelé par défaut à partir du noyau.
benmarks

@ benmarks ah tu veux dire pour le rendre modulaire? Dans ce cas, votre approche serait la meilleure.
Rick Kuipers

1
@RickKuipers 1. Pouvez-vous clarifier le fonctionnement de cette méthode "append"? Va-t-il bouger à l' my_blockintérieur de "head", ou va-t-il ajouter une autre copie de ce bloc à l'intérieur de "head" et la première copie sera toujours affichée ailleurs (le bloc ayant déjà été ajouté auparavant <reference name="head">)? 2. Dans quel fichier PHP puis-je trouver toutes les méthodes de mise en page comme "append" ou "unsetChild"?
Zitix

1
@zitix Si la définition du bloc est dans le <reference name="root">(ou tout autre non core/text_listbloc), alors il ne sera pas automatiquement affiché à moins qu'il ne soit appelé par getChildHtml(). Cela ne déplacera pas le bloc, ce sera une copie pour que vous puissiez l'ajouter plusieurs fois. <action>appelle une méthode dans le bloc. Donc, cela dépend de quel bloc nous parlons. Vous pouvez trouver quelques standards dans Mage_Core_Block_Abstract. Mais toute méthode appartenant au bloc peut être appelée en utilisant <action>.
Rick Kuipers

@RickKuipers Et comment cette méthode affecte-t-elle les performances? (J'ai modifié ma question) Le bloc doit être ajouté <block type="core/template" name="my_block" template="my/block.phtml" />même s'il ne sera pas affiché.
Zitix

15

L'utilisation de la _templatepropriété pour masquer la sortie constitue une nouvelle approche. Je préférerais inverser les valeurs de l'option config pour que Oui = 0 (peut-être un modèle source personnalisé) et appeler unsetChildle bloc principal parent :

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

1
Merci, c’est très bien, mais il faut inverser tous les champs de configuration du système -> config. J'aurais besoin de changer: Top Links: [enable/disable]quelque chose comme Hide Top Links: [Yes/No].
Zitix

1
Les modèles source pour la configuration du système sont incroyablement simples et ce chemin est beaucoup moins compliqué que d'ajouter un descripteur de mise à jour de présentation personnalisé via observateur.
benmarks

12

En ce qui concerne vos questions:

  1. Ma méthode ne fait que s'étendre sur la vôtre

  2. Je ne vois pas pourquoi ça ne serait pas

  3. Encore une fois, votre code est assez sûr derrière des méthodes qui ne causeront pas d'exceptions ( getStoreConfigpar exemple, renverra simplement des valeurs faussement, afin que votre descripteur conditionnel ne soit pas ajouté), mais vous obtiendrez une exception si le fichier de modèle vide n'existe pas. Utilisez une balise à fermeture automatique pour passer une valeur vide (par exemple <template />)

Si je développais cela, j'étendrais votre solution pour inclure un observateur qui vérifie la configuration et ajoute conditionnellement un descripteur à votre mise en page. Ensuite, dans votre fichier de configuration , vous pouvez définir les actions à l' intérieur différent handles- defaultetshow_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>

Et puis dans votre Observermodèle ...

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

Aaaand enfin dans votre layout:

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

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

Merci, je ne le savais pas, je vais certainement utiliser cette méthode à l'avenir. Mais pour ce que je dois faire maintenant, cela nécessite trop de code supplémentaire.
Zitix
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.