Как сохранить автоматически сгенерированный пароль в CakePHP?


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

if (!empty($this->data)) {
    $this->User->create();

    $random_pass = $this->Auth->password($this->generatePassword());

    // Doesn't work:
    $user_data['User'] = $this->data['User'];
    $user_data['User']['password'] = $random_pass;
    if ($this->User->save($user_data)) { /* ... */ }

    // Doesn't work:
    $this->User->set('password', $random_pass);
    if ($this->User->save($this->data)) { /* ... */ }

    // Doesn't work:
    $this->data['User']['password'] = $random_pass;
    if ($this->User->save($this->data)) { /* ... */ }

    // Doesn't work:
    $this->data['User'][0]['password'] = $random_pass; 
    if ($this->User->saveAll($this->data)) { /* ... */ }

}

Согласно Почему поле пароля CakePHP пусто при попытке доступа к нему с помощью $this - > data? это потому, что компонент Auth удаляет пароль. Кажется, достаточно распространенным, не так ли? Так как же мне передвигаться это?

Дополнительная информация

Я использую эту функцию для генерации пароля. В представлении add есть только три поля: first_name, last_name и email (которое назначается полю username в компоненте Auth).

4 2

4 ответа:

Прежде всего.. вы можете сделать

$random_pass = $this->Auth->password($this->generatePassword());
pr($random_pass);

Чтобы убедиться, что в этой переменной действительно есть данные...

Затем вы можете сохранить эти данные...

$this->data['User']['password'] = $random_pass;
$this->User->save($this->data);

Также имейте это в виду... во время тестирования у вас есть если (!пустой($this - > data)) поэтому убедитесь, что вы действительно тестируете, введя какую-то форму данных по умолчанию где-то в вашей форме.

Может быть, у вас есть некоторые правила проверки, определенные в вашей пользовательской модели, которые не удовлетворены? Вы можете попробовать проверить это, напечатав $this->validationErrors (или просто проверить модель пользователя, чтобы увидеть, есть ли какие-либо правила).

Джонп ответил на этот вопрос в комментариях. Я был не в значение beforesave действий. Удалили и теперь он работает отлично. Еще раз спасибо, Джонп!

Я использую Cake PHP 2.3.3 и следующий код работает для меня

public function recover()
{
  if ($this->request->is('post') )
  {
    $this->loadModel('AclManagement.User');
    $passwords = AuthComponent::password($this->data['User']['password']);
    $this->User->query("UPDATE users SET password = '".$passwords."' WHERE password_change = '".$this->request->data['User']['id']."' ");
    $this->Session->setFlash(__('Password Saved Sucessfully'), 'success');
    $this->redirect(array('action' => 'login'));
  } else {
    $this->set('resettoken', $_REQUEST['id']);
  }
}