Müşterinin magento 2'de oturum açıp açmadığını nasıl kontrol edebilirim?


64

Nasıl müşteri veya değil Magento 2 açtıysa bulabilirsiniz.

Müşteri giriş yaptıysa, oturumdan müşteri verileri nasıl alınır?


burada belirtilen çözümün hiçbiri benim için çalıştı. @Rakesh: Sizin için nasıl çalıştığını paylaşır mısınız?
Ipsita Rout

Bir Magento JS modülünün ( text/x-magento-init) içinden giriş yapmış olduğunuz durumu kontrol etmeniz gerekirse, ObjectManager başlatmasını önleyerek ve durumu modülün config nesnesine geçirerek ve bunun yerine oturum açma bağlantısı için sorguyu sorgulayarak bazı ek masraflar kaydedebileceğinizi unutmayın. JS modülü içinde, örneğin:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan


1
Aşağıdaki satır ne yapıyor? var isLoggedIn = $ ('. yetkilendirme-link> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa,

Bağlantıyı kontrol et, rakeshjesadiya.com/…
Rakesh Jesadiya

Yanıtlar:


62

Kodları takip ederek müşteri girişini kontrol edebilir veya hiçbir yerde

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Müşteri \ Model \ Oturum');
if ($ customerSession-> isLoggedIn ()) {
   // müşteri giriş işlemi
}

Denetleyiciden

$ This -> _ objectManager-> get ( 'Magento \ Müşteri \ Modeli \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // müşteri giriş işlemi
}

1
Tabii ki, bu en belirgin çözüm ve ilk kez kullandım, ancak daha sonra müşteri oturumu henüz başlatılmadığında doğru çalışmadığını fark ettim, bu yüzden daha az belirgin fakat daha sürdürülebilir bir çözüm buldum.
Mage2.PRO 28:15

11
Kişi doğrudan objectmanager kullanmamalı. Sadece oturum modeli için oluşturulan ObjectFactory kodunu enjekte edin.
CarComp

6
lütfen cevabınızdaki diğer cevapları kopyalamayın.
Marius

6
bu "yanlış" yoldur, Raphael’in Dijital Piyanizm’deki cevabı en sert olanıdır
Lorenzo

1
Tam sayfa önbelleğini etkinleştirdiyseniz ve bunu blok / şablon olarak çağırdıysanız, müşteri oturumu her zaman boş döneceği için çalışmaz. Bunun yerine kontrol etmek için http bağlamını kullanın.
leo

84

Önemli hatırlatma: Kişi asla doğrudan Nesne Yöneticisini aramamalı

İşte burada nasıl temiz bir şekilde yapılacağını

Şablonlar hariç herhangi bir sınıfta

Öncelikle yapıcınıza aşağıdaki sınıfı enjekte etmeniz gerekir /Magento/Customer/Model/Session:

protected $_session;

public function __construct(
    ...
    \Magento\Customer\Model\Session $session,
    ...
) {
    ...
    $this->_session = $session;
    ...
}

Sonra sınıfınızda aşağıdakileri arayabilirsiniz:

if ($this->_session->isLoggedIn()) {
    // Customer is logged in 
} else {
    // Customer is not logged in
}

Bir şablonda

Bir şablonda biraz daha fazla çalışma gerektirir çünkü şablonu temiz bir şekilde yapmasını sağlayan blok için bir tercih belirlemeniz gerekir:

<preference for="Block\That\Renders\The\Template"
            type="Vendor\Module\Block\Your\Custom\Block" />

Sonra, özel blok kırıcınızda, herhangi bir sınıf için olduğu gibi aynı bağımlılık enjeksiyonunu izlemeniz gerekir (yukarıda açıklanmıştır).

Buradaki ek adım, bir müşterinin giriş yapıp yapmadığını kontrol etmek için şablonunuzda kullanılabilecek ortak bir yöntem oluşturmaktır.

public function isCustomerLoggedIn()
{
    return $this->_session->isLoggedIn();
}

Ardından şablonunuzda arayabilirsiniz:

if ($block->isCustomerLoggedIn()) {
    // Customer is logged in
} else {
    // Customer is not logged in
}

Müşteri oturumu henüz başlatılmadıysa alternatif

Bunu yapmak Magento\Framework\App\Http\Contextyerine kullanmanın bir yolu var .Magento/Customer/Model/Session

Sonra müşterinin giriş yapıp yapmadığını kontrol etmek $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)yerine arayabilirsin $this->_session->isLoggedIn().

