8 votes

Quelle est la bonne façon de mettre à jour la mise en page avec les pages CMS?

Je possède un module de produits en vedette que j'ai écrit et qui place un bloc personnalisé sur la page avec une liste de produits correspondant aux attributs que j'ai définis dans le bloc. À l'origine, j'avais réussi en ajoutant une ligne {{block...}} à la section Contenu de la page CMS. Cela fonctionnait bien, mais je n'avais pas la barre de pagination. J'ai donc corrigé cela en retirant la ligne {{block...}} de la section Contenu et en ajoutant du XML à la section Mise à jour XML de la présentation comme suit :

        product_list_toolbar
        my_attribute

Cela fonctionnait également très bien. J'ai ensuite décidé, étant donné qu'il y a tant d'instances de ce bloc, qu'il serait beaucoup plus propre d'ajouter un fichier XML au dossier de présentation de mon thème et d'y placer ce code. Ensuite, dans la section Mise à jour de la présentation, je pouvais simplement avoir ceci à la place :

    other_attribute

J'ai donc créé un fichier appelé vps_featured.xml et j'y ai ajouté ceci :

                product_list_toolbar

Ce fichier XML de mise à jour de la présentation a été référencé dans le fichier config.xml de mon module en vedette personnalisé. J'ai naïvement supposé que vps_featured.xml serait incorporé dans la mise en page de la page uniquement lorsque mon bloc de produit en vedette VPS était sur la page, ce qui ne se produirait que dans ces quelques cas sur des pages CMS spéciales. Apparemment, ce n'est pas le cas. Cela a cassé toutes les autres pages, je suppose parce que cela viole le gestionnaire par défaut.

Cela m'amène à la question n°1 : Quand les fichiers XML de mise en page sont-ils inclus dans la mise en page de la page ? Sont-ils utilisés pour TOUTES les pages, peu importe si le module qui les référence est utilisé ou non ?

