Mois : décembre 2019

[Magento 2] Créer un Source Model custom

A Source Model serves to insert values into certain fields like dropdowns, checkboxes, multiselects, radios in the system configuration Magento admin. So not all fields can have a Source Model. Some of the default Source Models are listed below and are located under the /vendor/magento/module-config/Model/Config/Source/ folder :

  • Magento\Config\Model\Config\Source\Locale → Locale options
  • Magento\Config\Model\Config\Source\Enabledisable → Enable / Disable options
  • Magento\Config\Model\Config\Source\Nooptreq → No / Optional / Required options
  • Magento\Config\Model\Config\Source\Store → Store options
  • Magento\Config\Model\Config\Source\Website → Website options
  • Magento\Config\Model\Config\Source\Yesno → Yes / No options
  • Magento\Config\Model\Config\Source\Yesno → Yes / No / Specified options
  • Magento\Config\Model\Config\Source\Locale\Country → Country options
  • Magento\Config\Model\Config\Source\Locale\Currency → Currency options
  • Magento\Config\Model\Config\Source\Locale\Timezone → Timezone options
  • Magento\Config\Model\Config\Source\Locale\Weekdaycodes → Week Day Codes options
  • Magento\Config\Model\Config\Source\Locale\Weekdays → Week Days options
  • Magento\Config\Model\Config\Source\Email\Template → Email Template options

Sources:

Avant propos: si vous n’avez pas encore créé de module pour y consigner les spécificités liées à votre projet, il faut en créer un avant de faire ce qui va suivre.

app/code/Vendor/Module/Model/Config/Source/NoPageLayoutUpdate.php

app/code/Vendor/Module/etc/system.xml hérité de app/code/MGS/ThemeSettings/etc/system.xml (les 2 fichiers seront mergés) :

app/code/Vendor/Module/etc/adminhtml/system.xml hérité de app/code/MGS/ThemeSettings/etc/adminhtml/system.xml (les 2 fichiers seront mergés) :

On compile le setup:

[Magento 2] Surcharge d’une classe PHP située dans app/code/Vendor/Module/Model/Config/Source via un namespace spécifique

La classe Width que nous souhaitons surcharger dans notre exemple définie dans le fichier app/code/MGS/ThemeSettings/Model/Config/Source/Width.php du thème payant Supro. Mais l’exemple est tout-à-fait adaptable à des classes du core code de Magento 2 ou d’autres thèmes open-source.

1. Création d’un nouveau module qui contiendra notre surcharge de classe:

2. Modification du fichier app/code/Sodifrance/Pdv/etc/module.xml comme ci-dessous.

Note: le tag sequence déclare que notre nouveau module dépend du module Supro_ThemeSettings.

3. Petit upgrade de setup en ligne de commande:

4. Modification du fichier app/code/Sodifrance/Pdv/etc/di.xml comme ci-dessous.

Ici, nous procédons à une injection de dépendances: on veut utiliser, à la place de la classe MGS\ThemeSettings\Model\Config\Source\Width, une nouvelle classe Sodifrance\Pdv\Model\Config\Source\Width.

5. Créer le dossier Model/Config/Source dans app/code/Sodifrance/Pdv.

6. Créer le fichier app/code/Sodifrance/Pdv/Model/Config/Source/Width.php sur les bases du parent app/code/MGS/ThemeSettings/Model/Config/Source/Width.php.

On va se contenter de ne rendre disponible que la valeur 1200px pour les choix de largeur de page depuis l’interface d’admin.

7. On vérifie que le nouveau module Sodifrance_Pdv est bien activé:

7b. On l’active si il est présent dans la liste des modules désactivés:

8. On compile le setup:

Résultat: depuis l’interface d’admin, dans MGS > [MGS Theme] Theme Setting v1.1.0, accodéron « Général », champ « Largeur ». Le seul choix disponible reste « 1200px ».

Il faut tout-de-même enregistrer la configuration pour que les changements soient pris en compte.

[Magento 2] Astuces, bonnes pratiques de manipulation des layouts XML

Doc officielle: Layout instructions, Common layout customization tasks.

Ajouter une zone pleine largeur et contenant des blocs statiques au-dessus du footer via un layout XML

Testé fonctionnel Magento 2.3.

Dans le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml:

Dans le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/templates/html/theme_reinsurance.phtml:

Depuis l’interface d’admin: Contenu > [Eléments] Blocs. Il faut avoir créé 3 blocs dont les identifiants sont:

  • reinsurance_besoindAide
  • reinsurance_vosGaranties
  • reinsurance_espaceAbonnes

Ajouter un bloc statique dans la sidebar (left ou right column)

Dans mon exemple, je veux ajouter le bloc statique avec l’ID 64 dans le container sidebar.additional de mes pages.

Je récupère le nom du referenceContainer dans le fichier vendor/magento/module-theme/view/frontend/page_layout/2columns-left.xml.

Dans le fichier app/design/frontend/MyVendor/mytheme/Magento_Theme/layout/default.xml:

[Magento 2] Afficher/masquer des fonctionnalités ou des modules depuis les layouts XML ou le fichier app/etc/config.php

Un grand nombre de fonctionnalités de Magento 2 peuvent s’activer/désactiver depuis un fichier layout XML dans le code source. Depuis le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml de votre thème, par exemple. En voici une liste non exhaustive:

Désactiver la fonctionnalité de comparaison produit dans Magento 2

Testé fonctionnel Magento 2.3. Source: Magento 2: Safe and easiest way to disable Compare products & Wishlist Module.

Dans le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml de votre thème, ajouter ceci:

Désactiver le module wishlist (produits favoris) dans Magento 2

