Правила проверки CakePHP для многих действий - PullRequest
0 голосов
/ 13 мая 2011

Я искал в Интернете, в книге / 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)

Ответы [ 2 ]

0 голосов
/ 14 мая 2011

Пароль автоматически хешируется, поэтому вам нужно хешировать другое поле пароля, чтобы сравнить их. Я обычно делаю это в функции beforeSave в модели:

function beforeSave() {
    if(!empty($this->data['User']['password2'])) {
        $this->data['User']['password']=Security::hash($this->data['User']['password2'], null, true);
    }
    return true;
}

Я использую это правило проверки для моих полей pw:

    'password' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'password2' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'passwordn' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'current_password' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),

пароль и пароль2 для регистрации, passwordn password2 и current_password находятся в форме изменения pw.

0 голосов
/ 13 мая 2011

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

Я думаю, что, скорее всего, происходит то, что для параметра required установлено значение true. Если поле не заполнено, проверка не будет выполнена.

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