Como llamar a un controlador desde otro controlador?? [CodeIgniter]

padawanluke Seguir

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
Estoy aprendiendo CodeIgniter y el paradigma MVC, pero tengo problemas para la navegacion entre paginas.

Antes cuando programaba en PHP puro si queria redireccionar hacia otra pagina hacia simplemente:

PHP:
header('Location: destino.php');

Si queria pasar algún parametro además:

PHP:
header('Location: destino.php?id=1');

En el modelo MVC el Controlador es el que carga el modelo y la vista (Puede no cargar un modelo si es que el controllador no interactua con la base) , pero si o si hay un controlador principal y una vista.
Del tipo

-controlador: nombre.php
-vista: nombre_view.php

Donde nombre.php carga a nombre_view.php .

Bien, supongamos que el controlador nombre.php es de acceso restringido mediante usuario y contraseña, entonces al momento de cargar el controlador me fijo si existe la session que indica que el usuario esta logeado, si esta logeado dejo ejecutar el resto del controlador en caso contrario tengo que redireccionar al controlador del login .

Yo hasta ahora estaba usando redirect(); del helper URL, pero no me sirve porque solamente hace un link , no carga un controlador como debe ser.

No se como hacer, alguien puede darme una mano? .

gracias.
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
Me parece que estas haciendo algo mal o interpretando algo mal.

Hacer el redirect esta perfecto, ahora no entiendo a que te referis con que no carge el controllador.
Al hacer el redirect es como si se visitara esa pagina y el framework va a cargar el controlador que corresponde a esa peticion.

Si el redirect lo haces a direccion/controller va a ejecutar (ademas del init del controller si existe) el index action. En cambio si el redirect lo haces a direccion/controller/action va a ejecutar (nuevamente el init si existe) pero ahora en vez del index action va a ejecutar el action al cual enviaste el request.
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
Creo que si me estoy confundiendo , o el error es otro .

Pero entonces para navegar desde controlador a controlador se hace simplemente con un redirect() no? que es una función del helper URL verdad? me confirmas? perdón por la pregunta capas es re básica, pero estoy comenzando con este framework .
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
Si, usas el redirect.

Vamos a hablar claro, en MVC (este framework incluido) no podes desde un controller llamar directamente a un action de otro controller.
Con llamar directamente me refiero a que no podes invocar un action de otro controller como si fuese una funcion de una clase mas.

Lo que si podes hacer es redirigir al usuario a otra parte segun lo creas conveniente, cuando usas el redirect se va a estar llamando el controller y el action al cual vos lo mandes y eso se va a ejecutar. Algo obvio que por ahi no estoy aclarando es que cuando haces un redirect, todo el codigo que esta despues del redirect queda en la nada, pasa a ejecutarse el nuevo controller.

Ahora, el redirect lo estas usando para mandar usuarios no logueados a la pagina de login, verdad?

Ese redirect lo tendria que hacer la funcion generica que controla el login de los usuarios y que tienes en el base controller, como te comentaba en el otro post.

Por ejemplo en el base controller podrias tener una funcion de la siguiente forma:

Insertar CODE, HTML o PHP:
protected function isLoguedIn() {
    checkeas si esta logueado
    if (logueado) {
        return true;
    } else {
        redirect_to(login);
    }
}

despues en cualquiera de tus controllers (que tienen que extender del base controller) haces algo como:

Insertar CODE, HTML o PHP:
if (isLoguedIn()) {
    haces lo que tengas que hacer;
}

No tenia ganas de ponerme a ver las funciones exactas de CI asi que lo hice con una especie de seudocodigo :p
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
Si, usas el redirect.

Vamos a hablar claro, en MVC (este framework incluido) no podes desde un controller llamar directamente a un action de otro controller.
Con llamar directamente me refiero a que no podes invocar un action de otro controller como si fuese una funcion de una clase mas.

Lo que si podes hacer es redirigir al usuario a otra parte segun lo creas conveniente, cuando usas el redirect se va a estar llamando el controller y el action al cual vos lo mandes y eso se va a ejecutar. Algo obvio que por ahi no estoy aclarando es que cuando haces un redirect, todo el codigo que esta despues del redirect queda en la nada, pasa a ejecutarse el nuevo controller.

Ahora, el redirect lo estas usando para mandar usuarios no logueados a la pagina de login, verdad?

Ese redirect lo tendria que hacer la funcion generica que controla el login de los usuarios y que tienes en el base controller, como te comentaba en el otro post.

Por ejemplo en el base controller podrias tener una funcion de la siguiente forma:

Insertar CODE, HTML o PHP:
protected function isLoguedIn() {
    checkeas si esta logueado
    if (logueado) {
        return true;
    } else {
        redirect_to(login);
    }
}

despues en cualquiera de tus controllers (que tienen que extender del base controller) haces algo como:

Insertar CODE, HTML o PHP:
if (isLoguedIn()) {
    haces lo que tengas que hacer;
}

No tenia ganas de ponerme a ver las funciones exactas de CI asi que lo hice con una especie de seudocodigo :p

Ok entendi perfectamente, menos lo del base controller que tengo que verlo en detalle. Pero ya entendi, gracias.
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
No hay de que.

Lo del basecontroller, es crear una clase padre de todos tus controllers donde pones codigo comun y que te sea de utilidad en todos tus controllers.

Tal vez tengas que leer un poco sobre programacion orientada a objetos.
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
No , no entiendo lo que queres decir sobre un base controller, es decir teoricamente lo entiendo, tengo que ver como implementarlo .

---------- Post agregado el 13-ago-2013 hora: 03:58 ----------

Lo que vos me planteas es hacer una clase abstracta o tipo interfaz no? Saludos.


No hay de que.

Lo del basecontroller, es crear una clase padre de todos tus controllers donde pones codigo comun y que te sea de utilidad en todos tus controllers.

Tal vez tengas que leer un poco sobre programacion orientada a objetos.
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
Para que una clase extienda de otra no es necesario que la clase padre sea abstracta.
Interfaz no tiene ningun sentido, en una interfaz no podes implementar metodos. La idea de un controller padre de todos tus controllers es que en el mismo tengas funcionalidad comoun para todos tus controllers.

En el otro post te puse un link donde se da un ejemplo de esto mismo:

Favrik: A base controller for CodeIgniter
 
Arriba