Magento-在用户登录之前获取其登录的客户组ID

Magento-在用户登录之前获取其登录的客户组ID,magento,Magento,因此,在登录期间,我想检查用户是否在特定的客户组中,如果检查失败,则阻止登录 我扩展了AccountController,并添加了一个快速检查: $customer = Mage::getModel('customer/customer')->loadByEmail($login['username']); if ($customer->getGroupId() != 2) { $msg = Mage::getSingleton('core/session')->add

因此,在登录期间,我想检查用户是否在特定的客户组中,如果检查失败,则阻止登录

我扩展了AccountController,并添加了一个快速检查:

$customer = Mage::getModel('customer/customer')->loadByEmail($login['username']);
if ($customer->getGroupId() != 2) {
    $msg = Mage::getSingleton('core/session')->addError($this->__('You must have a wholesale account to access this area.'));
    header('Location: '. Mage::getUrl('customer/account/login'));
    exit;
}
但是,运行此操作将返回会话错误消息,“使用网站作用域时必须指定客户网站ID”

基本上,我只需要获取试图登录的用户的组id,我想我可以通过客户模型loadByEmail()中提供的方法获取它。但是,是的,今天是星期五,很明显,魔法师们要我呆到很晚

我尝试了许多方法来实现这一点,包括允许登录,然后检查ID,如果检查失败,则执行$session->logout(),但这阻止了我显示会话错误消息,因为logout()方法正在清除所有会话消息(包括'core/session')


有什么想法吗?

在使用
loadByEmail
方法之前,您应该设置
website\u id
。我知道,这看起来很奇怪,但这是由一个事实决定的,
customer
可能是一个网站范围的实体。因此,如果
customer
模型未分配给任何网站,则
loadByEmail
方法将引发异常

$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
        ->loadByEmail($login['username']);

在使用
loadByEmail
方法之前,您应该设置
website\u id
。我知道,这看起来很奇怪,但这是由一个事实决定的,
customer
可能是一个网站范围的实体。因此,如果
customer
模型未分配给任何网站,则
loadByEmail
方法将引发异常

$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
        ->loadByEmail($login['username']);

从纯性能的角度来看:只为了检查组id而执行完整的实体加载()是个坏主意。。我更喜欢在customer_entity表上使用专用的资源模型sql查询。nice point@Bixi;虽然客户实体是加载<代码>最便宜的实体之一(例如与产品相比),但它不包含内部对象,我个人认为这里没有必要使用直接DB请求;使用您的逻辑,我们应该重写整个Magento,并将Wordpress作为端点。AV实体对象的加载成本永远不会低。。。是的,为什么不重写magento?他们已经在做了(magento2),不久前就开始了(还记得销售模块表是eav,现在是平面的吗?)在magento中,您应该始终仔细考虑并调整攻击DB的方式。(load()>collection>custom query)。。。或者你只在任何地方使用load()。@Bixi对不起,我可能听起来有点刺耳:)我从来没有说过我们应该在Magento中始终使用对象包装器。根据你的任务,你应该自己选择正确的方法。然而,在这个特定的任务中,我认为使用DB适配器没有任何必要。顺便说一句,EAV实体的加载方式与平面加载方式相同,只要您不将EAV表中的列包含到选择中。是的,销售表的非规范化与性能没有任何关系。。。长话短说,你可以选择任何你可以选择的选项,只是不要使用电锯,当一把刀可能会有误解,但你混淆了收集和对象:load()?“EAV实体的加载方式与平面加载方式相同,只要您不将EAV表中的列包含到选择中”=>这在使用集合时是正确的。但这里我们讨论的是整个EAV对象上的load(),从纯性能的角度来看,客户的所有数据都是用load()加载的:只为了检查组id而进行完整实体加载()是个坏主意。。我更喜欢在customer_entity表上使用专用的资源模型sql查询。nice point@Bixi;虽然客户实体是加载<代码>最便宜的实体之一(例如与产品相比),但它不包含内部对象,我个人认为这里没有必要使用直接DB请求;使用您的逻辑,我们应该重写整个Magento,并将Wordpress作为端点。AV实体对象的加载成本永远不会低。。。是的,为什么不重写magento?他们已经在做了(magento2),不久前就开始了(还记得销售模块表是eav,现在是平面的吗?)在magento中,您应该始终仔细考虑并调整攻击DB的方式。(load()>collection>custom query)。。。或者你只在任何地方使用load()。@Bixi对不起,我可能听起来有点刺耳:)我从来没有说过我们应该在Magento中始终使用对象包装器。根据你的任务,你应该自己选择正确的方法。然而,在这个特定的任务中,我认为使用DB适配器没有任何必要。顺便说一句,EAV实体的加载方式与平面加载方式相同,只要您不将EAV表中的列包含到选择中。是的,销售表的非规范化与性能没有任何关系。。。长话短说,你可以选择任何你可以选择的选项,只是不要使用电锯,当一把刀可能会有误解,但你混淆了收集和对象:load()?“EAV实体的加载方式与平面加载方式相同,只要您不将EAV表中的列包含到选择中”=>这在使用集合时是正确的。但这里我们讨论的是整个EAV对象上的load(),客户的所有数据都是用load()加载的