2010-04-11 19 views
17

tengo unas pocas páginas que requieren un inicio de sesión, por lo que todos los controladores que tienen enlaces a estas páginas a empezar conPHP/CodeIgniter - uso de la salida()

$this->checkSession(); 
//...rest of the code 

CheckSession debe verificar la sesión aún está vivo, muestra de lo contrario una mensaje y detener la ejecución del resto del código en el controlador:

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(); 
    } 
} 

. Esperaba que estas instrucciones sucedieran en secuencia, pero solo recibo una página en blanco. ¿Cómo puedo asegurarme de que exit() se ejecute solo después de que se carguen todas las vistas?

+0

¿Hay alguna razón por la que necesita llamar a exit()? –

Respuesta

14

En este caso no se debe utilizar la salida, lo que debe hacer si la sesión no es válido es redirigir su aplicación utilizando ejemplo:

redirect('/init/login/','refresh'); 
+0

¿Qué sucede si quiero mostrar loing desde la misma página? Y después de que el usuario inicie sesión usando (AJAX), la página actualizará – MJoraid

+0

@Joraid verifica una de las otras respuestas, dependiendo de tu problema, seguramente habrá una respuesta – DarkMukke

+0

Esta respuesta funciona, pero si estás intentando redirigir a un constructor y la página redirigida está en el mismo controlador, entonces puede terminar en una redirección infinita ... !! la mejor respuesta es hecha por Sam & @evilunix –

2

No sé lo suficiente sobre el flujo de trabajo de codeigniter, pero me parece que desea redirigir a la página de inicio de sesión en lugar de tratar de representarlo. Evidentemente, ninguno de los códigos suministrados envía la plantilla al navegador cuando se llama al exit().

2

exit() corta allí su scrip y nunca se llama a la función actual _output() del controlador. Lo que necesita hacer es agregar acción en uno de sus controladores, por ejemplo, la pantalla de inicio de sesión del usuario y redireccionar allí. Puede usar la función flashdata de la Sesión - http://codeigniter.com/user_guide/libraries/sessions.html para pasar su mensaje y luego capturarlo dentro de su vista y mostrarlo.

Otra forma que no es muy inteligente pero debería funcionar es llamar a la fuerza a la función de salida.

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(); 
    } 
} 
15

En este caso Pedro es correcta. Si no están conectados, solo redirigirlos, es incluso mejor si puede usar Public/Admin named base controllers para evitar que tenga que hacer esto en cada archivo protegido por separado.

En términos generales, si utiliza exit() se detendrá la ejecución de la biblioteca de salida. Si solo desea detener la ejecución del controlador actual pero permitir la salida del controlador, puede utilizar el retorno exactamente de la misma manera.

function checkSession() 
{ 
    return (bool) $this->session->userdata('is_logged_in'); 
} 

Después, simplemente:

if(!$this->checkSession()) 
{ 
     //the session has expired! 
     $data['main'] = 'confirmation_message'; 
     $data['title'] = "Session expired"; 
     $this->load->vars($data); 
     $this->load->view('template'); 
     return; 
} 

salida() solamente nunca se debe utilizar si realmente desea la muerte instantánea de la ejecución de la aplicación para la depuración, el informe de errores, etc.

+0

parece una buena solución, aunque todavía soy un principiante, lo tendré en cuenta cuando tenga una mejor comprensión de CI. – Patrick

+0

Gran respuesta. La primera vez que me di cuenta de la diferencia entre exit() y return. –

+0

CUIDADO: Esto no es de retorno, como puede ver, si este código está en Constructor(), entonces también se llamará al índice(). – MJoraid

2

En realidad, en el La función CI más nueva para llamar manualmente a la clase de salida es

$this->display->_output(); 

y no se preocupe. dles caching, el contenido también estará correctamente comprimido si lo configura en config

Normalmente agrego y extiendo el controlador con lógica de inicio de sesión que maneja funciones de inicio de sesión, de modo que si un controlador normal necesita una autenticación, entonces el método de inicio de sesión se llama automáticamente y el contenido original no se muestra. Es una buena solución si desea permanecer en la página a la que el usuario intentó acceder sin redireccionar (y luego publicarlo en la misma página)

+6

Creo que está por el camino equivocado ... $ this-> output -> _ display(); –

+0

downvoted hasta que la sintaxis sea correcta – DarkMukke

12

Tuve un problema similar. Donde quería detener al usuario debido a que no hay inicio de sesión.Pero quería ofrecer una lista de enlaces para ellos, no simplemente redirigirlos a una página de inicio de sesión. Estoy usando CI versión 1.7.2 y las soluciones $ this -> _ output() $ this-> display -> _ output() y $ this-> output -> _ display() no me funcionaron. Sin embargo, obtuve mis resultados usando la función $ this-> output-> get_output().

 $this->load->vars($data); 
     $this->load->view('template'); 
     die($this->output->get_output()); 
+1

Esta solución funcionó para mí. ¡Gracias! – machineaddict

8
$this->output->_display(); 
exit(); 

es la respuesta correcta! Gracias a Sam Sehnert ... Está escondido en los comentarios, así que pensé en volver a publicarlo.

+0

Esto funciona muy bien y creo que es la respuesta correcta a la pregunta. –

1

Pon el código en una variable y escríbelo.

$html = $this->load->view('template',null,true); 
echo $html; 
exit(); 
Cuestiones relacionadas