Comment se connecter à l'identifiant client
J'essaie d'obtenir l'identifiant client d'un client connecté mais cela ne semble pas fonctionner
dans mon bloc
<?php
namespace Vendor\Module\Block;
use Magento\Framework\View\Element\Template;
use Magento\Backend\Block\Template\Context;
class Rfq extends \Magento\Framework\View\Element\Template
{
protected $_customerSession; public function __construct(Context $context,
\Magento\Customer\Model\Session $customerSession, array $data = [])
{
parent::__construct($context, $data);
$this->_customerSession = $customerSession;
}
public function getCustomerId()
{
if($this->_customerSession->isLoggedIn()): return $this->_customerSession->getCustomer()->getId();
endif;
}
public function execute()
{
$this->_view->loadLayout(); $this->_view->getLayout()->initMessages();
$this->_view->renderLayout();
}
}
Maintenant dans un fichier phtml
<?php
$customerId = $customer->getCustomerId();
?>
toute suggestion ou problème dans le code merci
Contrôleur de mise à jour
<?php
namespace Vendor\Module\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Result\PageFactory;
class Customer extends \Magento\Framework\App\Action\Action
{
protected $resultPageFactory;
public function __construct(
Context $context, PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context); } public function execute() { return $this->resultPageFactory->create();
$this->_view->loadLayout(); $this->_view->renderLayout();
}
}
Réponses
Si vous ne pouvez pas identifier le client dans votre classe de blocage lorsque votre page atteint le cache de page complète.
Vous devez transmettre l' ID client en tant que variable de contexte HTTP .
Voir https://devdocs.magento.com/guides/v2.3/extension-dev-guide/cache/page-caching/public-content.html#configure-page-variations
Créez une classe de plugin sur Magento\Framework\App\Action\AbstractAction.
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\App\Action\AbstractAction">
<plugin name="add_customr_id_full_page" disabled="false" sortOrder="20"
type="Devamitbera\Module\Plugin\Framework\App\Action"/>
</type>
</type>
</config>
Sur le plugin, transmettez l'ID client actuel en tant que variable de contexte http:
<?php
declare(strict_types=1);
namespace Devamitbera\Module\Plugin\Framework\App\Action;
use Magento\Customer\Model\Context as CustomerContext;
use Magento\Framework\Exception\NoSuchEntityException;
class AbstractAction
{
/**
* @var \Magento\Customer\Api\CustomerRepositoryInterface
*/
private $customerRepository; /** * @var \Magento\Customer\Model\Session */ private $customerSession;
/**
* @var \Magento\Framework\App\Http\Context
*/
private $httpContext; public function __construct( \Magento\Customer\Model\Session $customerSession,
\Magento\Framework\App\Http\Context $httpContext, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
) {
$this->customerSession = $customerSession;
$this->httpContext = $httpContext;
$this->customerRepository = $customerRepository;
}
public function aroundDispatch(
\Magento\Framework\App\ActionInterface $subject, callable $proceed,
\Magento\Framework\App\RequestInterface $request ) { $customerId = $this->customerSession->getCustomerId(); $this->httpContext->setValue(
'current_cust_id',
$customerId, 0 ); return $proceed($request);
}
}
Après cela, injectez \Magento\Framework\App\Http\Contextsur votre classe de bloc et obtenez cette valeur d'identifiant client en$this->httpContext->getValue('current_cust_id')
Votre code de bloc doit aimer celui-ci:
public function getCustomerId()
{
if($this->_customerSession->isLoggedIn()): return $this->_customerSession->getCustomer()->getId();
endif;
}
Et en phtml, vous devez appeler comme celui-ci:
<?php $customerId = $block->getCustomerId(); ?>
Votre code est parfait.Je suppose votre appel de fichier de bloc dans votre .xmlfichier et dans le fichier d'appel de fichier .phtmlxml.Et vous exécutez ci-dessous toutes les commandes comme: -
remove your var/cache
remove your var/view_preprocessed
php bin/magento setup:di:compile
php bin/magento s:up
php bin/magento s:s:d -f
php bin/magento c:c
php bin/magento c:f
Après avoir vérifié votre sortie.Et encore une fois, ne montrez pas votre sortie, vérifiez votre partage d'erreur de journal avec moi.
THANKS.
Dans le fichier de bloc, vous devez changer le code comme ci-dessous
De:
<?php
$customerId = $customer->getCustomerId();
?>
À:
<?php
$customerId = $block->getCustomerId();
?>
Si le client est connecté, vous ne pouvez pas accéder à la session Essayez de cette façon
public function __construct(
\Magento\Framework\App\Http\Context $customerContext, \Magento\Customer\Model\SessionFactory $customer
{
$this->customer = $customer;
$this->customerContext = $customerContext;
}
public function getCustomerID()
{
$customerLoggedIn= $this->customerContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
if($customerLoggedIn){ $customerId = $this->customer->create()->getCustomer()->getId(); return $customerId;
}
}
Utilisez-le dans votre fichier de mise en page où vous ajoutez votre bloc.
cacheable = "faux"
<block class="VendoreName\ModuleName\Block\BlockName"
name="block_index_edit"
template="VendoreName_ModuleName::edit.phtml"
cacheable="false" />
Mettre à jour
Votre fichier de contrôleur
<?php
namespace Vendor\Module\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Result\PageFactory;
class Customer extends \Magento\Framework\App\Action\Action
{
protected $resultPageFactory; public function __construct( Context $context,
PageFactory $resultPageFactory ) { $this->resultPageFactory = $resultPageFactory; parent::__construct($context);
}
public function execute()
{
return $this->resultPageFactory->create(); $this->_view->loadLayout();
$this->_view->renderLayout();
}
}
Votre fichier de bloc
<?php
namespace VendoreName\ModuleName\Block;
use Magento\Framework\View\Element\Template;
class Rfq extends Template
{
protected $request;
protected $sessionFactory; public function __construct( Template\Context $context,
\Magento\Framework\App\Request\Http $request, \Magento\Customer\Model\SessionFactory $sessionFactory,
array $data = [] ) { parent::__construct($context, $data); $this->sessionFactory = $sessionFactory; $this->request = $request; } public function getCustomerId() { // get customer id here $customerSession = $this->sessionFactory->create(); return $customerSession->getCustomer()->getId();
}
}
Votre fichier phtml
<?php
$customerId = $block->getCustomerId();
echo "Customer ID is ".$customerId;
?>
J'espère que ceci vous aide.