Quelques ressources pour comprendre:
- Customer Data Management in Magento 2 – récupérer des infos sur le customer en cache (local storage) via l’objet
customer
déclaré dans le composant JSMagento_Customer/js/view/customer
. Version PDF – belvg.com-Customer Data Management in Magento 2 - Sections in Magento 2 – Magento sets customer related data in local storage of browser in key value pair. Each key is known as section. In this post we will see How we can create custom section in our module and use the data in the section in our template file. Version PDF – webkul.com-Sections in Magento 2
Choisissez votre méthode:
- Je veux faire ça bien avec javascript (après tout, c’est l’auteur de ce blog qui a souffert pour mettre ça en place proprement; moi j’ai juste à suivre ses directives).
- Je vais utiliser l'
objectManager
de Magento 2 dans un PHTML (paaaaaaaaaaas bien!).
Avec javascript (pour afficher le prénom de l’utilisateur)
Source: Magento 2: get customer().lastname in header.phtml (le titre n’étant pas tout-à-fait juste puisqu’on récupère bien le firstName du customer.
Pas besoin de créer un module et de faire de l’injection de dépendances (comme on le voit sur les 36 fils de discussion stack overflow ou sur les 52 blogs qui sont proposés dans les premiers résultats Google…).
Dans votre fichier PHTML, initialisez votre JS sur un élément (span
dans mon exemple, mais utilisez l’élément qui vous arrange):
1 |
<span data-mage-init='{"js/customerGreeting":{}}'> |
…puis créez un fichier app/design/frontend/VotreVendor/votretheme/web/js/customerGreeting.js
et mettez-y ceci:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
define([ "jquery", "Magento_Customer/js/customer-data" ], function($, customerData) { "use strict"; return function (config, element) { var firstname = customerData.get('customer')().firstname; if (typeof (firstname) === "undefined") { customerData.reload('customer'); } var check = setInterval(function () { var firstname = customerData.get('customer')().firstname; if (firstname) { $(element).text('Hi, ' + firstname); clearInterval(check); } }, 500); }; }); |
…et en fait, bin, ça fonctionne 🙂
Pour détecter si l’utilisateur est connecté, créer un Block et le déclarer dans un Layout
app/code/MyVendor/MyModule/Block/ThemeHeader.php
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php /** * Copyright © 2020 Sodifrance. All rights reserved. * See COPYING.txt for license details. */ namespace MyVendor\MyModule\Block; use Magento\Framework\View\Element\Template; use \Magento\Customer\Model\Session; class ThemeHeader extends Template { /** * @var Session $customerSession */ protected $customerSession; public function __construct(Template\Context $context, Session $customerSession, array $data = []) { parent::__construct($context, $data); $this->customerSession = $customerSession; } public function getCustomerSession() { return $this->customerSession; } } |
app/design/frontend/MyVendor/mytheme/Magento_Theme/layout/default.xml
:
1 2 3 4 |
<!-- Récuperer la session client dans le header --> <referenceContainer name="header.container"> <referenceBlock name="theme.headers" class="MyVendor\MyModule\Block\ThemeHeader"/> </referenceContainer> |
app/design/frontend/MyVendor/mytheme/Magento_Theme/layout/default.xml
:
En en-tête de votre fichier PHTML:
1 2 |
// Check whether a customer is logged in or not $customerSession = $block->getCustomerSession(); |
Dans le même fichier PHTML, à l’endroit où vous souhaitez afficher le prénom lorsque l’utilisateur est connecté:
1 2 3 4 5 |
<?php if($customerSession->isLoggedIn()) : ?> <span class="label"><?= __('Hello') ?> <?= $customerSession->getCustomer()->getName(); ?></span> <?php else : ?> <span class="label"><?= __('Customer account') ?></span> <?php endif; ?> |
MAUVAISE PRATIQUE La même chose via l'objectManager
:
La création du Block et la déclaration de celui-ci dans un Layout comme vu plus haut est inutile si on invoque l'objectManager
. Invoquer constamment l’objectManager va poser des problèmes de performances.
En en-tête de votre fichier PHTML:
1 2 3 4 5 |
<?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); // Check whether a customer is logged in or not $customerSession = $objectManager->get('Magento\Customer\Model\Session'); ?> |
Vous allez trouver beaucoup de solutions proposant d’utiliser l’objectManager sur le net (stack overflow, autres…). Si elles ne sont pas optimales, elles peuvent quand-même vous apporter une information intéressante à savoir le Model à utiliser si vous souhaitez faire ça bine et créer un Block (dans notre exemple: Magento\Customer\Model\Session
. Regardez dans le code du block, plus haut dans ce billet, comment ce Model est déclaré puis exploité).