2011-07-30 56 views
0

我試圖讓這個功能以所需的方式工作,但沒有多少運氣。好消息是,它是有效的。只有我想正確工作的是我所設置的字段驗證錯誤消息,但即使用戶名和密碼正確也無法登錄。我已經回滾了這個功能,希望有人能爲我提供一些幫助。CakePHP驗證,Auth中的錯誤消息和禁用修改。

function login() { 
      $this->layout = 'login'; 
      $this->set('title_for_layout', 'Login'); 
      if (!empty($this->data) && $id = $this->Auth->user('id')) { 
        $this->User->id = $id; 
        $this->User->saveField('last_login', date('Y-m-d H:i:s')); 
        $this->Session->setFlash(__('You have successfully logged in', true)); 
        $this->redirect(array('action'=>'index')); 
      }  
    } 

,我有在用戶模式設置驗證:

var $validate = array(
       'username' => array(
       ), 
       'login' => array(
          'rule' => 'isUnique', 
          'message' => 'This username has already been taken', 
        ), 
        'pattern' => array(
          'rule' => array('custom','/[a-zA-Z0-9\_\-]{6,}$/i'), 
          'message' => 'Must be 6 characters or longer with no spaces', 
        ), 
        'length' => array(
          'rule' => array('maxLength', 15), 
          'message' => 'Please keep username under 15 characters', 
        ), 
        'notempty' => array(
          'rule' => array('notempty'), 
          'message' => 'Username cannot be empty', 
        ), 
      ), 
     'password' => array(
         'notempty' => array(
           'rule' => array('notempty'), 
           'message' => 'Password cannot be empty', 
         ), 
         'length' => array(
           'rule' => array('between', 5, 15), 
           'message' => 'Passwords must be between 5 and 15 characters long with no spaces', 
           'on' => 'create', 
         ) 
     ) 
); 

我現在取消設置特定的驗證規則的登錄,我只想得到驗證實際上是在正確的工作方式。

真的,我有三個問題......

  1. 爲什麼工作不正常我的驗證?

  2. 如何在我的視圖中顯示來自AuthComponent的消息?

  3. 如何暫時禁用我的表中的modified字段進行更新?

非常感謝!

+0

這裏:'&& $ id = $ this-> Auth-> user('id')'在你的if中。這是一個錯字嗎?應該是'=='或'==='。 – cspray

+0

爲什麼你需要登錄驗證才能開始? –

+0

@anh它更美觀的實際功能方面 - 我想我可以忍受會話閃爍;-) – Plastika

回答

1

除了在我的評論中發現的錯誤,我相當確定您的login驗證設置不正確。

這裏是你擁有的一切:

'login' => array(
       'rule' => 'isUnique', 
       'message' => 'This username has already been taken', 
      ), 
         'pattern' => array(
           'rule' => array('custom','/[a-zA-Z0-9\_\-]{6,}$/i'), 
           'message' => 'Must be 6 characters or longer with no spaces', 
         ), 
         'length' => array(
           'rule' => array('maxLength', 15), 
           'message' => 'Please keep username under 15 characters', 
         ), 
         'notempty' => array(
           'rule' => array('notempty'), 
           'message' => 'Username cannot be empty', 
         ), 
     ), 

這裏就是我想希望有

'username' => array(
    'isUnique' => array(
     'rule' => 'isUnique', 
     'message' => 'This username has already been taken' 
    ), 
    'pattern' => array(
     'rule' => array('custom','/[a-zA-Z0-9\_\-]{6,}$/i'), 
     'message' => 'Must be 6 characters or longer with no spaces', 
    ), 
    'length' => array(
     'rule' => array('maxLength', 15), 
     'message' => 'Please keep username under 15 characters', 
    ), 
    'notEmpty' => array(
     'rule' => 'notEmpty', 
     'message' => 'Username cannot be empty', 
    ), 
), 

強制鏈接到CakePHP BookCakePHP API


回答誤差從OP的評論:

我現在看到的是你所試圖做的。試試這個:

$id = $this->Auth->user('id'); 
if (!empty($this->data) && $id) { 
       $this->User->id = $id; 


回答「如何從 AuthComponent顯示我的登錄錯誤消息?」

要顯示登錄錯誤消息,您需要在佈局或視圖中爲您的登錄表單添加以下行。

echo $this->Session->flash('auth'); 


回答「如何暫時禁用CakePHP的 modified行爲?」:

好了,簡單的介紹一下源代碼和answer to this question on Cake's internal QA您可以添加這樣的東西,你保存數據之前。

$this->data['User']['modified'] = false; 

這告訴Cake不更新修改字段。

有趣的是,從源代碼看來,您可以輕鬆地用true代替false,並且它不會更新該字段。我不知道這是否真的如此。

+0

如果(!空($ this->數據)&& $ id = $ this-> Auth-> user('id'))to if(!empty($ this-> data)&& $ id == $ this-> Auth-> user('id'))會引發以下錯誤:Notice(8):Undefined variable :id [APP/controllers/users_controller.php,line 81] 注意:(8):未定義變量:id [APP/controllers/users_controller.php,line 82] – Plastika

+0

非常感謝!那整理出來,但是,驗證錯誤信息仍然不顯示.. – Plastika

+0

總是被忽略的東西簡單..謝謝!會話Flash消息正在重新運行!有一件奇事正在發生。 $ this-> user-> saveField('last_login',date('Y-m-d H:i:s'));正在寫入[modified]和[last_login]字段,我不知道爲什麼。 – Plastika