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)
}
}
Я на самом деле не изучал приведенный выше фрагмент, и я не буду ручаться за его безопасность, но, надеюсь, это демонстрирует процесс, с помощью которого можно ответить на эти типы вопросов, используя осведомленность о структуре. Это не может быть плохой отправной точкой; что-то похожее в сконфигурированном переписывании класса плюс скрипт установки для добавления атрибута secondary_email
, это должно быть быстро реализовано.
Примечание, которое стоит упомянуть:
Этого также можно достичь, наблюдая за созданным во время выполнения событием controller_action_predispatch_customer_account_loginpost
(см. Mage_Core_Controller_Varien_Action::preDispatch()
). Хотя обычно рекомендуется использовать систему наблюдения за событиями, чтобы по возможности выполнять функциональные переписывания, это было бы совершенно не интуитивным и самым грязным вариантом из всех.