multiple initialize functions example php codeigniter

php - initialize - include class codeigniter



CodeIgniter: Controlador de carga dentro del controlador (10)

Tengo un controlador home con una acción de index que muestra un conjunto de productos destacados. Sin embargo, los productos se administran a través de un controlador de product incluye un modelo de propiedad y vistas.

¿Cómo accedo a product información del product desde dentro de la acción de index en el controlador home ? Instalar el product no funcionará ya que la clase no se carga en tiempo de ejecución y CodeIgniter no proporciona una forma de cargar los controladores dinámicamente. Tampoco funciona realmente poner la clase de product en un archivo de biblioteca.

Para ser precisos, necesito las vistas del producto (llenas con los datos procesados ​​por el controlador del product ) insertadas en la vista del índice. Estoy ejecutando CodeIgniter 2.0.2.


Aquí hay muchas buenas respuestas para cargar controladores dentro de los controladores, pero para mí, esto contradice el patrón de mvc.

La oración que me preocupa es;

(lleno de datos procesados ​​por el controlador del producto)

Los modelos están ahí para procesar y devolver datos. Si pone esta lógica en su modelo de producto, puede llamarlo desde cualquier controlador que desee sin tener que tratar de pervertir el marco.

Una de las citas más útiles que leí fue que el controlador era como el "policía de tráfico", que se encarga de enrutar solicitudes y respuestas entre modelos y vistas.


Basado en la respuesta de @Joaquin Astelarra, he logrado escribir este pequeño ayudante llamado load_controller_helper.php :

<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); if (!function_exists(''load_controller'')) { function load_controller($controller, $method = ''index'') { require_once(FCPATH . APPPATH . ''controllers/'' . $controller . ''.php''); $controller = new $controller(); return $controller->$method(); } }

Puede usar / llamarlo así:

$this->load->helper(''load_controller''); load_controller(''homepage'', ''not_found'');

Nota: El segundo argumento no es obligatorio, ya que ejecutará el método llamado índice , como lo haría CodeIgniter.

Ahora podrá cargar un controlador dentro de otro controlador sin usar HMVC.

Más tarde Editar: Tenga en cuenta que este método podría tener resultados inesperados. ¡Pruébelo siempre!


Cargarlo así

$this->load->library(''../controllers/instructor'');

y llame al siguiente método:

$this->instructor->functioname()

Esto funciona para CodeIgniter 2.x.


Con el siguiente código, puede cargar las clases de controlador y ejecutar los métodos.

Este código fue escrito para codeigniter 2.1

Primero agregue un nuevo archivo MY_Loader.php en su aplicación / directorio central. Agregue el siguiente código a su archivo MY_Loader.php recién creado:

<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); // written by AJ [email protected] class MY_Loader extends CI_Loader { protected $_my_controller_paths = array(); protected $_my_controllers = array(); public function __construct() { parent::__construct(); $this->_my_controller_paths = array(APPPATH); } public function controller($controller, $name = '''', $db_conn = FALSE) { if (is_array($controller)) { foreach ($controller as $babe) { $this->controller($babe); } return; } if ($controller == '''') { return; } $path = ''''; // Is the controller in a sub-folder? If so, parse out the filename and path. if (($last_slash = strrpos($controller, ''/'')) !== FALSE) { // The path is in front of the last slash $path = substr($controller, 0, $last_slash + 1); // And the controller name behind it $controller = substr($controller, $last_slash + 1); } if ($name == '''') { $name = $controller; } if (in_array($name, $this->_my_controllers, TRUE)) { return; } $CI =& get_instance(); if (isset($CI->$name)) { show_error(''The controller name you are loading is the name of a resource that is already being used: ''.$name); } $controller = strtolower($controller); foreach ($this->_my_controller_paths as $mod_path) { if ( ! file_exists($mod_path.''controllers/''.$path.$controller.''.php'')) { continue; } if ($db_conn !== FALSE AND ! class_exists(''CI_DB'')) { if ($db_conn === TRUE) { $db_conn = ''''; } $CI->load->database($db_conn, FALSE, TRUE); } if ( ! class_exists(''CI_Controller'')) { load_class(''Controller'', ''core''); } require_once($mod_path.''controllers/''.$path.$controller.''.php''); $controller = ucfirst($controller); $CI->$name = new $controller(); $this->_my_controllers[] = $name; return; } // couldn''t find the controller show_error(''Unable to locate the controller you have specified: ''.$controller); } }

