У меня есть несколько страниц, требующих входа в систему, поэтому все контроллеры, которые ссылаются на эти страницы, начинаются с
$this->checkSession(); //...rest of the code
CheckSession должен проверить, что сеанс все еще жив, иначе отобразится сообщение и остановит выполнение остальной части кода в контроллере:
function checkSession() { if (!$this->session->userdata('is_logged_in')) { //the session has expired! $data['main'] = 'confirmation_message'; $data['title'] = "Session expired"; $this->load->vars($data); $this->load->view('template'); exit(); } }
, Я ожидал, что эти инструкции будут выполняться последовательно, но я получаю только пустую страницу. Как я могу убедиться, что exit () выполняется только после загрузки всех просмотров?
В этом случае вы не должны использовать exit, что делать, если сеанс недействителен, перенаправляет ваше приложение с помощью примера:
redirect('/init/login/','refresh');
В этом случае Педро прав. Если они не вошли в систему только для их перенаправления, еще лучше, если вы можете использовать базовые контроллеры Public / Admin, чтобы остановить выполнение этого в каждом отдельном защищенном файле.
Вообще говоря, если вы используете exit (), это остановит работу библиотеки Output для запуска. Если вы просто хотите остановить выполнение текущего контроллера, но разрешите вывод контроллера, вы можете использовать возврат точно так же.
function checkSession() { return (bool) $this->session->userdata('is_logged_in'); }
Тогда просто:
if(!$this->checkSession()) { //the session has expired! $data['main'] = 'confirmation_message'; $data['title'] = "Session expired"; $this->load->vars($data); $this->load->view('template'); return; }
exit () должен использоваться только когда вы действительно хотите мгновенную смерть исполнения вашего приложения для отладки, отчетов об ошибках и т. д.
У меня была аналогичная проблема. Где я хотел остановить пользователя из-за отсутствия входа в систему. Но я хотел предложить список ссылок для них, а не просто перенаправить их на страницу входа. Я использую CI версии 1.7.2, а функции $ this -> _ output () $ this-> display -> _ output () и $ this-> output -> _ display () не работают для меня. Однако мне нужно было получить результаты с помощью функции $ this-> output-> get_output ().
$this->load->vars($data); $this->load->view('template'); die($this->output->get_output());
$this->output->_display(); exit();
Правильный ответ! Спасибо Сэму Сённтеру … Он скрыт в комментариях, поэтому подумал, что я перейду.
Я недостаточно знаю о рабочем процессе codeigniter, но мне кажется, что вы хотите перенаправить на страницу входа, а не пытаться ее отобразить. Очевидно, ни один из приведенных вами кодов не отправляет шаблон в браузер по вызову time exit()
.
exit () сокращает ваш скрипт, и фактическая функция _output () контроллера никогда не вызывается. Что вам нужно сделать, так это добавить действие в один из ваших контроллеров, например, экран входа пользователя и перенаправить туда. Вы можете использовать функцию flashdata из сеанса – http://codeigniter.com/user_guide/libraries/sessions.html, чтобы передать свое сообщение, а затем поймать его внутри своего представления и отобразить его.
Другой способ, который не очень умный, но должен работать, – это принудительно вызвать функцию вывода.
function checkSession() { if (!$this->session->userdata('is_logged_in')) { //the session has expired! $data['main'] = 'confirmation_message'; $data['title'] = "Session expired"; $this->load->vars($data); $this->load->view('template'); $this->_output(); exit(); } }
Фактически в новейшей функции CI для ручного вызова класса output
$this->display->_output();
и не волнуйтесь – он обрабатывает кеширование, содержимое также будет правильно загружено, если вы установите так в настройке
Я обычно добавляю и расширяю контроллер логикой входа, который обрабатывает функции входа, так что, если обычный контроллер – это тот, кому нужен auth, тогда метод входа вызывается автоматически, а исходное содержимое не отображается. Это хорошее решение, если вы хотите остаться на странице, к которой пользователь попытался получить доступ без перенаправления (а затем отправить его обратно на ту же страницу)
Поместите код в переменную и запишите его.
$html = $this->load->view('template',null,true); echo $html; exit();