Como obter o ID de cliente logado
Estou tentando obter o ID do cliente de um cliente conectado, mas não parece estar funcionando
no meu bloco
<?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();
}
}
Agora em arquivo phtml
<?php
$customerId = $customer->getCustomerId();
?>
qualquer sugestão ou problema no código, obrigado
Controlador de atualização
<?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();
}
}
Respostas
Se você não puder identificar o cliente em sua classe de bloco quando sua página atingir o cache de página inteira.
Você deve passar o ID do cliente como uma variável de contexto HTTP .
Vejo https://devdocs.magento.com/guides/v2.3/extension-dev-guide/cache/page-caching/public-content.html#configure-page-variations
Crie uma classe de plugin em 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>
No plugin, passe o ID do cliente atual como variável de contexto 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);
}
}
Depois disso, Inject, \Magento\Framework\App\Http\Contextem sua classe de bloco e obtenha este valor de id de cliente por$this->httpContext->getValue('current_cust_id')
Seu código de bloco precisa gostar deste:
public function getCustomerId()
{
if($this->_customerSession->isLoggedIn()): return $this->_customerSession->getCustomer()->getId();
endif;
}
E em phtml você precisa chamar assim:
<?php $customerId = $block->getCustomerId(); ?>
Seu código é perfeito. Estou assumindo que sua chamada de arquivo de bloco em seu .xmlarquivo e em arquivo de chamada de arquivo xml. .phtmlE você executa abaixo todos os comandos como: -
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
Depois de verificar sua saída. E novamente não mostrar sua saída, verifique o erro de log compartilhar comigo.
THANKS.
No arquivo de bloco, você precisa alterar o código conforme abaixo
De:
<?php
$customerId = $customer->getCustomerId();
?>
Para:
<?php
$customerId = $block->getCustomerId();
?>
Se o cliente estiver conectado, você não pode obter Da sessão Tente desta forma
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;
}
}
Use isso em seu arquivo de layout onde você adiciona seu bloco.
cacheable = "false"
<block class="VendoreName\ModuleName\Block\BlockName"
name="block_index_edit"
template="VendoreName_ModuleName::edit.phtml"
cacheable="false" />
Atualizar
Seu arquivo de controlador
<?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();
}
}
Seu arquivo de bloco
<?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();
}
}
Seu arquivo phtml
<?php
$customerId = $block->getCustomerId();
echo "Customer ID is ".$customerId;
?>
Espero que isso ajude você.