CodeIgniter: Load controller within controller

后端 未结 10 1749
余生分开走
余生分开走 2020-11-28 07:43

I have a home controller with an index action that displays a set of featured products. However, the products are managed through a product

10条回答
  •  佛祖请我去吃肉
    2020-11-28 08:45

    With the following code you can load the controller classes and execute the methods.

    This code was written for codeigniter 2.1

    First add a new file MY_Loader.php in your application/core directory. Add the following code to your newly created MY_Loader.php file:

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

    Now you can load all the controllers in your application/controllers directory. for example:

    load the controller class Invoice and execute the function test()

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

    or when the class is within a dir

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

    It just works the same like loading a model

提交回复
热议问题