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_toplinks
config à partir du panneau d'administration (dans Système-> Configuration) est true , le fichier de modèle links.phtml
sera utilisé pour rendre les liens Top. Si la valeur sample/config/show_toplinks
est 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_toplinks
est true , le modèle links.phtml
sera utilisé et Top Links sera affiché. mais si la valeur sample/config/show_toplinks
est false , le empty_template_for_links.phtml
modè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.
- 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?
- Cette solution de contournement est-elle sûre?
- 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 append
method 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?
my_block
inté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"?<reference name="root">
(ou tout autre noncore/text_list
bloc), alors il ne sera pas automatiquement affiché à moins qu'il ne soit appelé pargetChildHtml()
. 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 dansMage_Core_Block_Abstract
. Mais toute méthode appartenant au bloc peut être appelée en utilisant<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
même s'il ne sera pas affiché.L'utilisation de la
_template
proprié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 appelerunsetChild
le bloc principal parent :la source
Top Links: [enable/disable]
quelque chose commeHide Top Links: [Yes/No]
.En ce qui concerne vos questions:
Ma méthode ne fait que s'étendre sur la vôtre
Je ne vois pas pourquoi ça ne serait pas
Encore une fois, votre code est assez sûr derrière des méthodes qui ne causeront pas d'exceptions (
getStoreConfig
par 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-
default
etshow_toplinks
Et puis dans votre
Observer
modèle ...Aaaand enfin dans votre layout:
la source