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();
}
Paul
sumber
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
4
Blok harus diatur, cacheable=falselihat Magento 2 - Dapatkan ID pelanggan dari sesi dalam kelas blok
Lukas Komarek

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();
    }
}
Sohel Rana
sumber
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

Pangeran Patel
sumber
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>
Marcin Żurek
sumber
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();
    }
}
ax_pernot
sumber
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.

Khan arman
sumber
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();
}
Knight017
sumber
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
    }
?>
SHEESHRAM
sumber