Отправка формы и изменение URI

У меня есть довольно стандартный сайт CI3 и он работает. Я создал свой собственный базовый контроллер с именем MY_Controller, и все мои контроллеры страниц расширяют его.

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 есть метод под названием «отправить».

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().

Я не использую никаких пользовательских трюков маршрутизации.


person sean.boyer    schedule 25.10.2015    source источник


Ответы (3)


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

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

Если этого недостаточно для ваших нужд, включите маршруты и контроллер выхода из системы, чтобы увидеть, что происходит в другом упомянутом вами сценарии.

person ioneyed    schedule 25.10.2015
comment
Использование redirect вместо вызова моего showView, кажется, делает то, что я хочу, однако я все еще чувствую, что что-то упускаю. - person sean.boyer; 25.10.2015
comment
Если это не сработает, опубликуйте блоки, которые я упомянул, чтобы дать мне новые данные, чтобы помочь вам. - person ioneyed; 25.10.2015
comment
Кстати, мой файл маршрутов просто по умолчанию. Я чувствую, что, возможно, мне не хватает правил маршрутизации и понимания того, ПОЧЕМУ я должен был сказать правила маршрутизации, чтобы просто отправить форму. - person sean.boyer; 25.10.2015

При успешной аутентификации вместо

$this->showView("home");

вы должны изменить это на redirect(),

redirect("controller/method/parameters if any");
person Niranjan N Raju    schedule 25.10.2015

есть вызов метода showview(). Чтобы загрузить представление, вы должны использовать

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

а также редирект должен быть

redirect('controller_name/method_name');
person Abdulla Nilam    schedule 26.10.2015