Я искал в Интернете, в книге / API cakePHP и в StackOverflow, но не могу найти ответ на этот вопрос. У меня проблема с созданием пользователя для приложения, которое я создаю. У меня есть правила проверки пароля для действия добавления в моем контроллере, которые работают просто отлично - никаких проблем нет, и даже компонент Auth рад. Я создал действие change_password, которое отлично работает с моей моделью данных (как в случае - изменения действительно происходят), но к нему не применяется проверка, даже если я назвал поля формы точно так же, как и с действием add.
Может ли несколько действий не использовать одну и ту же проверку? Придется ли мне немного переименовывать свои идентификаторы формы в действии change_password, а затем создавать новые проверочные переменные для соответствия этим? Это кажется мне неэффективным, но если я пойду по этому пути, я сделаю это.
Большое спасибо !!
John
РЕДАКТИРОВАТЬ, добавив фрагменты кода теперь, как это представляется целесообразным.
Первое действие:
function change_password($id = null) {
if (!empty($this->data)) {
if (!empty($this->data['User']['passwd'])) {
$this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']);
}
if ($this->User->save($this->data)) {
$this->Session->setFlash('Password has been changed');
$this->redirect(array('controller' => 'bookings', 'action' => 'index'));
} else {
$this->Session->setFlash('Password could not be changed');
}
}
Теперь правила проверки (обратите внимание, что они отлично работают для моего действия добавления, они просто не выполняют в change_password):
var $validate = array(
'first_name' => array(
'notempty' => array('rule' => array('notempty')),
),
'last_name' => array(
'notempty' => array('rule' => array('notempty')),
),
'email' => array(
'email' => array('rule' => array('email')),
),
'group_id' => array(
'numeric' => array('rule' => array('numeric')),
),
'active_user' => array(
'boolean' => array('rule' => array('boolean')),
),
'passwd' => array(
'rule' => array('minLength', '6'),
'message' => 'Password should be at least 6 characters long',
'required' => true,
'allowEmpty' => false,
'on' => 'create'
),
'passwd_confirm' => array(
'rule' => 'matchpwd',
'message' => 'Confirm password doesnt match'
),
);
function matchpwd($data){
if ($this->data['User']['passwd'] != $data['passwd_confirm'] ) {
return false;
}
return true;
}
Наконец, представление (хотя я не думаю, что добавление этого поможет, я все равно включаю его):
<div class="users form">
<?php echo $form->create('User', array('action'=>'change_password'));?>
<fieldset>
<legend><?php __('Change Password for "'.$User_to_change.'"');?></legend>
<?php
echo $form->input('id');
echo $form->input('passwd', array(
'type' => 'password')
);
echo $form->input('passwd_confirm', array(
'type' => 'password')
);
?>
</fieldset>
<?php echo $form->end('Submit');?>
</div>
В приведенном ниже ответе я упоминал, что валидация кажется "на полпути". Когда я пытаюсь ввести пароль в поле формы «passwd», но оставляю «passwd_confirm» пустым, действие сохранения контроллера не выполняется, и я вижу флэш-сообщение «Пароль не может быть изменен». Итак, очевидно, что в моих правилах проверки запускается функция matchpwd. Тем не менее, ввод пустых значений для обоих полей завершается успешно, так что это как если бы оно не соответствовало другим правилам проверки.
(Пожалуйста, извините, если отступ кода не отображается должным образом. Как вы можете видеть, я немного StackOverflow n00b)