Ancak bu yöntem size farklı sonuçlar verebilir, daha fazla bilgi için bu harika cevabı okumanızı öneririm: https://magento.stackexchange.com/a/92133/2380


<preference ... />Etiketi özel bir tema içerisinde nereye yerleştirmelisiniz ? Tam olarak ne Block\That\Renders\The\Templateve Vendor\Module\Block\Your\Custom\Block?
Andrea

@Andrea iyi bağlıdır ve her durum için farklı. Bu yüzden
cevabımda

class Html extends \Magento\Framework\View\Element\TemplateYapıcıdaki oturum nesnesini enjekte edebileceğim bir yer olarak tanımlanmış özel bir bloğum var . Ben (düzen xml dosyalarından) bu şekilde benim özel tema içinde bu bloğu kullanın: <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Kaydedilen kullanıcıyı şablon dosyası içinde kontrol etmek istiyorum my-custom-template.phtml. `<Tercih ... /> etiketini nasıl kullanmalıyım?
Andrea

Benim için çalışmıyor -> isLoggedin () yöntemi. Nedenini bilmiyorum ama müşterinin giriş yapması asla geri dönmüyor ve aslında öyle! Giriş yaptım (Giriş yaptım).
Vladimir Despotovic

@VladimirDespotovic alternatif yöntemi test ettiniz mi?
Raphael, Digital Pianism'de

31

Yoluyla Magento\Framework\App\Http\Contextveya yoluyla mümkündür Magento\Customer\Model\Session. Ancak, sonuç farklı olabilir:

  • HTTP bağlamı müşteri oturumundan daha önce başlatıldı (ancak her ikisi de eylem denetleyicilerinde başlatıldığından beri önemli değil)
  • Ne zaman PageCachemodülü (üretim muhtemelen her zaman) üzerindedir, en kısa sürede düzeni nesil başlar başlamaz, müşteri oturumu tarafından silinecektir akılda tutulması \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlüzerine alınabilir tüm sayfalarda. Bu, şimdi müşterinin HTTP bağlamı ile giriş yapmış olup olmadığını kontrol ederseniz, hala 'evet' diyeceği anlamına gelir, ancak müşteri verileri artık müşteri oturumunda kullanılamayacak. Dolayısıyla, müşteri oturumunda verilere erişmeye çalışmadan önce çift kontrol gereklidir. Bu, kolayca blokta gerçekleşebilir, eylem düzenleyicide olma olasılığı düşük olsa da, orada el ile düzen oluşturmanız beklenmez, eylem denetleyicisi örneğini döndürdükten sonra oluşturulur.ResultInterface

PageCache açıkken açıklanan tutarsızlık riskini ortadan kaldırmak için, önceden başlatılmışsa (işlem denetleyicileri için geçerlidir) müşteri oturumunu kullanmayı düşünün. Aksi takdirde HTTP bağlamını kullanın.


PageCache için harika ipucu etkin, thx
LucScu

3
@Alex Aşağıdaki kodu kullanıyorum $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Ancak önbellek etkin olduğundan Oturum açmış müşteriye Oturumu Kapatmak yerine Oturum Açma seçeneği gösteriliyor. Bunu nasıl düzeltmeliyim?
Nitesh

Bu bizi kıçından ısırdı, teşekkür ederim. Cevabınız daha fazla dikkat gerektiriyor :-) Üretimde önbellek etkinleştirilmiş olması oturumu zorlaştırıyor. Özel magento eklentileri yazıyorsanız, cachable = false rotanın XML dosyasına yerleştirin.
Ligemer

2
neden cachable = false koymak zorundasın?
LucScu

15
/** @var \Magento\Framework\App\ObjectManager $om */
$om = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Framework\App\Http\Context $context */
$context = $om->get('Magento\Framework\App\Http\Context');
/** @var bool $isLoggedIn */
$isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);

Peki nasıl müşteri almak @ Mage2.PRO giriş nedir?
xanka

8
ObjectManager'ı asla doğrudan kullanmamalısınız
7ochem

Evet kabul edildi. Objectmanager gitmenin yolu değil. Sınıf kurucusuna CustomerFactory'yi enjekte edin.
CarComp

Yukarıdaki çözüm benim için işe yaramıyor
Ipsita Rout

@lpsita Bu sorunu yaşarsanız bana bildirin. Sadece düzelttim :)
Jai

10

Bu çözümlerin hiçbiri benim için çalıştı. Bazı sayfalar giriş yapmış gibi görünmekle birlikte bazıları görünmeyecek. Görünüşe göre bu böcek:

https://github.com/magento/magento2/issues/3294

Şablonlarımda arayabileceğim bir yardımcı oluşturdum:

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens (carl@partfire.co.uk)
 * Company: PartFire Ltd (www.partfire.co.uk)
 **/
class Data extends AbstractHelper
{
    /**
     * @var \Magento\Framework\App\Http\Context
     */
    private $httpContext;

    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\App\Http\Context $httpContext
    ) {
        parent::__construct($context);
        $this->httpContext = $httpContext;
    }

    public function isLoggedIn()
    {
        $isLoggedIn = $this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
        return $isLoggedIn;
    }
}

Sonra şablonumdaki yardımcıyı şöyle kullanabilirdim:

<?php
$helper = $this->helper('MyVendor\MyModule\Helper\Data');

if ($helper->isLoggedIn()) {
    //show something
}

Bu doğru, benim için çalışan tek kod senin. Teşekkür ederim!
George George,

İçeriği ->getCustomer()->getName()kullanarak nasıl arayabilirim , çünkü Oturumu kullanırsam tüm sayfalarda çalışmıyor.
George George

tam sayfa önbelleği etkinse, doğru cevap budur. Önce müşteriyi kontrol edebilirsin ve eğer yanlış olursa, bunu yapabilirsin
CompactCode

9

Kullanıcının şablonda oturum açmasını sağlamak için, yalnızca bir satırda yardımcıyı çağırabilirsiniz:

<?php $_loggedin = $this->helper('Magento\Checkout\Helper\Cart')->getCart()->getCustomerSession()->isLoggedIn(); ?>

<?php if( $_loggedin ) : ?>

     <div><!-- add your code --></div>

<?php endif; ?>

ObjectManager kullanmadan güzel bir çözüm.
Nitesh,

2
Bu, üretim modunda FPC ve Vernik etkinken v2.1.5'te çalışmadı.
thdoan

8

Buradaki çözümlerin hiçbiri, Üretim modunda Tam Sayfa Önbelleği ve Cila etkinken Magento v2.1'de benim için güvenilir bir şekilde çalışmadı. Sonunda, fikrin alınmasından sonra tüm önbellekleme etkinken zamanın% 100'ünü çalıştıran bir çözüm buldum vendor/magento/module-theme/view/frontend/templates/html/header.phtml. İşte kullanıcı oturumu kapattığında "Giriş Yap" bağlantısını ve kullanıcı giriş yaptığında "Giriş Yap" bağlantısını gösteren çözümüm:

<li data-bind="scope: 'customer'">
  <!-- ko if: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/logout'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign Out') ?></a>
  <!-- /ko -->
  <!-- ko ifnot: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/login'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign In') ?></a>
  <!-- /ko -->
  <script type="text/x-magento-init">
  {
    "*": {
      "Magento_Ui/js/core/app": {
        "components": {
          "customer": {
            "component": "Magento_Customer/js/view/customer"
          }
        }
      }
    }
  }
  </script>
</li>

GÜNCELLEME: v2.1.5'ten beri bu çözüm artık güvenilir değil. Bir çözüm için sayı 9156'ya bakın .


Bu iyi bir çözümdür. Düzen dosyasında cachable = "false" kullanabilirsiniz.
Dinesh Dinesh

cachable="false"Bu blok için mizanpaj XML'im var , ancak vernik hala görünüşte önbelleğe alıyor. Bunun bir hata olup olmadığından emin değilim, ancak Nakavt bunu atlatmanın iyi bir yoludur. Tek dezavantajı, KO bağlanmasından dolayı Giriş / Çıkış bağlantısının görünmesinden önce küçük bir gecikme yaşanmasıdır.
thdoan

6

Böyle bir şeye giden bir sürü cevap var.

NESNE YÖNETİCİSİ YÜKLE SINIF MODELİ YÜKLE

Bu Magento2.0'da kullanılacak WRONG metodolojisidir. 2.0'da, otomatik olarak üretilen nesne fabrikaları gitmenin yoludur. Onları hemen hemen herhangi bir sınıfta kurucunuza enjekte edebilir ve kullanabilirsiniz. Örnek:

public function __construct(
            Context $context,
            CollectionFactory $cmspageCollectionFactory,
            array $data = [],
            CustomerFactory $customerFactory,
            SessionFactory $sessionFactory)
        {
            parent::__construct($context, $data);
            $this->_cmspageCollectionFactory = $cmspageCollectionFactory;
            $this->customerFactory = $customerFactory;
            $this->sessionFactory = $sessionFactory;
        }

        /**
         * @return \Stti\Healthday\Model\ResourceModel\Cmspage\Collection
         */
        public function getCmspages()
        {
            // First check to see if someone is currently logged in.
            $customerSession = $this->sessionFactory->create();
            if ($customerSession->isLoggedIn()) {
                // customer is logged in;
                //$customer = $this->customerFactory->create()->get
            }

2
Fabrikalar için bir hata alırsanız, örneğin tam yolunu kullanın \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan

Doğru. Genelde onları en üste ilan ediyorum, bu yüzden yöntemlerim çok büyük bir karışıklığa
benzemiyor.

3

Merhaba burada cevap var:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->create('Magento\Customer\Model\Session');

if ($customerSession->isLoggedIn()) {
    $customerSession->getCustomerId();  // get Customer Id
    $customerSession->getCustomerGroupId();
    $customerSession->getCustomer();
    $customerSession->getCustomerData();

    echo $customerSessionget->getCustomer()->getName();  // get  Full Name
    echo $customerSessionget->getCustomer()->getEmail(); // get Email
}

Kaynak .

$customerSession = $objectManager->get('Magento\Customer\Model\Session');

Create ile değiştirilenler şimdi iyi çalışıyor:

$customerSession = $objectManager->create('Magento\Customer\Model\Session');

4
Asla ObjectManagerdoğrudan kullanmamalısınız
7ochem

Bu, yalnızca önbellek etkin önbellekte devre dışı bırakılmadığında çalışır.
Jai

@ Jai, bu benim için geliştirme ve üretimde de çalışıyor. Lütfen bana sorunu yeniden oluşturma adımlarını gönderebilir misiniz?
Manish

Kullanıcının giriş yapıp yapmadığını kontrol etmeliyim. Ancak aşağıdaki kod yalnızca devre dışı bırakılmış önbellekte çalışır $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// KOD}
Jai

Önbelleğe almayı etkinleştirme: Yalnızca ana sayfada ve sitenin diğer sayfalarında olmayan özel pano sayfalarında çalışır. Sorum şu: magento.stackexchange.com/q/177964/29175
Jai

3

Bu aynı zamanda “Müşterinin Magento2'da Oturum Açıp Açmadığını Kontrol Etme” çözümünden biridir.

Aşağıdaki kodu deneyin:

 $om = \Magento\Framework\App\ObjectManager::getInstance();
 $context = $om->get('Magento\Framework\App\Http\Context');
 $isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
 if($isLoggedIn){
      echo "Yes Customer loggedin";
      echo "<pre>";print_r($context->getData()); 
 }

2

Aşağıdaki kodu deneyin:

<?php
namespace YourCompany\ModuleName\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Customer\Model\Session $customerSession
    ) {
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }

public function isLoggedIn() // You can use this fucntion in any phtml file
    {
        return $this->customerSession->isLoggedIn();
    }
}

Yukarıdaki kodu phtml dosyasında kullanmak için isLoggedIn () işlevini şu şekilde çağırabilirsiniz:

<?php $helper = $this->helper('YourCompany\ModuleName\Helper\Data'); ?>
<?php if($helper->isLoggedIn()) : ?>
    logged in
<?php else : ?>
    not logged in
<?php endif; ?> 

Umarım bu yardım teşekkürler.


Merhaba @Shubdham, çalışma değil ..
jafar pinjar

bu temiz bir çözüm. teşekkürler
Bytes

Evet, teşekkürler umarım size yardımcı olur.
Shubham Khandelwal

2

En iyi çözümü buldum. Müşterinin kimlik doğrulamasına dayanır . Vaka müşteri oturumunun bir kısmı işe yaramadı, ama her zaman çözümüm işe yarayacak. Hadi bir bakalım.

<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Block\Account\AuthorizationLink');
if ($customerSession->isLoggedIn() == true) {
//your code.
} ?>

Teşekkürler.


1

Güncel çalışan çözüm (IMHO)

<?php

namespace My\Module\Helper\Data;

/**
 * @var \Magento\Framework\ObjectManagerInterface
 */
protected $objectManager;

/**
 * @var \Magento\Customer\Model\SessionFactory
 */
protected $customerSession;

/**
 * Class Data
 */
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     */
    public function __construct(
         \Magento\Framework\ObjectManagerInterface $objectManager
    )
    {
        $this->objectManager   = $objectManager;
        $this->customerSession = $this->objectManager->create('Magento\Customer\Model\SessionFactory')->create();
    }

    /**
     * @return \Magento\Customer\Model\SessionFactory
     */
    public function getCustomerSession()
    {
       return $this->customerSession;     
    }

    /**
     * @return bool
     */
    public function isCustomerLoggedIn()
    {
        return ($this->getCustomerSession()->isLoggedIn()) ? true : false;
    }
}

1

Giriş yapmış olup olmadığını kontrol etmek istiyorsanız, bu kodu phtml dosyalarında kullanın.

$om = \Magento\Framework\App\ObjectManager::getInstance();
$appContext = $om->get('Magento\Framework\App\Http\Context');
$isLoggedIn = $appContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
if($isLoggedIn) {
    /** LOGGED IN CUSTOMER, this should work in template   **/
}

2
Hiçbir zaman ObjectManagerdoğrudan kullanmamalısınız ve bu tür bir kodu asla şablonda kullanmamalısınız. Bunu yönetmek için blok sınıfınızda işlevler oluşturmalısınız.
7:

Nasıl doğru bir şekilde yapıldığını öğrendikten sonra, nasıl başka bir şekilde yapabileceğini hiç merak ettin mi?
CarComp

0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}

0

Başka bir cevap:

<?php $_loggedin = $block->getLayout()->createBlock('Magento\Customer\Block\Account\AuthorizationLink')->isLoggedIn() ?>
 <?php if( $_loggedin ) : ?>
   // your code
 <?php endif; ?>

Ne düşünüyorsun?


0

Kayıtlı durumu Oturum modelinden almak, Magento varsayılan FPC önbelleğini etkinleştirdikten sonra kullanmak istemeniz durumunda çalışmaz, bu durumda bunun yerine SessionFactory kullanmanız gerekir.

FPC önbelleğe alma etkinse, oturum başlatılmadı, ayrıntılar: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Bunu çözmek SessionFactoryiçin, örneğin kullanmanız gerekir :

/**
* @var \Magento\Customer\Model\Session
*/
protected $_customerSessionFactory;

public function __construct(
    ....
    \Magento\Customer\Model\SessionFactory $customerSessionFactory
    ....
) 
{
    ....
    $this->_customerSessionFactory = $customerSessionFactory;
    ....
}

public function getCustomerId(){
  $customer = $this->_customerSessionFactory->create();
  echo $customer->getCustomer()->getId();
}

-1

Google'da bulunan birçok yolu denedim, ancak çözümün hiçbiri işe yaramadı. SO'nun çekirdek işlevselliğini kontrol ettim ve Object Manager'ı kullanmadan oturum açıp açmadığını kontrol etmek için bir php dosyası oluşturdum.


            / **
         * Müşteri oturumu
         * Web Teknoloji Kodları tarafından oluşturulan modül
         * Vinay Sikarwar tarafından geliştirildi
         * @var \ Magento \ Çerçeve \ Uygulama \ Http \ Bağlam
         * /
        $ oturumu korumalı;

        / **
         * Kayıt yapıcısı.
         * @param Bağlam $ bağlamı
         * @param dizi $ veri
         * /
        public işlev __construct (
            Bağlam $ bağlamı,
                    \ Magento \ Çerçeve \ Oturum \ Genel $ oturumu,
            $ data dizisi
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ bağlam, $ veri);
        }

            / **
         * Müşteri giriş durumunu kontrol etme
         *
         * @api
         * @return bool
         * /
        public işlevi isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Daha fazla bilgi için burada kontrol edin http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

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.