2015-10-25 102 views
0

我有一個相當標準的CI3網站啓動並運行。我創建了自己的基礎控制器,名爲MY_Controller,我的所有頁面控制器都可以擴展它。表單提交和URI重寫

MY_Controller.php

public function __construct() { 
    parent::__construct(); 
} 

/** 
* Display the view. This function wraps up all the teplates, 
* sets the page title, adds all the requested Javascript and CSS, 
* and passes along any data. 
* @param string $view The name of the content view to display 
* @param array $data (Optional) ÏAn array of any data to pass along 
*/ 
protected function showView($view, $data = null) { 

    if ($data === null) { 
     $data = array(); 
    } 

    // call all the template pieces 
    $this->load->view('header', $data); 
    $this->load->view('mainNav', $data); 
    $this->load->view($view, $data); 
    $this->load->view('footer', $data); 
} 

每個頁面控制器調用$this->showView($viewName, $data);當它準備來顯示結果或什麼的。

我在我的登錄控制器上有一個表格,Login.php

Login.php有一個名爲「submit」的方法。

public function submit() { 

    $cfg = array(
     array(
      'field' => 'username', 
      'label' => 'Username', 
      'rules' => 'required|trim|alpha_numeric|xss_clean|min_length[3]|max_length[50]' 
     ), 
     array(
      'field' => 'password', 
      'label' => 'Password', 
      'rules' => 'required|trim|alpha_numeric|xss_clean|min_length[3]|max_length[50]' 
     ) 
    ); 

    if ($this->form_validation->set_rules($cfg) === false) { 
     $this->showView("login"); 
    } else { 
     $data = array(
      'password' => $this->input->post('password') 
     ); 

     if (filter_var($this->input->post('username'), FILTER_VALIDATE_EMAIL) === false) { 
      $data['username'] = $this->input->post('username'); 
     } else { 
      $data['email'] = $this->input->post('username'); 
     } 

     $user = $this->User->getUserFromLogin($data); 

     if ($user !== false) { 

      $sessionData = array(
       'userName' => $user->userName, 
       'email'  => $user->email, 
       'authToken' => $user->authToken, 
       'lastSeen' => date("Y-m-d") 
      ); 
      // Add user data to session 
      $this->session->set_userdata('userLoggedIn', true); 
      $this->session->set_userdata('userData', $sessionData); 
      $this->showView("home"); 

     } else { 
      $data = array(
       'error_message' => 'User could not be loaded.', 
      ); 
      $this->showView("login", $data); 
     } 
    } 
} 

我的登錄視圖,login.php

<div class="wrapper style1"> 
 
    <article id="work"> 
 
    <header> 
 
     <h2>Login!</h2> 
 
     <?=validation_errors();?> 
 
    </header> 
 
    <div class="container 50%"> 
 
     <section> 
 
     <form method="post" action="login/submit"> 
 
      <div> 
 
      <div class="row"> 
 
       <div class="6u"> 
 
       <input type="text" name="username" id="username" placeholder="username or email" value="<?=set_value('username');?>" /> 
 
       </div> 
 
       <div class="6u"> 
 
       <input type="password" name="password" id="password" placeholder="password" /> 
 
       </div> 
 
      </div> 
 
      <div class="row"> 
 
       <div class="12u"> 
 
       <ul class="actions"> 
 
        <li> 
 
        <input type="submit" value="Sign in!" /> 
 
        </li> 
 
       </ul> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </form> 
 
     <footer> 
 
      <div>...or sign in with Facebook!</div> 
 
      <fb:login-button scope="public_profile,email" onlogin="checkLoginState();"></fb:login-button> 
 
     </footer> 
 
     </section> 
 
    </div> 
 
    </article> 
 
</div>

在成功提交表單的,我期待它給我重定向到home,它是,但是, URI是localhost/login/submit而不是localhost/home

我註銷控制器

同樣地,在註銷時,導航到URI localhost/logout/logout,產生一個404

我想不通爲什麼它不重定向到我指定的控制器showView()方法。

我沒有使用任何自定義路由技巧。

回答

1

showView方法只是簡單地加載所需的額外模板值以及發送的數據。我相信當你需要離開頁面時,你正在尋找重定向,而不是像現在這樣重新渲染頁面。

redirect($uri = '', $method = 'auto', $code = NULL) 

如果這還不足以滿足您的需求,請包括您的路由和註銷控制器,以查看您提到的其他場景中發生了什麼。

+0

使用'redirect',而不是叫我'showView'似乎做我想做的,但是,我還是覺得像我錯過了一些東西。 –

+0

如果它不起作用,我會提到給我的新數據來幫助你。 – ioneyed

+0

順便說一句,我的路線文件是簡單的默認。我覺得我可能缺少路由規則,以及爲什麼我必須說路由規則簡單地提交表單。 –

0

一旦認證成功,而不是

$this->showView("home"); 

你應該改變,要redirect()

redirect("controller/method/parameters if any"); 
0

有方法調用showview()。要載入視圖你必須使用

$this->load->view("login"); 

以及重定向應該是

redirect('controller_name/method_name');