Magento 2 Nhận ID khách hàng từ phiên trong một lớp khối


11

Làm thế nào để có được ID khách hàng từ phiên? Tôi đã thử điều này nhưng không hiệu quả.

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
Nếu khách hàng đăng nhập thì bạn có thể lấy id khách hàng nếu không sẽ trả về null bằng cách sử dụng '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

Tôi đã đăng nhập nhưng nó trả về null. Và tôi đang làm điều đó trong lớp khối.
Paul

Lớp học nào bạn sử dụng?
Sohel Rana

Tôi chỉ thấy rằng $this->session->isLoggedIn()trả về true trong lớp trình điều khiển của tôi nhưng trả về false trong lớp khối của tôi. Tại sao?
Paul

4
Khối phải được đặt cacheable=falsexem Magento 2 - Nhận ID khách hàng từ phiên trong lớp khối
Lukas Komarek

Câu trả lời:


23

Đó là bản sao làm việc. Bạn có thể so sánh với lớp khối của bạn. Ở đây tôi sử dụng Form là lớp khối

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
Tôi đã làm chính xác như vậy nhưng nó vẫn trả về null. Và $this->customerSession->isLoggedIn()là sai luôn. Tôi làm tương tự trong một lớp điều khiển và nó hoạt động tốt.
Paul

Cuối cùng, nó hoạt động. Tôi không chắc những gì tôi đã thay đổi.
Paul

bạn đã vô hiệu hóa bộ đệm toàn bộ trang có thể?
davideghz

Vâng, đó là bộ nhớ cache Tôi gặp vấn đề tương tự<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

Tôi đã vô hiệu hóa bộ nhớ cache vẫn còn trả về null
Ajwad Syed

4

Khi bạn xác định khối sử dụng phiên Bạn phải tắt bộ đệm cho nó.

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

2
điều này sẽ khiến toàn bộ trang và mọi trang sử dụng khối này sẽ bị FPC BỎ L
Doni Wibowo

@DoniWibowo là đúng, nhưng bạn cần cẩn thận khi lưu các trang có dữ liệu động ở vị trí đầu tiên. Bạn không muốn hiển thị cùng tên cho tất cả khách hàng chẳng hạn.
Radu

3

Bạn cần tiêm \Magento\Customer\Model\Session $customerSession,lớp để lấy ID khách hàng từ phiên khách hàng.

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
}

LƯU Ý : Bạn chỉ nhận được id khách hàng nếu khách hàng đăng nhập và khởi tạo phiên khách hàng


1

Nó dường như hoạt động khi bạn chuyển đối tượng Ngữ cảnh cho lớp cha trước khi khởi tạo phiên khách hàng:

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
Lạ Tôi quan sát điều tương tự. Cảm ơn bạn vì sự giúp đỡ. Tôi tự hỏi tại sao điều này làm cho một sự khác biệt.
nshiff

0

Mặc dù chúng tôi đang tiêm phiên khách hàng theo khối để truy xuất dữ liệu khách hàng đã đăng nhập và chúng tôi không nhận được dữ liệu khách hàng từ khối vì Magento 2 đặt lại tất cả các phiên của khách hàng khi FPC được bật.

Vui lòng sử dụng bộ nhớ cache = "false" cho bloick trong bố cục của bạn:

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

Trong trường hợp này, Magento 2 bỏ qua trang này khỏi bộ nhớ đệm.


Làm thế nào để sử dụng bộ nhớ cache = "false" trong các trang cms?
jafar pinjar

0

Nếu bạn chỉ cần customer_idsau đó mà không tải toàn bộ đối tượng (xem phương getCustomerthức phương thức), bạn có thể lấy nó bằng cách sử dụng getCustomerIdphương thức.

Như getIdphương thức cũng gọi getCustomerIdphương thức.

tệp: nhà cung cấp / magento / mô-đun khách hàng / Mô hình / Phiên.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

Đầu tiên, tạo một thể hiện trong tệp header.phtml như bên dưới và nếu có nhiều hơn một cửa hàng và một người muốn nhận thư chỉ trong một trong các cửa hàng.

nhập mô tả hình ảnh ở đây

<?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
    }
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.