2009-08-06 9 views
0

모델에서 $ validate 배열을 사용하여 '이 필드는 비워 둘 수 없습니다'또는 '이름이 null이 아닙니다'와 같은 사용자 지정 메시지를 표시하려고합니다. 두 개의 컨트롤러, 주 및 사용자가 있습니다.

주 컨트롤러의 색인 파일에는 로그인 및 등록보기가 있습니다. login 및 register 함수의 action 부분은 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> 

답변

4

난 당신이 잘못된 방향으로 그것에 대해려고 생각합니다. 당신은 모델에서 너무 많은 일을하고 있습니다. 그리고 사실 후에도 컨트롤러에서 거의 똑같은 일을합니다. 그 좋지 않다. 전반적으로, 솔직히 말해서, 코드는 너무 단순한 무언가에 대해 상당히 혼란 스럽습니다.

거대한 WTF 플래그는 여기에 팝업 :

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

당신은 심각하게 비교하는 하나 그들을 통해 하나를 이동 한 후 (잠재적으로 상당히 비싼 작업) 데이터베이스에서 모든 사용자를 검색하고있어 단일 필드?!
'email_id'이 고유해야한다는 유효성 검사 규칙을 간단히 정의 할 수 있으며 'email_id'이 이미 존재하는 경우 Cake는 자동으로 데이터베이스에 요청합니다. 특정 문제에 대한 http://book.cakephp.org/view/472/isUnique

: 당신은 같은 페이지, password 같은 User 모델 email_id 필드에 두 번 같은 양식 필드를 가지고있다. Cake가 두 필드 중 어느 인스턴스가 오류 메시지를 가져야하는지 알 수있는 방법이 없습니다. 둘 다 같은 이름을 가지고 있습니다. 또한 로그인 폼에 유효성 검사 오류 메시지를 사용하고 싶지 않다고 생각합니다. 로그인 성공 여부 만 확인하고 싶을 수도 있습니다. 대신 로그인 실패시 오류 메시지를 표시하려면 Session::flash()을 사용하십시오. 이는 특정 필드가 아닙니다.

모델에서 loginregister 개의 방법을 사용하면 속하지 않습니다. 모델의 전자 메일, 이름 및 암호 필드에 대해 올바른 유효성 검사 규칙 만 지정하면 컨트롤러에서 $this->User->save()을 호출 할 때 자동으로 확인됩니다.

케잌 유효성 검사 규칙 (여기서는 해당되지 않음)으로 처리 할 수있는 방법이 없다면 손으로 확인하지 마십시오. 기본 제공 유효성 검사 규칙이 필요한 작업을 충족시키지 못하면 사용자 지정 규칙을 만들 수도 있습니다.http://book.cakephp.org/view/150/Custom-Validation-Rules

추 신 : 부품은 모델 용이 아닙니다. 계속하기 전에 Cake의 기본에 대해 더 알아야한다고 생각합니다 : http://book.cakephp.org/view/218/Tutorials-Examples

+0

그래, 내가 말한대로 변경을하겠다.하지만 특정 유효성 검사 오류를 원한다. 로그인 페이지에 표시됩니다. – Angeline

+0

내가 말했듯이, 같은 페이지에 두 번 기본적으로 동일한 양식이있는 경우 자동 오류 메시지 생성과 관련된 문제가 발생합니다. 또한 로그인 양식에는 불필요하다고 반복해서 말씀 드리겠습니다. 그런데, 양식을 분리한다면 여기에 설명 된 방법을 사용할 수 있습니다 : http://book.cakephp.org/view/410/Validating-Data-from-the-Controller – deceze

0

그러나 validate 배열에서 오는 오류 메시지를 보려면 $ this-> modelName-> invalidFields()에 액세스해야합니다. 유효성 검사를 통과하지 못한 필드와 사용자가 설정 한 메시지를 반환합니다 ...

+0

또는 $ this-> modelName-> validationErrors – Richard

관련 문제