Magento 2ブロッククラスのセッションから顧客IDを取得する


12

セッションからお客様IDを取得する方法は?私はこれを試しましたが、うまくいきませんでした。

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
顧客がログインした場合、顧客IDを取得できます。それ以外の場合は、 '$ this-> _ customerSession-> getCustomer()-> getId()'を使用してnullを返します
Sohel Rana

ログインしましたが、nullを返します。そして、私はそれをブロッククラスでやっています。
ポール・

どのセッションクラスを使用しますか?
Sohel Rana

$this->session->isLoggedIn()コントローラークラスではtrue を返すが、ブロッククラスではfalseを返すことがわかりました。どうして?
ポール

4
ブロックが設定されている必要がありcacheable=false参照ブロッククラスのセッションから顧客IDを取得します- Magentoの2
ルーカスKomarek

回答:


24

作業コピーです。ブロッククラスと比較できます。ここでは、フォームをブロッククラスとして 使用しています

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
私はまったく同じことをしましたが、それでもnullを返します。そして、$this->customerSession->isLoggedIn()常に偽です。私はコントローラクラスでも同じことを行い、それは正常に動作します。
ポール

最後に、それは動作します。何が変わったのかわかりません。
ポール

多分全ページキャッシュを無効にしましたか?
davideghz 2017年

はい、それは私が同じ問題を抱えていたキャッシュでした<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
ジュリアーノ・バルガス

キャッシュを無効にしたままnullを返す
Ajwad Syed

4

\Magento\Customer\Model\Session $customerSession,カスタマーセッションからカスタマーIDを取得するには、クラスを注入する必要があります。

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
}

:顧客がログインして顧客セッションが初期化された場合にのみ、顧客IDを取得します


4

セッションを使用するブロックを定義するときは、そのキャッシュを無効にする必要があります。

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

2
これによりページ全体が発生し、このブロックを使用するすべてのページがFPCによって見落とされます
Doni

@DoniWibowoは真実ですが、動的データを含むページを最初にキャッシュするときは注意が必要です。たとえば、すべての顧客に同じ名前を表示する必要はありません。
ラドゥ

1

カスタマーセッションをインスタンス化する前にContextオブジェクトを親クラスに渡すと、機能するようです。

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

FPCが有効になっている場合、Magento 2はすべての顧客セッションをリセットするため、ログインしている顧客データを取得するために顧客セッションをブロックに挿入し、ブロックから顧客データを取得していません。

レイアウトのブリックにはcacheable = "false"を使用してください:

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

この場合、Magento 2はこのページのキャッシュを無視します。


cmsページでcacheable = "false"を使用する方法
jafar pinjar

0

customer_idオブジェクト全体をロードせずにthen だけが必要な場合(メソッドgetCustomerメソッドを参照)、メソッドを使用するだけで取得できますgetCustomerId

通りgetIdの方法も呼び出すgetCustomerId方法。

ファイル:vendor / magento / module-customer / 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

まず、以下のようにheader.phtmlファイルにインスタンスを作成します。また、複数のストアが利用可能であり、そのうちの1つのストアのみでメールを取得したい場合も同様です。

ここに画像の説明を入力してください

<?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.