Astuce testée fonctionnelle Magento 2.3!
Afficher un page layout différent selon une catégorie de produits spécifique
Ce que je veux: j’ai plusieurs catégories de produits dans ma boutique Magento 2. L’affichage des listes produits de l’une de ces catégories (la catégorie Abonnements dans ce tutoriel) doit bénéficier d’un affichage complètement différent par rapport aux listes produits des autres catégories de mon site Magento 2, dont l’affichage restera « standard ».
Nativement, c’est l’articulation du layout vendor/magento/module-catalog/view/frontend/layout/catalog_category_view.xml
et du template vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
qui génèrent l’affichage de l’ensemble des listes produits dans les pages du catalogue d’une boutique Magento 2.
Nous allons créer un nouveau page layout XML qui servira à rediriger vers un template PHTML de liste spécifique. Une action en backoffice sera nécessaire pour affecter ce nouveau page layout aux catégories concernées.
Conventions pour ce tuto: je pars du principe qu’il existe un Vendor/theme Sodifrance/pdv
dans votre arborescence de fichiers et que la catégorie pour laquelle nous cherchons à surcharger l’affichage s’appelle Abonnements.
Commencer par déclarer un nouveau page layout XML dans votre thème
Chemin vers ce fichier: app/design/frontend/Sodifrance/pdv/Magento_Theme/layouts.xml
1 2 3 4 5 6 |
<?xml version="1.0" encoding="UTF-8"?> <page_layouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/PageLayout/etc/layouts.xsd"> <layout id="abonnements_subcategory"> <label translate="true">[PDV] Abonnements (sous-catégorie)</label> </layout> </page_layouts> |
Créer ensuite le nouveau page layout XML abonnements_subcategory.xml
correspondant
Source: Magento2: Add a new page layout.
Nous allons créer un page layout XML spécifique app/design/frontend/Sodifrance/pdv/Magento_Theme/page_layout/abonnements_subcategory.xml
.
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> <update handle="empty"/> <referenceContainer name="page.wrapper"> <container name="header.container" as="header_container" label="Page Header Container" htmlTag="header" htmlClass="page-header" before="main.content"/> <container name="page.top" as="page_top" label="After Page Header" after="header.container"/> <container name="footer-container" as="footer" before="before.body.end" label="Page Footer Container" htmlTag="footer" htmlClass="page-footer"/> </referenceContainer> </layout> |
L'<update handle="empty"/>
et le contenu du <referenceContainer name="page.wrapper">
sont copiés/collés du page layout vendor/magento/module-theme/view/frontend/page_layout/1column.xml
dont je veux reprendre les bases. Aucun merge n’étant prévu par Magento 2 à ce niveau (jusqu’à ce qu’on me contredise, je ne peux déclarer nulle part que mon nouveau layout abonnements_subcategory.xml
doit hériter d’un parent existant column1.xml
), je suis obligé de faire du copier/coller, sinon mon front-end n’affiche plus rien…
Créer un template PHTML custom list_abonnements.pthml
dans votre thème
Ce template sera une surcharge du fichier vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
, située dans app/design/frontend/Sodifrance/pdv/Magento_Catalog/templates/product/list_abonnements.phtml
et dans laquelle vous consignerez les spécificités d’affichage liées à la catégorie Abonnements de votre boutique.
Je ne vous mets pas d’exemple de code ici. Votre projet n’aura pas les mêmes spécificités que le mien.
Enfin, rajouter un referenceContainer
à notre list_abonnements.phtml
spécifique
Source: Different list.phtml for categorys in the backend of Magento 2.1.7.
Sur les bases du fichier app/design/frontend/Sodifrance/pdv/Magento_Theme/page_layout/abonnements_subcategory.xml
crée précédemment, nous allons ajouter un referenceContainer
à notre template PHTML de liste spécifique app/design/frontend/Sodifrance/pdv/Magento_Catalog/templates/product/list_abonnements.phtml
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0"?> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> <update handle="empty"/> <referenceContainer name="page.wrapper"> <container name="header.container" as="header_container" label="Page Header Container" htmlTag="header" htmlClass="page-header" before="main.content"/> <container name="page.top" as="page_top" label="After Page Header" after="header.container"/> <container name="footer-container" as="footer" before="before.body.end" label="Page Footer Container" htmlTag="footer" htmlClass="page-footer"/> </referenceContainer> <referenceContainer name="columns.top"> <referenceBlock name="category.products.list"> <action method="setTemplate"> <argument name="template" xsi:type="string">Magento_Catalog::product/list_abonnements.phtml</argument> </action> </referenceBlock> </referenceContainer> </layout> |
Affecter le nouveau layout à vos catégories via l’interface d’admin
En backoffice: Catalogue > Catégories > choisir une catégorie ou une sous-catégorie dans l’arborescence de votre catalogue > volet Design > champ Agencement > sélectionner votre page layout ([PDV] Abonnements (sous-catégorie) dans mon exemple).
Autre méthode
Source: Different template for different categories in magento 2 [category_id layout handle in M2].
Il ne s’agit pas à proprement parler d’un override. Il faut créer un fichier XML catalog_category_view_id_{{id}}.xml
sous app/design/frontend/<vendorName>/<themeName>/Magento_Catalog/layout/
, où {{id}}
est l’ID de votre catégorie (visible en admin sous Catalogue > Catégories > choisir la catégorie/sous-catégorie).
Commande à exécuter pour voir les modifs en front: $ n98-magerun2 cache:clean
.