Magento 2 Bir blok sınıfındaki oturumdan müşteri kimliğini alma


12

Oturumdan müşteri kimliği nasıl alınır? Bunu denedim ama işe yaramadı.

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
Müşteri giriş yaptıysanız, müşteri kimliğini alabilirsiniz, aksi takdirde '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

Giriş yaptım ama null döndürüyor. Ve bunu blok sınıfında yapıyorum.
Paul

Hangi oturum sınıfını kullanıyorsunuz?
Sohel Rana

Ben sadece bu $this->session->isLoggedIn()denetleyici sınıfında doğru ancak bloğum sınıfında yanlış döndü bulundu . Neden?
Paul

Yanıtlar:


25

Çalışma kopyası. Blok sınıfınızla karşılaştırabilirsiniz. Burada Form'u blok sınıfı olarak kullanıyorum

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
Tam olarak aynı şeyi yaptım ama yine de null. Ve $this->customerSession->isLoggedIn()her zaman yanlıştır. Aynı şeyi bir denetleyici sınıfında yapıyorum ve iyi çalışıyor.
Paul

Sonunda işe yarıyor. Neyi değiştirdiğimden emin değilim.
Paul

tam sayfa önbelleğini devre dışı bıraktınız mı?
davideghz

Evet önbellek <block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

Hala geri dönen null önbelleğini devre dışı bıraktım
Ajwad Syed

4

\Magento\Customer\Model\Session $customerSession,Müşteri oturumundan müşteri kimliği almak için sınıf enjekte etmeniz gerekir .

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
}

NOT : Müşteri kimliğini yalnızca müşteri giriş yaptıysa ve müşteri oturumu başlatıldıysa alırsınız


4

Oturumu kullanan bloğu tanımladığınızda Bunun için önbelleği devre dışı bırakmanız gerekir.

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

2
bunun bu blok FPC tarafından özlenecek kullanmak tüm sayfayı ve her sayfayı neden olur
Doni Wibowo

@DoniWibowo bu doğru, ancak öncelikle dinamik veri içeren sayfaları önbelleğe alırken dikkatli olmanız gerekir. Örneğin, tüm müşteriler için aynı adı görüntülemek istemezsiniz.
Radu

1

Context nesnesini üst sınıfa geçirdiğinizde, müşteri oturumunu başlatmadan önce çalışıyor gibi görünüyor:

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
Garip. Aynı şeyi gözlemliyorum. Yardım için teşekkürler. Bunun neden bir fark yarattığını merak ediyorum.
nshiff

0

Oturum açmış müşteri verilerini geri almak için müşteri oturumunu blok halinde enjekte ederken ve Magento 2, FPC etkinleştirildiğinde tüm müşteri oturumlarını sıfırladığından müşteri verilerini bloktan almıyoruz.

Lütfen düzeninizdeki bloick için cacheable = "false" kullanın:

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

Bu durumda, Magento 2 bu sayfayı önbelleğe almayı dikkate almaz.


cms sayfalarında cacheable = "false" nasıl kullanılır?
jafar pinjar

0

customer_idTüm nesneyi yüklemeden yalnızca o zaman ihtiyacınız varsa (yöntem getCustomeryöntemine bakın ), sadece getCustomerIdyöntemi kullanarak alabilirsiniz .

getIdYöntem olarak yöntemi çağırır getCustomerId.

dosya: satıcı / magento / modül-müşteri / 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

Öncelikle, header.phtml dosyasında aşağıdaki gibi bir örnek oluşturun ve birden fazla mağaza varsa ve mağazalardan yalnızca birine posta almak istiyorsanız.

resim açıklamasını buraya girin

<?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
    }
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.