CE1.9.1.1 - Внедрение пользовательской логики в событие входа в систему
Мне нужно реализовать пользовательское требование на сайте, который я обновляю. На этом сайте настроено несколько магазинов с 4 представлениями магазинов, и каждое представление магазина имеет определенную группу клиентов, поэтому при регистрации в этом представлении магазина клиенты автоматически добавляются в эту группу. Теперь я должен убедиться, что клиенты могут входить только в тот магазин, в котором они изначально зарегистрировались. У меня уже есть Account Sharing Options
, настроенный на Per Website
.
URL-адреса, представленные в качестве примера в виде следует:
www.mysite.com/agency-abc/customer/account/login/
www.mysite.com/agency-xyz/customer/account/login /
Итак, моя идея состоит в том, чтобы подключиться к событию controller_action_predispatch_customer_account_loginPost
и проверить идентификатор группы клиента в настройках магазина. Я подключил наблюдателя (который, как я знаю, запускается) в качестве теста следующим образом:
Config.xml
<frontend>
<events>
<controller_action_predispatch_customer_account_loginPost>
<observers>
<logincheck>
<class>logincheck/observer</class>
<method>loginCheck</method>
</logincheck>
</observers>
</controller_action_predispatch_customer_account_loginPost>
</events>
</frontend>
Model/Observer.php ( отказ от ответственности: код заимствован из другого поста здесь обмен стеками)
class Kalldis_LoginCheck_Model_Observer
{
public function loginCheck(Varien_Event_Observer $observer)
{
$customer = $observer->getEvent()->getCustomer();
$session = Mage::getSingleton('customer/session');
// **** hard-coding groupid as a test
if ($customer->getGroupId() == 8)
{
$session->setId(null)
->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID)
->getCookie()->delete('customer');
Mage::throwException('You are not allowed to login to this store.');
return;
}
//die("observed");
}
}
К сожалению, я получаю следующую ошибку:
Неустранимая ошибка: Вызов функции-члена getGroupId() для не-объекта в...Model/Observer.php в строке 16
Я не уверен, правильно ли использовать это событие и/или я неправильно пытаюсь получить доступ к данным клиента.
Буду искренне признателен за любую помощь!
* РЕДАКТИРОВАТЬ НА ОСНОВЕ ОТВЕТА КАЙСАРА НИЖЕ
Model/Observer.php
class Kalldis_LoginCheck_Model_Observer
{
public function loginCheck(Varien_Event_Observer $observer)
{
$customer = $observer->getEvent()->getCustomer();
$session = Mage::getSingleton('customer/session');
$storeId = Mage::app()->getStore()->getId();
if ($customer->getStoreId() !== $storeId)
{
$session->setId(null)
->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID)
->getCookie()->delete('customer');
Mage::throwException('You are not allowed to login to this store.');
return;
}
}
}
1 answers
Вместо controller_action_predispatch_customer_account_loginPost
Используйте событие customer_login
, после чего вы сможете получить доступ к сеансу клиента . поскольку для текущего события
пользователь еще не вошел в систему.