2011-09-20 55 views
3

我正在驗證登錄表單並使用flashdata發送錯誤消息。 Flashdata似乎有延遲,它隻影響第二次提交(第一次提交後沒有顯示錯誤消息,第二次提交後沒有錯誤),而userdata正常工作。CodeIgniter flashdata延遲

查看>

<?php if ($this->session->flashdata('error_messages')): ?> 
    <?php echo $this->session->flashdata('error_messages'); ?> 
<?php endif; ?> 
<?php echo form_open('user/login', array('name' => 'login_form', 'id' => 'login_form')); ?> 
<fieldset> 
    <p> 
    <?php echo form_label('Username: ', 'username'); ?> 
    <?php echo form_input('username', set_value('username', ''), array('id' => 'username', 'placeholder' => 'username')); ?> 
    </p> 
    <p> 
    <?php echo form_label('Password: ', 'password'); ?> 
    <?php echo form_password('password', set_value('password', ''), array('id' => 'password', 'placeholder' => '********')); ?> 
</p> 
<p> 
    <?php echo form_submit('login', 'Login', array('id' => 'login')); ?> 
</p> 

控制器動作>

public function login() { 
    //user is not logged in, carry on 
    if (!user_is_logged_in()) { 
     //check if form was already submitted, if yes validate 
     if ($this->input->post('login')) { 
      $this->load->library('chronos_user'); 

      //gather data from form 
      $username = $this->input->post('username'); 
      $password = $this->input->post('password'); 

      //validate form, show error messages if not valid 
      if (
       !($this->chronos_user->valid_username($username)) || 
       !($this->chronos_user->unique_username($username)) 
      ) 
      { 
       $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login')); 
       $this->chronos_template->set_view('content', 'user/login_view'); 
       $this->chronos_template->view(); 
      } 
      //redirect if ok 
      else { 
       header("Location http://c4studio.ro"); 
      } 
     } 
     //if no form was submitted, just display it 
     else { 
      $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login')); 
      $this->chronos_template->set_view('content', 'user/login_view'); 
      $this->chronos_template->view();    
     } 
    } 
    //user is already logged in, redirect to profile page 
    else { 
     $profile_url = "Location: "; 
     $profile_url .= site_url(); 
     $profile_url .= "user/profile/"; 

     header($profile_url); 
    } 
} 

Valid_username法>

public function valid_username($username) { 
     if (empty($username)) { 

      $this->CI->session->set_flashdata('error_messages', 'Value.'); 
      return FALSE; 
     } 
     if (strlen($username) < 3) { 
      $this->CI->session->set_flashdata('error_messages', 'Value11.'); 
      return FALSE; 
     } 
     return TRUE; 
    } 

任何想法?另外如果有人知道更好的方法來做到這一點,請讓我知道!謝謝

回答

4

根據documentation flashdata存在於下一個服務器請求

但在你的情況下,你實際上設置flashdata在同一個服務器請求,因爲你顯示的登錄視圖是不成功的。那是它不起作用的原因。

更好的方法是讓模型方法返回true或false,並使用該值。如果您將用戶重定向到錯誤頁面或類似的內容,則應僅考慮flash數據。

0

正如@Repox提到的,它只適用於'下一次刷新'。假設flashdata在設置時可以正常工作,但在可用之前您不需要重新加載/刷新新的實際頁面。

你有正確的想法,但你只是使用flashdata來實現你的消息,堅持形式化消息作爲返回結果,或只是一個自定義變量。

這確實是開發人員爲一件事物設計flashdata以及用戶將其用於另一件事的真實例子。

您需要使用form_error來返回所有的表單錯誤,不要使用flashdata,它不會像你期望的那樣工作。

例子: http://codeigniter.com/user_guide/libraries/form_validation.html#settingerrors

您還可以覆蓋在語言文件中找到的任何錯誤消息。 例如,改變信息的「要求」規定,你會做 這一點:

$this->form_validation->set_message('required', 'Your custom message here');