Magento 2 รับรหัสลูกค้าจากเซสชันในคลาสบล็อก


12

จะรับรหัสลูกค้าจากเซสชันได้อย่างไร ฉันลอง แต่ไม่ได้ผล

protected $_customerBonusPointFactory;
protected $_customerSession;

public function __construct(Session $customerSession, \Magento\Framework\View\Element\Template\Context $context) {
    $this->_customerSession = $customerSession;
    parent::__construct($context);
}

public function _prepareLayout() {
    var_dump($this->_customerSession->getCustomer()->getId());
    exit();
    return parent::_prepareLayout();
}

2
หากลูกค้าลงชื่อเข้าใช้คุณจะได้รับรหัสลูกค้ามิฉะนั้นจะส่งคืน null โดยใช้ '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

ฉันได้เข้าสู่ระบบ แต่มันกลับเป็นโมฆะ และฉันทำมันในคลาสบล็อก
พอล

คลาสเซสชันใดที่คุณใช้
Sohel Rana

ฉันเพิ่งพบว่าการ$this->session->isLoggedIn()คืนค่าเป็นจริงในคลาสคอนโทรลเลอร์ของฉัน แต่คืนค่าเท็จในคลาสบล็อกของฉัน ทำไม?
พอล

คำตอบ:


25

มันใช้งานได้ คุณสามารถเปรียบเทียบกับคลาสบล็อกของคุณ ที่นี่ฉันใช้แบบฟอร์มเป็นคลาสบล็อก

namespace Vendor\Module\Block;


class Form extends \Magento\Framework\View\Element\Template
{
    protected $customerSession;

    /**
     * Construct
     *
     * @param \Magento\Framework\View\Element\Template\Context $context
     * @param \Magento\Customer\Model\Session $customerSession
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Customer\Model\Session $customerSession,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->customerSession = $customerSession;
    }

    public function _prepareLayout()
    {

        var_dump($this->customerSession->getCustomer()->getId());
        exit();
        return parent::_prepareLayout();
    }
}

1
ฉันทำอย่างเดียวกัน แต่ก็ยังคืนค่าว่าง และ$this->customerSession->isLoggedIn()เป็นเท็จเสมอ ฉันทำแบบเดียวกันในคลาสคอนโทรลเลอร์และทำงานได้ดี
Paul

ในที่สุดมันก็ใช้งานได้ ฉันไม่แน่ใจว่าสิ่งที่ฉันมีการเปลี่ยนแปลง
เปาโล

คุณปิดการใช้งานแคชแบบเต็มหน้าหรือเปล่า
davideghz

ใช่มันเป็นแคชฉันมีปัญหาเดียวกัน<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

ฉันปิดการใช้งานแคชยังคงเป็นโมฆะคืน
Ajwad Syed

4

คุณต้องฉีด\Magento\Customer\Model\Session $customerSession,คลาสเพื่อรับรหัสลูกค้าจากเซสชันลูกค้า

protected $_customerSession;

public function __construct(
    ...
    \Magento\Customer\Model\Session $customerSession,
    ...
) {
    ...
    $this->_customerSession = $customerSession;
    ...
}

public function getCustomer()
{
    echo $this->_customerSession->getCustomer()->getId(); //Print current customer ID

    $customerData = $this->_customerSession->getCustomer(); 
    print_r($customerData->getData()); //Print current Customer Data
}

หมายเหตุ : คุณจะได้รับรหัสลูกค้าเฉพาะเมื่อลูกค้าเข้าสู่ระบบและเซสชั่นลูกค้าเริ่มต้น


4

เมื่อคุณกำหนดบล็อกที่ใช้เซสชันคุณต้องปิดการใช้งานแคช

 <block class="Vendor\Module\Block\Index" name="Name"
 template="Vendor_Module::template/path.phtml" cacheable="false">
 </block>

2
สิ่งนี้จะทำให้ทั้งหน้าและทุกหน้าที่ใช้บล็อกนี้จะพลาดโดย FPC
Doni Wibowo

@DoniWibowo ที่เป็นจริง แต่คุณต้องระวังเมื่อทำการแคชเพจด้วยข้อมูลแบบไดนามิกตั้งแต่แรก คุณไม่ต้องการแสดงชื่อเดียวกันสำหรับลูกค้าทั้งหมด
Radu

1

ดูเหมือนว่าจะทำงานเมื่อคุณส่งวัตถุบริบทไปที่คลาสพาเรนต์ก่อนที่จะสร้างอินสแตนซ์ของเซสชันลูกค้า:

class History extends \Magento\Framework\View\Element\Template
{

    /**
     * @var Session
     */
    protected $_session;

