Magento-如何使用“辅助电子邮件”客户属性登录


Magento - How to Login with “Secondary Email” customer attribute?

客户如何使用其注册的主要电子邮件地址和次要电子邮件地址客户属性字段登录?(我已经创建了一个客户属性文本字段secondary_email)。

假设它与customerEntity有关,并且与人们为使用户名发挥作用所做的事情类似:http://www.magentocommerce.com/magento-connect/Sylvain_Raye/extension/7928/diglin_username

http://www.magentocommerce.com/boards/viewthread/195573/P15/

我只需要客户有一个单一的密码,但如果他们愿意,可以使用他们帐户中指定的备用电子邮件地址。

谢谢!

Magento与几乎所有其他基于PHP的框架没有什么不同,因为它有一个串行执行流。从请求流的角度来看,确定需求的入口点是处理登录表单POST的类。您可以在浏览器的渲染源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)
    }
}

我还没有真正研究过上面的片段,也不会保证它的安全性,但希望这能展示一个使用框架意识来回答这些类型问题的过程。这可能是一个不错的起点;在配置的类rewrite中有类似的东西,再加上添加secondary_email属性的设置脚本,这应该可以很快实现。

值得一提的是:

也可以通过观察运行时构造的controller_action_predispatch_customer_account_loginpost事件来实现这一点(请参见Mage_Core_Controller_Varien_Action::preDispatch())。虽然通常建议在可能的情况下使用事件观察系统进行功能重写,但这将是非常不直观的,也是最混乱的选择。