Перенаправление на страницу входа в систему, если не войти в magento
Я хочу ограничить количество посетителей для одного магазина на веб-сайте с несколькими магазинами. Если они не вошли в систему, перенаправьте их на страницу входа. Они также могут создать учетную запись и войти в систему после посещения веб-сайта. Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать.
3 answers
Для этого вы можете создать модуль.
Сначала вам нужно объявить наблюдателя на событии controller_action_predispatch
: app/code/local/Vendor/Module/etc/config.xml
<config>
<modules>
<Vendor_Module>
<version>0.0.1</version>
</Vendor_Module>
</modules>
<global>
<models>
<module>Vendor_Module_Model</module>
</models>
</global>
<frontend>
<events>
<controller_action_predispatch>
<observers>
<vendor_module_controller_action_predispatch>
<type>singleton</type>
<class>module/observer</class>
<method>preDispatch</method>
</vendor_module_controller_action_predispatch>
</observers>
</controller_action_predispatch>
</events>
</frontend>
</config>
Затем в app/code/local/Vendor/Module/Model/Observer.php
пожалуйста, обратите внимание, что вам нужно заменить STORE_ID
идентификатором магазина, в котором вы хотите реализовать эту функцию :
<?php
class Vendor_Module_Model_Observer {
public function preDispatch(Varien_Event_Observer $observer)
{
$controller = $observer->getControllerAction();
if (Mage::app()->getStore()->getId() == STORE_ID) {
if ('customer' === $controller->getRouteName()) {
return $this;
}
if (!Mage::getSingleton('customer/session')->authenticate($controller)) {
$controller->setFlag('', 'no-dispatch', true);
}
}
}
}
И app/etc/modules/Vendor_Module.xml
<?xml version="1.0"?>
<config>
<modules>
<Vendor_Module>
<active>true</active>
<codePool>local</codePool>
<depends>
<Magento_Customer/>
</depends>
</Vendor_Module>
</modules>
</config>
Вы можете создать наблюдателя для события controller_action_predispatch
.
Метод наблюдателя может выглядеть следующим образом:
public function redirectNotLogged(Varien_Event_Observer $observer)
{
$storeId = Mage::app()->getStore()->getId();
$restrictedStoreId = your restricted store id here. It can even come from a config setting.
if ($storeId == $restrictedStoreId) {
$action = strtolower(Mage::app()->getRequest()->getActionName());
$controller = strtolower(Mage::app()->getRequest()->getControllerName());
$openActions = array(
'create',
'createpost',
'login',
'loginpost',
'logoutsuccess',
'forgotpassword',
'forgotpasswordpost',
'resetpassword',
'resetpasswordpost',
'confirm',
'confirmation'
);
if ($controller == 'account' && in_array($action, $openActions)) {
return $this; //if in allowed actions do nothing.
}
if(! Mage::helper('customer')->isLoggedIn()){
Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('customer/account/login'));
}
}
}
Magento 2
<?php
namespace BA\GiftCertificate\Controller\CustAccount;
use Magento\Customer\Model\Session;
use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Framework\View\Result\PageFactory;
class Index implements \Magento\Framework\App\ActionInterface
{
/**
* @var \Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
/**
* @var \Magento\Framework\Controller\Result\RedirectFactory
*/
protected $resultRedirect;
/**
* @var \Magento\Customer\Model\Session
*/
protected $customerSession;
/**
* @param \Magento\Framework\Controller\Result\RedirectFactory $resultRedirect
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
* @param \Magento\Customer\Model\Session $customerSession
*/
public function __construct(
RedirectFactory $resultRedirect,
PageFactory $resultPageFactory,
Session $customerSession
) {
$this->resultRedirect = $resultRedirect;
$this->resultPageFactory = $resultPageFactory;
$this->customerSession = $customerSession;
}
/**
* Default customer account page
*
* @return void
*/
public function execute()
{
if (!$this->customerSession->isLoggedIn()) {
/** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirect->create();
$resultRedirect->setPath('customer/account/login');
return $resultRedirect;
} else {
return $this->resultPageFactory->create();
}
}
}