Проблема проверки компонента CakePHP Auth - PullRequest
1 голос
/ 14 ноября 2010

Есть некоторые проблемы с проверкой, которые появляются только при использовании компонента Auth. У меня есть 4 поля в форме регистрации: username, password, password_confirm и email.

У меня также есть многовариантное поведение, привязанное к моей модели User. Вот правила, которые применяются к форме регистрации:

var $validationSets=array(
    "register" => array(
        "username" => array(
            "usernameFieldNotEmpty" => array(
                "rule" => "notEmpty",
                "message" => "You did not enter the username!"
            ),
            "usernameValid" => array(
                "rule" => "__alphaNumericDashUnderscore",
                "message" => "The username you entered is not valid!"
            ),
            "usernameExistsInDatabase" => array(
                "rule" => array("__existingRecord", false), 
                "message" => "The username you entered has been already registered in our database!"
            )
        ),
        "password" => array(
            "passwordFieldNotEmpty" => array(
                "rule" => "notEmpty",
                "message" => "You did not enter your password!"
            )
        ),
        "password_confirm" => array(
            "passwordConfirmFieldNotEmpty" => array(
                "rule" => "notEmpty",
                "message" => "You did not confirm your password!"
            ),
            "passwordsMatch" => array(
                "rule" => array("__fieldMatch", "password"),
                "message" => "The passwords you entered don't match!"
            )
        ),
        "email" => array(
            "emailFieldNotEmpty" => array(
                "rule" => "notEmpty",
                "message" => "You did not enter the e-mail!"
            ),
            "emailValid" => array(
                "rule" => "email",
                "message" => "The e-mail you entered is not valid!"
            ),
            "emailExistsInDatabase" => array(
                "rule" => array("__existingRecord", false), 
                "message" => "The e-mail you entered has been already registered in our database!"
            )
        )
        /*"language" => array(

        )*/
    )

Вот моя регистрационная форма:

<?php echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'register')));?>
<fieldset>
    <legend><?php __('Add User'); ?></legend>
<?php
    echo $this->Form->input('username');
    echo $this->Form->input('password', array('type' => 'password', 'value' => ''));//value='' - resets the password input on any error on the page
    echo $this->Form->input('password_confirm', array('type' => 'password', 'value' => ''));
    echo $this->Form->input('email');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

Теперь, каждый раз, когда я отправляю форму EMPTY, поле пароля, хотя и пустое, проходит все проверочные тесты (я пытался вставить value => '' в код, но это бесполезно). Кроме того, ввод электронной почты, кажется, прошел тест 'notEmpty', и показанная ошибка заключается в том, что The email is not valid

Я просмотрел весь свой код, но не смог найти никакого решения.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2010

О проблеме с паролем: какую версию CakePHP вы используете?

Компонент Auth в 1.2 автоматически хеширует ваш пароль, так что он будет не пустым, даже если он есть.В 1.3 все должно быть в порядке, но я не знаю, с какой версии.

0 голосов
/ 15 ноября 2010

Мне удалось сделать пару «хаков», поэтому проблема решена на данный момент. Не думайте, что это самый подходящий способ сделать это, но он может пригодиться другим пользователям, у которых возникла моя проблема:

Во-первых, в моем UsersController я написал этот фрагмент, поэтому, если поле пароля оставлено пользователем пустым, перед проверкой установите значение '':

if($this->data['User']['password'] == $this->Auth->password('')){
            $this->data['User']['password'] = '';
        }
        $this->User->set($this->data);
        if($this->User->validates()){ //post validation login }

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

"email" => array(
        "emailFieldNotEmpty" => array(
            "rule" => "notEmpty",
            "message" => "You did not enter the e-mail!"
        ),
        "emailValid" => array(
            "rule" => "email",
            "message" => "The e-mail you entered is not valid!"
        ),
        "emailExistsInDatabase" => array(
            "rule" => array("__existingRecord", false), 
            "message" => "The e-mail you entered has been already registered in our database!"
        )
    )

Теперь у меня есть:

"email" => array(
            "emailExistsInDatabase" => array(
                "rule" => array("__existingRecord", false), 
                "message" => "The e-mail you entered has been already registered in our database!"
            ),
            "emailValid" => array(
                "rule" => "email",
                "message" => "The e-mail you entered is not valid!"
            ),
            "emailFieldNotEmpty" => array(
                "rule" => "notEmpty",
                "message" => "You did not enter the e-mail!"
            )
        )

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

Я повторяю, я не знаю, является ли это правильным подходом, но, похоже, я решил эти проблемы.

Если у вас есть что добавить, сделайте это!

EDIT Нашел «официальное» объяснение в Cake 1.3 Book. Там написано:

By default CakePHP tries to validate a field using all the validation rules declared for it and returns the error message for the last failing rule. But if the key last is set to true for a rule and it fails, then the error message for that rule is returned and further rules are not validated. So if you prefer to show the error message for the first failing rule then set 'last' => true for each rule.

Итак, еще один подход к моей проблеме - установить правила проверки в порядке их появления и добавить ключ last в массив правил.

0 голосов
/ 14 ноября 2010

http://pastebin.com/xnQ02BCW

это то, что я бы использовал.

...