Проверка пароля CakePHP в форме редактирования - PullRequest
0 голосов
/ 09 июня 2011

Я использую простую регистрационную форму для CakePHP.

Это мой вид редактирования:

<h2>Add User</h2>
<?php echo $form->create('User');
echo $form->input('first_name');
echo $form->input('last_name');
echo $form->input('email');
echo $form->input('address');
echo $form->input('phone');
echo $form->end('Edit');?>

Это мои правила проверки в User.php

class User extends AppModel {

    var $name = 'User';
    var $validate = array(

         (... more rules here ...)

        'password' => array('rule' => array('confirmPassword', 'password'),
                            'message' => 'Passwords do not match'),
        'password_confirm' => array('rule' => 'alphanumeric',
                                    'required' => true)
    );

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

Я нашел миллиарды способов обойти эту проблему (отключить проверку при сохранении, выбрать поля для сохранения, ...), но мне интересно, каков «правильный» способ CakePHP сделать это? Кажется, такая простая проблема, но я не могу найти документацию о том, как это сделать чистым способом.

Чтобы сделать мой вопрос более понятным: я не хочу редактировать страницу пользователя, где пароли могут быть изменены.

Ответы [ 3 ]

3 голосов
/ 10 июня 2011

Я использую несколько наборов проверки:

В вашей модели или app_model переопределите функцию validates следующим образом:

function validates($options = array()) {
// copy the data over from a custom var, otherwise
$actionSet = 'validate' . Inflector::camelize(Router::getParam('action'));
if (isset($this->validationSet)) {
    $temp = $this->validate;
    $param = 'validate' . $this->validationSet;
    $this->validate = $this->{$param};
} elseif (isset($this->{$actionSet})) {
    $temp = $this->validate;
    $param = $actionSet;
    $this->validate = $this->{$param};
} 

$errors = $this->invalidFields($options);

// copy it back
if (isset($temp)) {
    $this->validate = $temp;
    unset($this->validationSet);
}

if (is_array($errors)) {
    return count($errors) === 0;
}
return $errors;

}

В вашем контроллере:

class UsersController extends AppController {
   function forgot() {
      $this->User->set($this->data);
      $this->User->validationSet = 'forgotpassword';
      if ($this->User->validates()) {
         // send email to reset password and show success message
      }
   }
}

И, наконец, вернувшись в вашу модель, создайте массив проверки, вы можете иметь массив проверки по умолчанию, а затем добавить дополнительный массив, такой как

class User extends AppModel {
   var $validate = array( ... );
   var $validateForgotpassword = array( ... );
}

Подробнее здесь:

http://snook.ca/archives/cakephp/multiple_validation_sets_cakephp

(обратите внимание, что в примере кода в статье есть ошибка, поэтому обязательно измените $ param = 'validate'. $ ValidationSet; на $ param = 'validate'. $ This-> validationSet;)

3 голосов
/ 09 июня 2011

Способ Cake состоит в том, чтобы просто установить правило проверки, которое будет применяться только к create, что позволит вам свободно редактировать данные без необходимости повторной проверки поля.

var $validate = array(
  'fieldName' => array(
    'rule' => 'ruleName'
    'required' => true,
    'allowEmpty' => false,
    'on' => 'create', // or update   <-- here
    'message' => 'Your Error Message'
    )
  );

И, конечно, если вы не хотите, чтобы поле пароля редактировалось здесь, просто удалите соответствующее input

1 голос
/ 09 июня 2011

удалить ваше 'required' => true, это не делает то, что вы думаете, делает.

'required' => true означает, что поле должно присутствовать в любых сохраненных данных.Вы не передаете это.

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