Comment se connecter à l'identifiant client

Sep 04 2020

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

3 AmitBera Sep 08 2020 at 17:42

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')

1 DhirenVasoya Sep 07 2020 at 13:23

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(); ?>
MohitPatel Sep 05 2020 at 19:01

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.

RiteshSantra Sep 05 2020 at 21:46

Dans le fichier de bloc, vous devez changer le code comme ci-dessous

De:

<?php
$customerId = $customer->getCustomerId();
?>

À:

<?php
$customerId = $block->getCustomerId();
?>
WaqarAli Sep 07 2020 at 17:19

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;
    }
}
Msquare Sep 07 2020 at 16:45

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.