Событие / Наблюдатель за сменой пароля клиента?

10

Я ищу способ подключиться к случаю, когда клиенты меняют свои пароли. Так что, если кто-то изменит пароль в интерфейсе клиента, я хотел бы отправить электронное письмо куда-нибудь.

Я ознакомился со списком по адресу http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/, но ничто не выглядит как событие для смены паролей.

oschloebe
источник
Любая идея, какой наблюдатель / событие использовать, когда клиент сбрасывает свой пароль, используя /customer/account/resetpassword/?id=ab&token=xyz?
oschloebe

Ответы:

9

Благодаря Фабиану Блехшмидту я придумал следующее, которое работает для меня (используя событие customer_save_before):

public function detectPwdChange(Varien_Event_Observer $observer) {
    $event              = $observer->getEvent();
    $customer           = $event->getCustomer();
    $postData           = Mage::app()->getRequest()->getPost();

    if($customer instanceof Mage_Customer_Model_Customer && !$customer->isObjectNew()) {

        if( $postData['change_password'] == 1 && $postData['current_password'] != $postData['password'] ) {
            // Do something
        }
    }

    return $this;
}
oschloebe
источник
Мне не нравится запрос на пост, но если он работает, отлично :-)
Фабиан Блехшмидт
Это работает, да. :-) Я пробовал несколько методов и вспомогательных функций, чтобы получить пароль, но все, что я смог получить, это хеш пароля, но мне нужно было его легко прочитать, и это то, что предлагал объект POST. Еще раз спасибо!
oschloebe
Не делайте странных вещей с паролем, таких как сохранение его в виде открытого текста или плохого шифрования ;-)
Фабиан Блехшмидт
1
Я не буду, обещал! Просто отправляю его в PRISM. ;-)
oschloebe
это не работает как для сброса пароля, так как есть только passwordи confirmationв данных поста. протестировано с
v1.9
5

Посмотрите на код.

Вы можете использовать customer_save_afterсобытие и просто проверить

/app/code/core/Mage/Customer/controllers/AccountController.php:724
$customer->setChangePassword(1);

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

Фабиан Блехшмидт
источник
Пока спасибо. Насколько я вижу, событие также срабатывает, когда клиент успешно зарегистрирован. Есть ли способ / способ проверить, был ли клиент уже зарегистрирован и пароль действительно изменился?
oschloebe
в событии _before вы можете проверить, существует ли идентификатор объекта
Fabian Blechschmidt
4

Я хотел сделать что-то подобное, но вместо этого я получил его код:

Я подсел на controller_action_postdispatch_customer_account_resetpasswordpost

function resetpasswordpost(Varien_Event_Observer $observer) {
    $customer_id = Mage::app()->getRequest()->getParam('id');
    $customer = Mage::getModel('customer/customer')->load($customer_id);
}

Я думаю, что он немного чище и "безопаснее", чем ссориться с самим паролем!

Барри Карлион
источник
Mage::app()->getRequest()->getParam('id')является нулевым в этом событии. также в преддиспетчере. passwordи confirmationдоступен в Mage::app()->getRequest()->getParams()Тхо. (Протестировано с
версией