Bagaimana cara memeriksa apakah pelanggan masuk atau tidak di Magento 2?

64

Bagaimana menemukan apakah pelanggan masuk atau tidak di Magento 2.

Jika pelanggan login, lalu bagaimana cara mendapatkan data pelanggan dari sesi?

Rakesh Jesadiya
sumber
tidak ada solusi yang disebutkan di sini yang berfungsi untuk saya. @Rakesh: dapatkah Anda membagikan cara kerjanya untuk Anda?
Ipsita Rout
Ingatlah bahwa jika Anda perlu memeriksa status login dari dalam modul Magento JS ( text/x-magento-init), maka Anda dapat menyimpan beberapa overhead dengan menghindari instantiation ObjectManager dan meneruskan status ke objek konfigurasi modul, dan sebagai gantinya meminta tautan login dari dalam modul JS, misalnya:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan
1
Apa yang dilakukan garis di bawah ini? var isLoggedIn = $ ('. otorisasi-link> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa
Periksa tautan, rakeshjesadiya.com/...
Rakesh Jesadiya

Jawaban:

62

Kode berikut Anda dapat memeriksa login pelanggan atau tidak di mana pun

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // tindakan login pelanggan
}

Dari pengontrol

$ this -> _ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // tindakan login pelanggan
}
Sohel Rana
sumber
1
Tentu saja, ini adalah solusi yang paling jelas, dan saya menggunakannya pertama kali, tetapi kemudian saya perhatikan bahwa itu tidak berfungsi dengan benar ketika sesi pelanggan belum diinisialisasi, jadi saya telah menemukan solusi yang kurang jelas tetapi lebih berkelanjutan.
Mage2.PRO
11
Seseorang seharusnya tidak menggunakan objectmanager secara langsung. Cukup menyuntikkan kode yang dihasilkan ObjectFactory untuk model sesi.
CarComp
6
tolong jangan menyalin jawaban lain dalam jawaban Anda.
Marius
6
ini adalah cara yang "salah", jawaban dari Raphael di Digital Pianism adalah yang paling kuat
Lorenzo
1
Jika Anda telah mengaktifkan cache halaman penuh dan Anda menyebutnya dalam blok / templat, itu tidak berfungsi karena sesi pelanggan akan selalu kembali kosong. Gunakan konteks http untuk memeriksanya.
leo
84

Pengingat penting: Seseorang seharusnya tidak pernah memanggil Object Manager secara langsung

Jadi, inilah cara melakukannya dengan cara yang bersih

Di kelas mana pun kecuali template

Anda pertama-tama harus menyuntikkan kelas berikut di konstruktor Anda /Magento/Customer/Model/Session::

protected $_session;

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

Kemudian di kelas Anda, Anda dapat memanggil yang berikut:

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

Dalam sebuah templat

Ini membutuhkan sedikit lebih banyak pekerjaan dalam templat karena Anda harus menyiapkan preferensi untuk blok yang membuat templat untuk melakukannya dengan cara yang bersih:

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

Kemudian di contrusctor blok khusus Anda, Anda perlu mengikuti injeksi dependensi yang sama seperti untuk kelas apa pun (dijelaskan di atas).

Langkah ekstra di sini adalah membuat metode publik yang dapat digunakan dalam templat Anda untuk memeriksa apakah pelanggan masuk atau tidak

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

Kemudian dalam templat Anda, Anda dapat menghubungi:

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

Alternatif jika sesi pelanggan belum diinisialisasi

Ada cara lain untuk melakukannya yang menyiratkan menggunakan Magento\Framework\App\Http\ContextbukanMagento/Customer/Model/Session

Kemudian Anda dapat menelepon $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)alih-alih $this->_session->isLoggedIn()untuk memeriksa apakah pelanggan masuk atau tidak.