Ahora puede cargar todos los controladores en su directorio de aplicaciones / controladores. por ejemplo:

cargar la clase de controlador Factura y ejecutar la prueba de función ()

$this->load->controller(''invoice'',''invoice_controller''); $this->invoice_controller->test();

o cuando la clase está dentro de un directorio

$this->load->controller(''/dir/invoice'',''invoice_controller''); $this->invoice_controller->test();

Simplemente funciona igual que cargar un modelo


De acuerdo con esta publicación de blog, puedes cargar el controlador dentro de otro controlador en codeigniter.

http://www.techsirius.com/2013/01/load-controller-within-another.html

Antes que nada necesitas extender CI_Loader

<?php class MY_Loader extends CI_Loader { public function __construct() { parent::__construct(); } public function controller($file_name) { $CI = & get_instance(); $file_path = APPPATH.''controllers/'' . $file_name . ''.php''; $object_name = $file_name; $class_name = ucfirst($file_name); if (file_exists($file_path)) { require $file_path; $CI->$object_name = new $class_name(); } else { show_error(''Unable to load the requested controller class: '' . $class_name); } } }

luego cargue el controlador dentro de otro controlador.


En estos casos puedes probar algunos php de la vieja escuela.

// insert at the beggining of home.php controller require_once(dirname(__FILE__)."/product.php"); // the controller route.

Entonces, tendrás algo como:

Class Home extends CI_Controller { public function __construct() { parent::__construct(); $this->product = new Product(); ... } ... // usage example public function addProduct($data) { $this->product->add($data); } }

Y luego solo usa los métodos del controlador como quieras.


Sé que esto es antiguo, pero si alguien lo encuentra más recientemente, sugeriría crear un archivo de clase separado en la carpeta de controladores. Pase el objeto controlador existente al constructor de la clase y luego puede acceder a las funciones desde cualquier lugar y no entre en conflicto con la configuración y el manejo de CI.


Si está interesado, hay un paquete bien establecido que puede agregar a su proyecto Codeigniter que se encargará de esto:

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/

Modular Extensions hace que CodeIgniter PHP framework sea modular. Los módulos son grupos de componentes independientes, típicamente modelo, controlador y vista, organizados en un subdirectorio de módulos de aplicación, que pueden incluirse en otras aplicaciones CodeIgniter.

OK, entonces el gran cambio es que ahora estarías usando una estructura modular, pero para mí esto es deseable. He usado CI por cerca de 3 años y no puedo imaginar la vida sin Extensiones Modulares.

Ahora, esta es la parte que trata de llamar directamente a los controladores para representar parciales de vista:

// Using a Module as a view partial from within a view is as easy as writing: <?php echo modules::run(''module/controller/method'', $param1, $params2); ?>

Eso es todo al respecto. Normalmente uso esto para cargar pequeños "widgets" como:

  • Calendarios de eventos
  • Lista de las últimas noticias
  • Formularios de suscripción al boletín
  • Centro

Normalmente construyo un controlador "widget" para cada módulo y lo uso solo para este propósito.

Su pregunta también fue una de mis primeras preguntas cuando comencé con Codeigniter. Espero que esto te ayude, a pesar de que puede ser un poco más de lo que estabas buscando. He estado usando MX desde entonces y no he mirado hacia atrás.

Asegúrese de leer los documentos y ver la gran cantidad de información sobre este paquete en los foros de Codeigniter. ¡Disfrutar!


Solo usa

..............

self::index();

..............


Solo para agregar más información a lo que dijo Zain Abbas:

Cargue el controlador de esa manera, y úselo como dijo:

$this->load->library(''../controllers/instructor''); $this->instructor->functioname();

O puede crear un objeto y usarlo de esta manera:

$this->load->library(''../controllers/your_controller''); $obj = new $this->your_controller(); $obj->your_function();

Espero que esto pueda ayudar.