    public function __construct(
        Template\Context $context,
        \Magento\Customer\Model\Session $session,
        array $data
    )
    {
        parent::__construct($context, $data);
        $this->_session = $session;
    }

    public function _prepareLayout()
    {

        var_dump($this->_session->getCustomerId());
        exit();
        return parent::_prepareLayout();
    }
}

2
แปลก ฉันสังเกตสิ่งเดียวกัน ขอบคุณสำหรับความช่วยเหลือ. ฉันสงสัยว่าทำไมสิ่งนี้ถึงสร้างความแตกต่าง
nshiff

0

ในขณะที่เรากำลังฉีดเซสชันลูกค้าในบล็อกเพื่อดึงข้อมูลลูกค้าที่บันทึกไว้อีกครั้งและเราไม่ได้รับข้อมูลลูกค้าจากบล็อกเนื่องจาก Magento 2 รีเซ็ตเซสชันลูกค้าทั้งหมดเมื่อเปิดใช้งาน FPC

โปรดใช้ cacheable = "false" สำหรับ bloick ในเลย์เอาต์ของคุณ:

<referenceContainer name="content"> 
        <block class="Arman\Test\Block\List" name="list" template="Arman_Test::list.phtml" cacheable="false"> 
        </block>
    </referenceContainer>  

ในกรณีนี้ Magento 2 ละเว้นหน้านี้จากการแคช


วิธีการใช้ cacheable = "false" ในหน้า cms?
jafar pinjar

0

หากคุณต้องการเฉพาะวัตถุcustomer_idนั้นโดยไม่ต้องโหลดวัตถุทั้งหมด (ดูวิธีgetCustomerการ) คุณสามารถรับมันได้โดยใช้getCustomerIdวิธีการ

ในฐานะที่เป็นgetIdวิธีการยังเรียกgetCustomerIdวิธีการ

ไฟล์: ผู้ขาย / magento / โมดูล - ลูกค้า / รุ่น / Session.php

/**
 * Retrieve customer model object
 *
 * @return Customer
 * use getCustomerId() instead
 */
public function getCustomer()
{
    if ($this->_customerModel === null) {
        $this->_customerModel = $this->_customerFactory->create()->load($this->getCustomerId());
    }

    return $this->_customerModel;
}


/**
 * Retrieve customer id from current session
 *
 * @api
 * @return int|null
 */
public function getCustomerId()
{
    if ($this->storage->getData('customer_id')) {
        return $this->storage->getData('customer_id');
    }
    return null;
}

/**
 * Retrieve customer id from current session
 *
 * @return int|null
 */
public function getId()
{
    return $this->getCustomerId();
}

0

ก่อนอื่นให้สร้างอินสแตนซ์ในไฟล์ header.phtml ดังต่อไปนี้และหากมีร้านค้ามากกว่าหนึ่งร้านและหนึ่งร้านต้องการรับเมลในร้านค้าแห่งเดียวเท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่

<?php
    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();        
    $storeManager  = $objectManager->get('\Magento\Store\Model\StoreManagerInterface');
    $storeID       = $storeManager->getStore()->getStoreId(); 
    $storeName     = $storeManager->getStore()->getName();
?>

<?php
    $customerSession = $om->get('Magento\Customer\Model\Session');
    if($customerSession->isLoggedIn()) {
            echo $customerSession->getCustomer()->getId(); // get ID
    }
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.