Namun metode ini dapat memberi Anda hasil yang berbeda , saya sarankan Anda membaca jawaban yang bagus ini untuk informasi lebih lanjut: https://magento.stackexchange.com/a/92133/2380

Raphael di Digital Pianism
sumber
Di mana <preference ... />tag harus ditempatkan di dalam tema khusus? Apa sebenarnya Block\That\Renders\The\Templatedan apa Vendor\Module\Block\Your\Custom\Block?
Andrea
@ Andrea juga tergantung dan berbeda untuk setiap kasus. Itu sebabnya saya menggunakan nama jalur kelas umum dalam jawaban saya
Raphael di Digital Pianism
Saya memiliki blok khusus yang didefinisikan sebagai class Html extends \Magento\Framework\View\Element\Templatetempat saya dapat menyuntikkan objek sesi di konstruktor. Saya menggunakan blok ini dalam tema kustom saya dengan cara ini (dari file layout xml): <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Saya ingin memeriksa pengguna yang dicatat dalam file templat my-custom-template.phtml. Bagaimana saya harus menggunakan tag `<preferensi ... />?
Andrea
Tidak berfungsi untuk saya - - isLoggedin () method. Saya tidak tahu mengapa tetapi tidak pernah mengembalikan bahwa pelanggan login, dan itu sebenarnya! Sudah masuk (saya masuk).
Vladimir Despotovic
@VladimirDespotovic apakah Anda menguji metode alternatif?
Raphael di Digital Pianism
31

Dimungkinkan melalui Magento\Framework\App\Http\Contextatau melalui Magento\Customer\Model\Session. Namun, hasilnya mungkin berbeda:

  • Konteks HTTP diinisialisasi lebih awal dari sesi pelanggan (tetapi tidak masalah karena keduanya diinisialisasi dalam pengendali tindakan)
  • Ketika PageCachemodul aktif (mungkin selalu pada produksi), perlu diingat bahwa segera setelah pembuatan tata letak dimulai, sesi pelanggan akan dihapus \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlpada semua halaman yang dapat di-cache. Ini berarti bahwa jika Anda sekarang memeriksa apakah pelanggan masuk melalui konteks HTTP, itu masih akan mengatakan 'ya', tetapi data pelanggan tidak akan tersedia dalam sesi pelanggan lagi. Jadi periksa ulang diperlukan sebelum mencoba mengakses data di sesi pelanggan. Ini dapat dengan mudah terjadi di blok, sementara tidak mungkin dalam kontroler tindakan karena Anda tidak diharapkan untuk menghasilkan tata letak secara manual di sana, itu akan dihasilkan setelah kontroler aksi mengembalikan instance dariResultInterface

Untuk menghilangkan risiko inkonsistensi yang dijelaskan saat PageCache aktif, pertimbangkan untuk menggunakan sesi pelanggan, jika sudah diinisialisasi (berlaku untuk pengendali tindakan). Lain menggunakan konteks HTTP.

Alex Paliarush
sumber
petunjuk yang bagus untuk PageCache diaktifkan, thx
LucScu
3
@Alex Saya menggunakan kode di bawah ini $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Tetapi karena cache memungkinkan Ini menunjukkan opsi Masuk bukannya Keluar untuk pelanggan yang masuk. Bagaimana saya memperbaikinya?
Nitesh
Ini menggigit kita, terima kasih. Jawaban Anda perlu lebih diperhatikan :-) Cache yang diaktifkan dalam produksi membuat sesi menjadi sulit. Masukkan cachable = false dalam file XML rute jika Anda menulis plugin magento khusus.
Ligemer
2
mengapa Anda harus meletakkan cachable = false?
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);
Mage2.PRO
sumber
jadi bagaimana cara mendapatkan custommer adalah login @ Mage2.PRO?
xanka
8
Anda seharusnya tidak pernah menggunakan ObjectManager secara langsung
7ochem
Ya setuju. Objectmanager bukan cara untuk pergi. Suntikkan CustomerFactory di konstruktor kelas.
CarComp
Solusi di atas tidak bekerja untuk saya
Ipsita Rout
@ lpsita Beri tahu saya jika Anda memiliki masalah ini? Saya baru saja memperbaikinya :)
Jai
11

Tidak ada solusi yang berhasil untuk saya. Beberapa halaman tampaknya masuk tetapi yang lain tidak. Sepertinya ini adalah bug:

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

Saya akhirnya membuat pembantu yang bisa saya panggil di templat saya:

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens ([email protected])
 * 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;
    }
}

Lalu saya bisa menggunakan helper di templat saya seperti:

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

if ($helper->isLoggedIn()) {
    //show something
}
Carl Owens
sumber
Itu benar, satu-satunya kode yang bekerja pada saya adalah milik Anda. Terima kasih!
George George
Bagaimana saya bisa menelepon ->getCustomer()->getName()menggunakan konteks, karena Jika saya menggunakan Sesi tidak berfungsi untuk semua halaman.
George George
jika cache halaman penuh diaktifkan ini adalah jawaban yang benar. Anda dapat memeriksa pelanggan terlebih dahulu dan jika itu kembali salah, Anda dapat melakukan ini
CompactCode
9

Untuk membuat pengguna masuk di templat, Anda cukup memanggil pembantu hanya dalam satu baris:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>
Afham
sumber
Solusi yang bagus tanpa menggunakan objectmanager.
Nitesh
2
Ini tidak berfungsi di v2.1.5 dengan FPC dan Varnish diaktifkan dalam mode produksi.
thdoan
8

Tidak ada solusi di sini yang bekerja untuk saya dengan andal di Magento v2.1 dengan Cache Halaman Penuh dan Varnish diaktifkan dalam mode Produksi. Saya akhirnya menemukan solusi yang bekerja 100% dari semua waktu dengan semua caching diaktifkan setelah mendapatkan ide dari vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Ini solusi saya, yang memperlihatkan tautan "Masuk" saat pengguna keluar dan tautan "Keluar" saat pengguna masuk:

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

PEMBARUAN: Sejak v2.1.5 solusi ini tidak lagi dapat diandalkan. Lihat masalah 9156 untuk solusinya.

Terima kasih
sumber
Ini solusi yang bagus. Meskipun Anda dapat menggunakan cachable = "false" di file layout.
Dinesh Yadav
Saya memiliki cachable="false"tata letak XML untuk blok ini, tetapi pernis masih caching rupanya. Tidak yakin apakah ini bug atau tidak, tetapi Knockout adalah cara yang baik untuk menghindari hal ini. Satu-satunya downside adalah bahwa ada sedikit keterlambatan sebelum tautan Masuk / Keluar muncul karena pengikatan KO.
thdoan
6

Ada banyak jawaban di luar sana yang seperti ini ...

DAPATKAN MODEL LOAD UP MODEL MANAGER OLEH DOU STUFF

Ini adalah metodologi yang SALAH untuk digunakan di Magento2.0. Pada 2.0, pabrik objek yang dibuat secara otomatis adalah cara untuk pergi. Anda dapat menyuntikkannya ke konstruktor di hampir semua kelas dan menggunakannya. Contoh:

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
            }
CarComp
sumber
2
Jika Anda mendapatkan kesalahan untuk pabrik, gunakan jalur lengkap, mis \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan
Benar. Saya biasanya menyatakan mereka di atas, supaya metode saya tidak terlihat seperti kekacauan besar :)
CarComp
3

Halo mendapat jawaban di sini:

$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
}

Sumber .

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

Ganti get with create now berfungsi dengan baik:

$customerSession = $objectManager->create('Magento\Customer\Model\Session');
Manish
sumber
4
Anda tidak boleh menggunakan ObjectManagersecara langsung
7ochem
Ini hanya berfungsi jika cache dinonaktifkan tidak dalam cache yang diaktifkan.
Jai
@Jai, ini bekerja untuk saya dalam pengembangan dan produksi juga. Tolong bisakah Anda mengirimkan saya langkah-langkah untuk mereproduksi masalah ini?
Manish
Saya harus memeriksa apakah pengguna masuk atau tidak. Tetapi kode di bawah ini hanya berfungsi di cache yang dinonaktifkan $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai
Di aktifkan di-cache: Ini hanya berfungsi pada halaman dasbor khusus tidak di halaman rumah dan halaman situs lainnya. Pertanyaan saya: magento.stackexchange.com/q/177964/29175
Jai
3

Ini juga salah satu solusi "Periksa apakah Pelanggan Masuk atau tidak di Magento2"

Coba kode di bawah ini:

 $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()); 
 }
Soundararajan m
sumber
2

Coba kode di bawah ini:

<?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();
    }
}

Untuk menggunakan kode di atas dalam file phtml, Anda dapat memanggil fungsi isLoggedIn () sebagai:

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

Semoga bantuan ini terimakasih.

Shubham Khandelwal
sumber
hai @Shubdham, ini tidak berfungsi ..
jafar pinjar
ini adalah solusi yang rapi. terima kasih
Tanyakan Bytes
Ya terima kasih semoga membantu Anda.
Shubham Khandelwal
2

Saya sudah mendapatkan solusi terbaik. Ini didasarkan pada otentikasi pelanggan . Beberapa sesi pelanggan kasus tidak berfungsi, tetapi setiap kali solusi saya akan berhasil. Mari lihat.

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

Terima kasih.

Rafiqul Islam
sumber
1

Solusi saat ini bekerja (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;
    }
}
Coresh
sumber
1

Jika Anda ingin memeriksa pelanggan yang masuk atau tidak, gunakan kode ini dalam file phtml,

$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   **/
}
Purvesh
sumber
2
Anda seharusnya tidak pernah menggunakan ObjectManagersecara langsung dan Anda tidak boleh menggunakan jenis kode ini dalam templat. Anda harus membuat fungsionalitas di kelas blok Anda untuk mengelola ini.
7ochem
Begitu Anda tahu cara melakukannya dengan benar, Anda bertanya-tanya bagaimana Anda pernah mengaturnya dengan cara lain!
CarComp
0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}
Divya
sumber
0

Jawaban lain:

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

Bagaimana menurut anda?

xanka
sumber
0

Mengambil status yang dicatat dari model Sesi tidak akan berfungsi jika Anda ingin menggunakannya setelah mengaktifkan cache FPC default Magento, dalam hal ini, Anda harus menggunakan SessionFactory sebagai gantinya.

Sesi tidak dimulai jika caching FPC diaktifkan, detail: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Untuk mengatasi ini, Anda harus menggunakan SessionFactory, misalnya:

/**
* @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();
}
Wolfack
sumber
-1

Saya mencoba banyak cara yang ditemukan di google tetapi tidak ada solusinya bekerja. SO Saya memeriksa fungsionalitas inti dan membuat file php untuk memeriksa apakah pelanggan masuk atau tidak tanpa menggunakan Object Manager.


            / **
         * Sesi pelanggan
         * Modul yang dibuat oleh Kode Teknologi Web
         * Dikembangkan oleh Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Konteks
         * /
        sesi $ dilindungi;

        / **
         * Pendaftaran konstruktor.
         * @param Konteks $ konteks
         * @param array $ data
         * /
        fungsi publik __construct (
            Konteks $ konteks,
                    \ Magento \ Framework \ Session \ Generic $ session,
            array $ data
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ context, $ data);
        }

            / **
         * Memeriksa status login pelanggan
         *
         * @api
         * @ mengembalikan bool
         * /
        fungsi publik isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Untuk info lebih lanjut, periksa di sini http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Vinay Sikarwar
sumber