Magento 2 Dapatkan ID pelanggan dari sesi dalam kelas blok


12

Bagaimana cara mendapatkan ID pelanggan dari sesi? Saya mencoba ini tetapi tidak berhasil.

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
Jika pelanggan login maka Anda bisa mendapatkan id pelanggan kalau tidak itu akan mengembalikan nol menggunakan '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

Saya telah masuk tetapi mengembalikan nol. Dan saya melakukannya di kelas blok.
Paul

Kelas sesi apa yang Anda gunakan?
Sohel Rana

Saya baru saja menemukan bahwa $this->session->isLoggedIn()mengembalikan true di kelas controller saya tetapi return false di kelas blok saya. Mengapa?
Paul

Jawaban:


25

Ini copy pekerjaan. Anda dapat membandingkan dengan kelas blok Anda. Di sini saya menggunakan Formulir sebagai kelas blok

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
Saya melakukan hal yang persis sama tetapi masih mengembalikan nol. Dan $this->customerSession->isLoggedIn()itu selalu salah. Saya melakukan hal yang sama di kelas controller dan berfungsi dengan baik.
Paul

Akhirnya berhasil. Saya tidak yakin apa yang telah saya ubah.
Paul

Sudahkah Anda menonaktifkan cache halaman penuh?
davideghz

Ya itu adalah cache Saya pernah mengalami masalah yang sama<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

Saya menonaktifkan cache masih kembali nol
Ajwad Syed

4

Anda perlu menyuntikkan \Magento\Customer\Model\Session $customerSession,kelas untuk mendapatkan ID pelanggan dari sesi pelanggan.

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
}

CATATAN : Anda hanya mendapatkan id pelanggan jika pelanggan masuk dan sesi pelanggan diinisialisasi


4

Ketika Anda menentukan blok yang menggunakan sesi Anda harus menonaktifkan cache untuk itu.

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

2
ini akan menyebabkan seluruh halaman dan setiap halaman yang menggunakan blok ini akan DILEPASKAN oleh FPC
Doni Wibowo

@DoniWibowo itu benar, tetapi Anda harus berhati-hati saat melakukan caching halaman dengan data dinamis. Misalnya, Anda tidak ingin menampilkan nama yang sama untuk semua pelanggan.
Radu

1

Tampaknya berfungsi ketika Anda meneruskan objek konteks ke kelas induk sebelum memulai sesi pelanggan:

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
Aneh. Saya mengamati hal yang sama. Terima kasih atas bantuannya. Saya bertanya-tanya mengapa ini membuat perbedaan.
nshiff

0

Saat kami menyuntikkan sesi pelanggan di blok untuk mengambil kembali data pelanggan yang masuk dan kami tidak mendapatkan data pelanggan dari blok karena Magento 2 mengatur ulang semua sesi pelanggan ketika FPC diaktifkan.

Silakan gunakan cacheable = "false" untuk bloick di layout Anda:

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

Dalam hal ini, Magento 2 mengabaikan halaman ini dari caching.


bagaimana cara menggunakan cacheable = "false" di halaman cms?
jafar pinjar

0

Jika Anda hanya membutuhkan customer_iditu tanpa memuat seluruh objek (lihat metode getCustomermetode), Anda bisa mendapatkannya hanya dengan menggunakan getCustomerIdmetode.

Sebagai getIdmetode juga memanggil getCustomerIdmetode.

file: vendor / magento / modul-pelanggan / Model / 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

Pertama, buat instance dalam file header.phtml seperti di bawah ini dan juga jika lebih dari satu toko tersedia dan seseorang ingin mendapatkan email hanya di salah satu toko.

masukkan deskripsi gambar di sini

<?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
    }
?>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.