Отображение пользовательских сообщений проверки с использованием массива CakePHP $ validate - PullRequest
0 голосов
/ 06 августа 2009

Я пытаюсь отобразить пользовательские сообщения, такие как «это поле не должно быть пустым» или «имя не пусто» с использованием массива $ validate в модели. У меня есть два контроллера, основной и пользователи.

Индексный файл основного контроллера имеет вид входа в систему и регистрации. Часть действия функций login и register находится в user_controller. Если функция входа и регистрации подтверждена, они перенаправляются на домашнюю страницу основного контроллера, в противном случае они остаются на самой странице индекса.

Я хочу, чтобы сообщения проверки отображались на самой странице индекса. Но эти сообщения появляются только в том случае, если для входа и регистрации существует отдельный файл представления, т.е. существуют /views/forms/register.ctp и /views/forms/login.ctp.

Есть ли способ отобразить эти сообщения проверки, не имея отдельного файла представления для этих функций? Я дал мой код ниже. Кто-то, пожалуйста, направьте меня.

Модель класса:

<?php 
class User extends AppModel {
    var $name = 'User';
var $components=array('Auth');

  var $validate = array(
    'name' => array(
        'rule' => 'notEmpty',
          'message'  =>'Name cannot be null.'
    ),
    'password' => array(
        'rule' => 'notEmpty'
    ),
    'email_id' => array(
        'rule' => 'notEmpty'
    )
);

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'];

        $existingUsers= $this->find('all');
        foreach($existingUsers as $existingUser):
            if($this->data['User']['email_id']==$existingUser['User']['email_id']){
                return 0;
            }
            else{
                $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;
            }
        endforeach;

    }
}

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;
   }
  }
 ?>

Класс контроллера:

<?php 
class UsersController extends AppController 
{

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

function register()
{

    $this->Session->write('userId',$this->User->registerUser($this->data));
    $this->User->data=$this->data;
        if (!$this->User->validates())
        {

              $this->Session->setFlash('Please enter valid inputs');
              $this->redirect('/main' );
            return;    
        }

       if($this->Session->read('userId')==0){

           $this->Session->setFlash('You are already a registerd member.Log in your account');
           $this->redirect('/main');
       }
       else{
        $this->Session->setFlash('User account created');
        $this->redirect('/main/home'); 
       }       


   }   

 function login()
   {

    //$userId=$this->User->loginUser($this->data);
    $this->Session->write('userId',$this->User->loginUser($this->data));
    $this->User->data=$this->data;

    if (!$this->User->validates())
        {
              $this->Session->setFlash('Please enter valid inputs');
              $this->redirect('/main' );
            return;    
        }
    if($this->Session->read('userId')>0){
        $this->Session->setFlash('Login Successful');
        $this->redirect('/main/home');
        break;        
    }
    else{
         $this->Session->setFlash('Username and password do not match.');
         $this->redirect('/main');

    }    
  }
 }
?>

Просмотр шаблона:

<!-- File: /views/main/index.ctp-->

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

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

Ответы [ 2 ]

4 голосов
/ 08 августа 2009

Я думаю, вы поступаете неправильно. Вы слишком много делаете в модели, и после факта вы делаете почти то же самое в контроллере. Это не хорошо. В целом, если честно, код довольно беспорядочный для чего-то такого простого.

Здесь появляется огромный WTF флаг:

$existingUsers= $this->find('all');
foreach($existingUsers as $existingUser):
    if($this->data['User']['email_id']==$existingUser['User']['email_id']){

Вы серьезно извлекаете всех пользователей из базы данных (что может быть очень дорогой задачей), а затем просматриваете их один за другим для сравнения одного поля?!
Вы можете просто определить правило проверки, которое говорит, что 'email_id' должно быть уникальным, и Cake автоматически спросит базу данных , если 'email_id' уже существует. http://book.cakephp.org/view/472/isUnique

О вашей конкретной проблеме: у вас есть одно и то же поле формы дважды на одной странице, поля password и email_id для одной и той же модели User. У Cake нет возможности узнать, какой экземпляр этих двух полей должен получить сообщение об ошибке, они имеют одинаковое имя. Кроме того, я не думаю, что вы хотите использовать сообщения об ошибках проверки для формы входа в систему, вы просто хотите увидеть, если вход был успешным или нет. Вместо этого используйте Session::flash(), чтобы отобразить сообщение об ошибке для неудачного входа в систему, оно не зависит от поля.

Удалите методы login и register из вашей модели, они там не принадлежат. Укажите только правильные правила проверки для полей электронной почты, имени и пароля в модели, они будут автоматически проверяться при вызове $this->User->save() в контроллере.

Не проверяйте вручную что-либо, если только нет способа сделать это с помощью правил проверки Cake (здесь это не так). Если встроенные правила проверки не удовлетворяют тому, что вам нужно сделать, вы даже можете создавать собственные правила. http://book.cakephp.org/view/150/Custom-Validation-Rules

PS: Компоненты не для моделей. Я думаю, вам нужно больше узнать об основах Cake, прежде чем продолжить: http://book.cakephp.org/view/218/Tutorials-Examples

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

Но, если вы хотите видеть свои сообщения об ошибках, которые поступают из массива validate, вы должны получить доступ к $ this-> modelName-> invalidFields (), который вернет вам поля, которые не прошли проверку, и сообщение, которое Вы настроили для них ...

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