Magento 2: Cách chuyển hướng khách hàng đến trang đăng nhập


7

Làm thế nào tôi có thể kiểm tra khách hàng đã đăng nhập hay không? Nếu khách hàng chưa đăng nhập thì làm thế nào để chuyển hướng anh ta đến trang đăng nhập ?

Tôi muốn làm điều này từ .phtmltập tin. Vì vậy, xin vui lòng giúp tôi theo đó.

Câu trả lời:


11

Nếu bạn muốn làm điều đó trực tiếp từ .phtmltập tin, hãy sử dụng đoạn mã sau:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

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

if(!$customerSession->isLoggedIn()) {
    $customerSession->setAfterAuthUrl($urlInterface->getCurrentUrl());
    $customerSession->authenticate();
}

Sau đó, sau khi đăng nhập, bạn sẽ được tự động chuyển hướng đến chế độ xem hiện tại.

Nhưng sử dụng Object Manager không phải là cách thực hành tốt. Bạn nên sử dụng tiêm phụ thuộc bất cứ khi nào có thể.


3
Các phiên bản trực tiếp của Trình quản lý đối tượng không phải là cách thực hành tốt nhất: magento.stackexchange.com/a/117101/1956
ryanF

Tuy nhiên, nhóm nòng cốt Magento sử dụng nó trong một vài mô hình. Câu hỏi là làm thế nào để thực hiện trực tiếp từ tệp .phtml và đây là câu trả lời :)
Bartłomiej Szubert

Szubert ... đủ công bằng ... chỉ tốt để lưu ý, tôi cho rằng.
ryanF

Tại sao nó sẽ đi vào vòng lặp chuyển hướng vô hạn
Naveenbos

9

@Krupali, nếu bạn kiên quyết về mã của mình đang được triển khai trong một mẫu, thì ví dụ của @Bartlomiej Szubert là lựa chọn tốt hơn. Nói chung, cách tốt nhất là ẩn đi các chi tiết triển khai đó khỏi mẫu của bạn và trừu tượng hóa logic sang một thứ khác (chặn hoặc trợ giúp).

Đây là một ví dụ về việc thực hiện trợ giúp:

<?php

namespace Ryan\CustomerRedirect\Helper;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\UrlInterface;

class Customer extends AbstractHelper
{
    /**
     * @var Session
     */
    private $customerSession;
    /**
     * @var UrlInterface
     */
    private $urlInterface;

    public function __construct(
        Context $context,
        Session $customerSession,
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->urlInterface = $context->getUrlBuilder();
    }

    public function redirectIfNotLoggedIn()
    {
        if (!$this->customerSession->isLoggedIn()) {
            $this->customerSession->setAfterAuthUrl($this->urlInterface->getCurrentUrl());
            $this->customerSession->authenticate();
        }
    }
}

Sau đó, trong mẫu của bạn, bạn có thể sử dụng một cái gì đó như thế này:

$this->helper('Ryan\CustomerRedirect\Helper\Customer')->redirectIfNotLoggedIn()

* không gian tên hiển thị là một ví dụ

Bằng cách này, mã của bạn có thể được sử dụng lại ở nơi khác ... và nếu bạn quyết định thay đổi logic triển khai về cách bạn đang kiểm tra nếu ai đó đăng nhập, bạn không phải thay đổi (các) mẫu của mình.


Ồ vâng. Điều này rất hữu ích với tôi.
Krupali

1
@Krupali, tôi rất vui vì điều này hữu ích. Bạn biết đấy, bạn có thể chỉ ra rằng một cái gì đó hữu ích bằng cách nâng cấp nó: D
ryanF

người trợ giúp trong mẫu thực sự cũng đang sử dụng OM, nhưng chỉ cần ẩn một cách độc đáo :)
Bartosz Kubicki

-1
Find the below working code from core file to redirect other page in controller.

<?php

namespace Vendorname\Yourmodulename\Controller\Contact;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Customer;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $customerSession;

    protected $customers;

    public function __construct(
        Context $context,
        Session $customerSession,
        Customer $customers
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->customers = $customers;       
    }

    public function execute()
    {   
        if ($this->customerSession->isLoggedIn()) {

            //Get customer by customerID.
            $customerId = $this->customerSession->getCustomerData()->getId();
            $customer = $this->customers->load($customerId);
            if($customer->getUserRole() != '' && $customer->getUserRole() == 'admin')
            { 
                $this->_view->loadLayout();
                $this->_view->getLayout()->initMessages();
                $this->_view->renderLayout();            
            }
        }
        else{

            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setPath('customer/account/login/');
            return $resultRedirect;        
        } 
    }
}   

1. điều kiện isLoggedIn()nên được thay thế bằng getCustomerGroupId()isLoggedInđang kiểm tra dựa trên khách hàng, nhưng FPC đang chuyển giá trị này cho NULL, không giống như nhóm khách hàng
Kate Suykovskaya
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.