客户如何能够使用他们注册的主电子邮件地址以及辅助电子邮件地址客户属性字段登录? (我已经创建了一个客户属性文本字段secondary_email)。
假设它与customerEntity有关,并且与人们为使用户名工作而做的事情类似:http://www.magentocommerce.com/magento-connect/Sylvain_Raye/extension/7928/diglin_username
或
http://www.magentocommerce.com/boards/viewthread/195573/P15/
我只需要客户拥有1个单一密码,但如果他们愿意,可以使用他们帐户中指定的备用电子邮件地址。
谢谢!
答案 0 :(得分:7)
Magento与几乎所有其他基于PHP的框架没有区别,因为它具有串行执行流程。从请求流的角度思考,满足您的需求的入口点将是处理登录表单POST的类。您可以在rendered source in your browser:action="https://demo.magentocommerce.com/customer/account/loginPost/"
中看到这一点。
上述URI解析为方法Mage_Customer_AccountController::loginPostAction()
。在那里找到登录控制器动作的典型登录逻辑:用户是否已登录?是用户在登录数据中发布?登录数据有效吗?等等。这很快指向客户会话模型Mage_Customer_Model_Session
,特别是authenticate()
方法。在此方法中调用Mage_Customer_Model_Customer->loadByEmail()
,它将我们带到Mage_Customer_Model_Entity_Model-> loadByEmail()`。
此时,我们知道我们可以重写资源模型并更改其loadByEmail()
以处理辅助电子邮件方法(凌乱和突兀)的查找。我们还可以重写和更改Mage_Customer_Model_Session->authenticate()
,提供一些预处理,以便通过辅助电子邮件首先加载客户记录,然后提取主电子邮件并允许事情正常进行。
//rewritten authenticate method
public function authenticate($username,$password) {
$customer = Mage::getResourceModel('customer/customer_collection')
->addAttributeToFilter('secondary_email',$username)
->getFirstItem();
//check we found customer record by secondary email
if ($customer->getId()) {
parent::authenticate($login,$customer->getEmail());
}
else {
parent::authenticate($username,$password)
}
}
我没有真正研究过上面的代码片段,也不会保证其安全性,但希望这能够证明使用框架意识来回答这些类型问题的过程。这可能不是一个糟糕的起点;在配置的类重写中添加类似的内容以及添加secondary_email
属性的安装脚本,这应该可以快速实现。
值得一提的说明:
也可以通过观察运行时构造的controller_action_predispatch_customer_account_loginpost
事件来实现这一点(参见Mage_Core_Controller_Varien_Action::preDispatch()
)。虽然通常建议在可能的情况下使用事件观察系统来实现功能性重写,但这将是非常不直观的,也是最简单的选择。