J'ai alors décidé d'essayer d'ajouter un nouveau gestionnaire de mise en page que je pourrais référencer lorsque je le souhaite dans mes pages CMS. J'ai modifié mon fichier XML de présentation pour que la partie principale soit dans les balises plutôt que dans les balises . Cela a ramené les autres pages à la vie, mais bien sûr, mes pages CMS ne fonctionnaient plus car ce gestionnaire de mise à jour de la présentation n'est pas utilisé sur ces pages. J'ai essayé d'ajouter à la section Mise à jour XML de la page CMS, mais cela n'a pas fonctionné (je ne m'y attendais pas).

Cela m'amène à la question n°2 : Quelle est la bonne façon d'y parvenir ?

Cela ne devrait pas être aussi difficile, mais clairement j'ai raté quelque chose. J'ai lu tout ce que je pouvais trouver sur les présentations, mais ce sont toujours des exemples simples, comme "ajouter ceci à TOUTES les pages de produit". Je ne veux pas ajouter quelque chose à TOUTES les pages CMS... seulement à quelques-unes d'entre elles. Suis-je obligé d'utiliser la section Mise à jour XML de la présentation pour les pages CMS en question ? J'ai l'impression qu'il doit y avoir une manière plus propre de le faire.

Merci,

Brian

17voto

Alan Storm Points 82442

Le noeud est quelque chose appelé un "layout handle". Chaque demande dans Magento génère un certain nombre de ces handles. Consultez l'onglet Layout sur le site de démonstration Commerce Bug pour avoir une idée des types de handles qui sont générés.

Magento fusionne tous les fichiers XML de layout en un seul arbre géant appelé le layout du package. Ensuite, les handles déterminent quels fragments de mise à jour XML du layout sont utilisés pour une demande particulière. Ces fragments sont combinés dans le Layout de la Page. Comme vous l'avez pressenti, le handle est toujours ajouté, c'est pourquoi vous cassez tous les sites de votre système.

La mauvaise nouvelle est qu'il y a un handle pour les pages CMS, (), ce serait quand même une affaire tout ou rien. Vous pourriez ajouter quelque chose à toutes les pages CMS, mais pas à des pages CMS spécifiques. Donc oui, la section Mise à jour XML du Layout de l'admin CMS est "la bonne" façon de faire ce que vous voulez.

La bonne nouvelle est qu'il y a deux approches que vous pouvez prendre qui sont plus propres que ce que vous avez trouvé jusqu'à présent. Premièrement, vous pouvez nettoyer un peu les choses en définissant votre propre handle dans votre fichier XML, puis utiliser une commande spéciale pour inclure ce handle.

Dans votre XML, ajoutez votre fragment XML de mise à jour du Layout à l'intérieur d'un handle personnalisé.

product_list_toolbar

Ensuite, dans l'admin CMS, ajoutez la mise à jour XML du Layout suivante pour les pages que vous voulez

Magento autorise les fragments de mise à jour XML du layout à ajouter des handles supplémentaires à la demande. C'est ce que vous faites ci-dessus. Cela nettoie un peu les choses, et si vous vouliez modifier une partie du XML, il y a un endroit centralisé pour le faire.

Mise à jour: Il s'avère que la commande ne peut seulement être utilisée à partir des fichiers XML de Layout eux-mêmes. Le code qui charge les mises à jour XML du Layout pour les pages CMS n'est pas le même code qui charge et traite les mises à jour pour les fichiers XML. Magento ajoutera littéralement tout ce qui se trouve dans le formulaire CMS en tant que mise à jour de layout. Il ne le traite pas pour des mises à jour récursives. Donc, ajouter quelque chose comme cela à local.xml fonctionnerait

    Liste de produits fictive        
                skin_jsjs/sw/wall.js

Mais vous ne pouvez pas le faire directement avec une mise à jour appliquée via l'admin CMS. À chacun ses erreurs et ses leçons.

Tout cela dit, l'approche widget est probablement toujours viable, et une alternative à ce que vous avez trouvé jusqu'à présent serait.

  1. Créez un module personnalisé avec une classe de block personnalisée

  2. La classe de block ne rend aucun HTML

  3. La classe de block contient une seule méthode nommée quelque chose comme "addFooToLayout"

Ensuite, dans votre page CMS, ajoutez une mise à jour comme ceci

et ensuite dans votre définition de block

public addFooToLayout()
{
    $layout = Mage::getSingleton('core/layout');
    $head   = $layout->getBlock('head');
    $head->addItem('skin_js','js/sw/wall.js');
    //etc...
}

Quelque chose comme ça devrait fonctionner et est un peu plus clair (selon la quantité de mise à jour XML du layout que vous voulez ajouter). Cependant, je ne l'ai pas testé et ma crédibilité est en jeu sur celle-ci alors méfiez-vous.

La deuxième approche est de créer un seul widget qui englobe ce que vous aimeriez ajouter à la page, puis utilisez l'admin de l'instance de widget pour ajouter ce widget à des blocs spécifiques sur des pages spécifiques. Ce lien devrait vous mettre sur la bonne voie.

Enfin, au risque de faire de la publicité, j'ai récemment publié moi-même un livre sur les Layouts Magento qui couvre ces types de problèmes en profondeur. Cela vaut la peine si vous êtes intéressé à comprendre comment tout le système fonctionne.

3voto

Anton Boritskiy Points 632

Cependant, cette question est déjà assez ancienne, je l'ai trouvée via Google et j'aimerais ajouter des informations pour ceux qui liront ce message à l'avenir.

Hier, lorsque j'ai lu cette question et réponse, ainsi que ceci et ceci articles, j'ai été assez sûr qu'il n'était pas possible ou assez difficile de remplacer/étendre le handle de mise en page de la page CMS uniquement pour des pages spécifiques. Cela m'a amené à développer une petite extension qui injecte n'importe quel handle de mise en page personnalisé dans une page spécifique. Je mettrai à jour ce message avec un lien public vers l'extension prochainement.

Mais ensuite, j'ai découvert qu'il est en fait possible de simplement créer un nouveau modèle pour la page CMS et d'assigner n'importe quel handle de mise en page personnalisé à ce modèle, voir cette question et réponse de Marius par exemple. Voici la partie importante de cet exemple de code :

                Lookbook

                lookbook

Il est assez facile d'injecter n'importe quel handle de mise en page personnalisé dans n'importe quelle page et de faire ce que vous voulez uniquement avec les pages qui utilisent ce modèle et votre handle de mise en page personnalisé. J'aurais aimé le savoir avant, j'espère que ce message économisera du temps à quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X