Для всех моих "открытых" страниц/маршрутов, которыми я сталкиваюсь, я использую контроллер, который я создал, называемый Public_controller
который расширяет CI_Controller
. В настоящее время Public_controller
представляет собой пустой файл с функцией только конструктора.
На моих маршрутах я определил Application_controller
как мой контроллер по умолчанию. Это где маршруты, такие как mysite.com/about-us
указывают на:
PHP
class Application_controller extends Public_Controller {
public function about() {
$data['page_title'] = 'About';
$data['page_description'] = '';
$data['page_keywords'] = '';
$data['main_content'] = 'public/about';
$this->load->view('public/templates/default', $data);
}
}
У меня есть форма входа в заголовок каждой публичной страницы. Я знаком с тем, как обрабатывать/обрабатывать формы в CI. То, с чем я борюсь, - это проверить это на глобальном уровне, а не на разовой странице.
Например, обычно я бы сделал это, если бы моя форма была в <body>
моей страницы:
PHP
$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');
if ($this->form_validation->run() == FALSE) {
$data['main_content'] = 'public/forms/my_form';
} else {
// Handle the form.
}
}
$this->load->view('public/templates/default', $data);
Все отлично. Я, очевидно, не могу иметь такой тип синтаксиса для каждого метода контроллера. Пользователь может войти на любую страницу - поэтому мне нужно иметь возможность слушать/обрабатывать форму, если они входят в систему. В противном случае мне нужно показать страницу, которую запросил пользователь.
Может быть, мне нужен другой контроллер, который расширяет Public_controller
?
Спасибо вам за ваши предложения.
Если я правильно понял вашу проблему, вы хотите, чтобы ваши пользователи могли входить в систему с любой страницы вашего приложения.
Существует несколько способов сделать это, вот два:
1/Создайте контроллер, отвечающий за вызовы Ajax, и напишите свою функцию входа в систему
ajax.php
class Ajax extends CI_Controller
{
$email = $this->input->post("mail_login");
$password = $this->input->post("pass_login");
$user = $this->somemodel->get_user_by_mail_and_pass($email, $password);
if($user)
{
//stuff if success
}
else
{
//Stuff if failed
}
}
2/Создайте файл js, который будет загружен повсюду.
myjsfile.js (я полагаю, вы используете jQuery)
$("#theform").on("submit", function(event)
{
event.preventDefault();
var post_array =
{
"mail_login" : $("#txt_mail_login").val(),
"pass_login" : $("#txt_pass_login").val()
}
$.ajaxSetup({async:false});
$.post(baseUrl + "/Ajax/ajax_login", post_array,
function(data)
{
//Stuff here (redirect, change form into user info....)
});
)};
Вуаля!
В вашем заголовке, где форма входа в систему
<form method="post" action="<?= site_url("My_controller/my_login_function/" . $_ci_view); ?>">
Здесь мы предполагаем, что у вас есть функция с именем my_login_function, которая отвечает за ведение журнала. Эта функция находится в контроллере, здесь, my_controller (ужасное имя :)).
$ _ci_view - это var, который содержит имя текущего представления. Мы будем использовать его для перенаправления пользователя, где он был до отправки формы.
Например, если ваш пользователь загружает дом просмотра, вы получите что-то вроде этого в своей форме:
<form method="post" action="http://www.example.com/My_controller/my_login_function/home">
My_controller.php
class My_Controller extends CI_Controller
{
public function user_login($view_name)
{
$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');
if ($this->form_validation->run() == FALSE)
{
//Your stuff here
$this->load->view($view_name);
}
else
{
//Your stuff here
$this->load->view($view_name);
}
$this->load->view('public/templates/default', $data);
}
}
Мы можем представить, что в случае успеха вы устанавливаете сеанс с вашими пользовательскими данными. И затем, в своем заголовке, создайте условие, которое показывает или не форму входа, если сеанс установлен.