Magento - Как войти с атрибутом клиента «Secondary Email»? - PullRequest
2 голосов
/ 11 февраля 2012

Как клиент сможет войти в систему как с помощью своего основного адреса электронной почты, на который он подписан, так и с помощью поля атрибута клиента для дополнительного адреса электронной почты?(Я создал текстовое поле атрибута клиента second_email).

Предполагается, что это как-то связано с customerEntity и будет похоже на то, что люди делали, чтобы заставить работать имена пользователей: http://www.magentocommerce.com/magento-connect/Sylvain_Raye/extension/7928/diglin_username

или

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

Мне просто нужно, чтобы клиенты имели один пароль, но при желании могли бы использовать альтернативный адрес электронной почты, указанный в их учетной записи.

Спасибо!

1 Ответ

7 голосов
/ 12 февраля 2012

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()). Хотя обычно рекомендуется использовать систему наблюдения за событиями, чтобы по возможности выполнять функциональные переписывания, это было бы совершенно не интуитивным и самым грязным вариантом из всех.

...