Testé fonctionnel Magento 2.3. ATTENTION: erreurs PHP en front après un cache:clean avec un thème enfant du thème Supro. Peut se produire avec d’autres thèmes. Dans ce cas, se rabattre sur cette solution.

ATTENTION: lorsque vous désactivez des modules, veillez à exécuter la commande $ cache:clean de Magento 2 et à rafraîchir votre front pour vérifier que vos modifications passent sans générer d’erreurs.

Dans le fichier app/etc/confing.php repérer les trois modules Magento_Wishlist, Magento_WishlistAnalytics, Magento_WishlistGraphQl et les passer à 0 comme ceci:

Note: il est également possible de désactiver un module Magento 2 via une commande $ module:disable <nom_du_module>. En exécutant cette commande, le fichier config.php sera mis à jour automatiquement.

Supprimer la fonctionnalité wishlist (produits favoris) dans Magento 2

Testé fonctionnel Magento 2.3.

Préférer la solution ci-dessus si elle fonctionne, car elle permet une réactivation plus rapide de la fonctionnalité.

Dans le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml de votre thème, ajouter ceci:

De la sidebar (dans le compte client par exemple)

Essayer d’abord juste avec le 1er:

Ce n’est pas fini! Il vous faudra ensuite trouver le ou les templates PHTML qui contiennent des résidus de la fonctionnalité Wishlist qui ne peuvent être retirés via un fichier layout XML. Dans le thème Luma, le template contient les classes action towishlist sur un élément a. Dans le thème Supro, le markup HTML <div class="top-wishlist">.

Désactiver les avis et les notes produit (reviews & rating)

Testé fonctionnel Magento 2.3.

Dans le fichier app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml de votre thème, ajouter ceci:

Supprimer la navigation par filtres dans la liste produits

Masquer le titre principal d’une page

Afficher/masquer des entrées du menu en sidebar du compte client

[Magento 2] Ajouter, déplacer, supprimer des entrées dans le menu de navigation du compte client en sidebar.

Afficher/masquer l’encart reorder en sidebar et l’encart dernières commandes du dashboard client

Dans app/design/frontend/MyVendor/mytheme/Magento_Customer/layout/customer_account_index.xml:

[Magento 2] Des Websites ou des Stores multiples avec Docker et nginx

Source: Magento 2 dev docs (official) – Multiple websites or stores.

Consider the following terms:

  • Website—is the top-level container for sites, shipping methods, payment methods, and more. To create completely separate sites that do not share cart, shipping methods, or other you must create separate websites.

    Website customer accounts can be shared between multiple websites within a single Magento instance. A website contains at least one store. Catalog prices should be managed at the website level.

  • Store—is contained by a website. In turn, a store contains at least one store view.

    Multiple stores can share cart, user sessions, payment gateways, and more, but they have separate catalog structures and Catalog price.

    Catalog Qty (inventory) can not be managed at the store level. Inventory is managed at Website or Global level only.

    Store views change the way pages are presented, and are typically used to display a store with different layouts or languages. You can manage different currencies per store view.

Cas pratique

Ressources officielles utilisées:

Structure du projet en Websites > Store (group) > Store view:

Structure du projet vu de l’admin (Stores > All stores [Settings]):

N’hésitez pas à agrandir l’image.

Attention: voir la documentation officielle pour savoir comment affecter les différentes URLs à chaque store view.

Fichier <racine_projet>/docker/.env en fonction de cette structure de sites:

ATTENTION: votre fichier .env ne se trouvera pas nécessairement dans un dossier docker/. Il se trouve au même niveau que le fichier docker-compose.yml.

Notes:

  • Pour l’ensemble des variables d’environnement MAGENTO_RUN_FR1_*, FR1 est un libellé libre qui vous permettra d’identifier votre website ou votre store view (j’y viens…).
  • Pour la variable d’environnement MAGENTO_RUN_*_TYPE, vous avez le choix entre website et store (cf. colonne 1 (website) et 3 (store view) dans l’admin: Stores > All stores [Settings]).
  • Pour la variable d’environnement MAGENTO_RUN_*_CODE, renseignez le code de votre website ou de votre store view (en fonction du choix fait précedemment).
  • Pour la variable d’environnement MAGENTO_RUN_*_URL, renseignez l’URL précisée dans les champs Base URL, Base Link URL, Secure Base URL, Secure Base Link URL, accessibles dans l’admin depuis Stores > Configuration [Settings] > Web [General] > puis sous « Store View » (juste sous le titre « Configuration », en haut à gauche) choisissez un scope.

Fichier <racine_projet>/app/etc/env.php en fonction de cette structure de sites:

Attention: les fichiers de configuration type config.php et env.php ne seront pris en compte qu’après avoir exécuté la commande bash $ magento app:config:import.

Fichier hosts (de Windows pour ma part)

Extrait fichier docker-compose.yml (image « web » uniquement):

Les lignes env_file: .env et VIRTUAL_HOST: "vitalconcept.${EXT:-local},vital-agriculture.${EXT:-local},vital-equideos.${EXT:-local},vital-paysage.${EXT:-local},vital-agriculture-be.${EXT:-local},test.vitalconcept.local" ont été ajoutées/modifiées par rapport à notre configuration originale.

Attention: il faut re-up le container Docker après chaque ajout de site/nouvelle URL:

magento.conf de nginx:

Se connecter en bash au docker « web » et vérifier que les URLs ont bien été écrites dans la configuration nginx en tapant la commande suivante:
$ cat /etc/nginx/sites-enabled/magento.conf

Assigner une root catégorie du catalogue à un store (à un sous-domaine/une URL)

Magento 2 User Guide: Root Categories > Step 3: Assign the Root Category to the Store.