Почему ошибки проверки не отображаются в CakePHP? - PullRequest
1 голос
/ 29 июня 2009

Я пытаюсь выполнить проверку на странице входа для полей имени, адреса электронной почты и пароля. Если вход не проходит проверку, должно появиться сообщение об ошибке.

Но здесь, когда я заполняю детали и отправляю, они перенаправляются на следующую страницу. Только значение не сохраняется в базе данных.

Почему сообщение не отображается?

Это моя модель:

class User extends AppModel {
    var $name = 'User';
        var $validate = array(
            'name' => array(
            'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'message' => 'Alphabets and numbers only'
            ),
            'between' => array(
                'rule' => array('between', 5, 15),
                'message' => 'Between 5 to 15 characters'
            )
        ),
            'password' => array(
            'rule' => array('minLength', '8'),
            'message' => 'Mimimum 8 characters long'
        ),
        'email_id' => 'email'
    );

    function loginUser($data) {
        $this->data['User']['email_id'] = $data['User']['email_id'];    
        $this->data['User']['password'] = $data['User']['password'];            

        $login = $this->find('all');
        foreach ($login as $form):
            if ($this->data['User']['email_id'] == $form['User']['email_id'] && $this->data['User']['password'] == $form['User']['password']) {
                $this->data['User']['id'] = $this->find('all',
                    array(
                        'fields' => array('User.id'),
                        'conditions' => array(
                            'User.email_id' => $this->data['User']['email_id'],
                            'User.password'=>$this->data['User']['password']
                        )       
                    )
                );
                $userId=$this->data['User']['id'][0]['User']['id'];
                return $userId;
            }
    endforeach;
    }

    function registerUser($data) {
        if (!empty($data)) {
            $this->data['User']['name'] = $data['User']['name'];
            $this->data['User']['email_id'] = $data['User']['email_id'];    
            $this->data['User']['password'] = $data['User']['password'];
            if($this->save($this->data)) {
                $this->data['User']['id']= $this->find('all', array(
                    'fields' => array('User.id'),
                    'order' => 'User.id DESC'       
                ));
                $userId=$this->data['User']['id'][0]['User']['id'];
                return $userId;
            }
        }
    }
}

Это мой контроллер:

class UsersController extends AppController {
    var $name = 'Users';
    var $uses=array('Form','User','Attribute','Result');
    var $helpers=array('Html','Ajax','Javascript','Form');

    function login() {  
        $userId = $this->User->loginUser($this->data);
        if($userId>0) {
            $this->Session->setFlash('Login Successful.');
            $this->redirect('/forms/homepage/'.$userId);
            break;
        } else {
            $this->flash('Login Unsuccessful.','/forms');
        }
}

    function register() {   
        $userId=$this->User->registerUser($this->data);  
        $this->Session->setFlash('You have been registered.');
        $this->redirect('/forms/homepage/'.$userId);                        
    }      
}

EDIT

Почему сообщение, например "Минимум 8 символов", не отображается, если в поле пароля указано менее 8 символов?

 <!--My view file File: /app/views/forms/index.ctp   -->
 <?php 
echo $javascript->link('prototype.js');
echo $javascript->link('scriptaculous.js');
echo $html->css('main.css');
?>

  <div id="appTitle"> 
  <h2> formBuildr </h2>
  </div>

  <div id="register">
  <h3>Register</h3>
  <?php
echo $form->create('User',array('action'=>'register'));
echo $form->input('User.name');
echo $form->error('User.name','Name not found');
echo $form->input('User.email_id');
echo $form->error('User.email_id','Email does not match');
echo $form->input('User.password');
echo $form->end('Register');
  ?>
  </div>

  <div id="login">
  <h3>Login</h3>
  <?php
echo $form->create('User',array('action'=>'login'));
echo $form->input('User.email_id');
echo $form->input('User.password');
echo $form->end('Login');
  ?>
  </div>

Ответы [ 2 ]

0 голосов
/ 30 июня 2009

Закомментируйте строку перенаправления и установите для debug значение 2 в config / core.php. Затем посмотрите на SQL, который генерируется, чтобы увидеть, работает ли ваша вставка. Если ошибки не отображаются, возможно, в представлении, вы используете $ form-> text или $ form-> select вместо функций $ form-> input. Только функции $ form-> input будут автоматически отображать сообщения об ошибках.

0 голосов
/ 29 июня 2009

Ваша проверка кажется правильной

Как насчет того, чтобы попробовать следующее:

  1. Убедитесь, что в вашей $ form-> create установлена ​​соответствующая функция
  2. Убедитесь, что $ this-> Model-> read () не существует до выдачи Model-> save ();

Редактировать

У вас было следующее?:

function register()
{
   //do not put any $this->User->read or find() here or before saving pls.
   if ($this->User->save($this->data))
   {
       //...
   }
}

Edit2

Если вы выполняете read () или find () перед сохранением модели, тогда поля будут сброшены. Вы должны передать переменную как type = hidden в форме. Я надеюсь, что это имеет смысл.

Edit3

Я думаю, вам нужно переместить ваш registerUser () в ваш контроллер, потому что наличие этой функции в модели не дает вам ложного возврата. это всегда будет верно, даже если в нем есть ошибки проверки.

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