Loading view outside view folder with CodeIgniter

后端 未结 7 2022
悲哀的现实
悲哀的现实 2020-12-03 12:44

I have the need to load a view from outside the scope of:

$this->load->view();

which appears to work from base/application/vie

相关标签:
7条回答
  • 2020-12-03 13:08

    Don't know whether it's a correct way, but it works :)

    In your application/core folder put this loader extention

    <?php
    
    class MY_Loader extends CI_Loader {
    
      function ext_view($folder, $view, $vars = array(), $return = FALSE) {
        $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH . $folder . '/' => TRUE));
        return $this->_ci_load(array(
                    '_ci_view' => $view,
                    '_ci_vars' => $this->_ci_object_to_array($vars),
                    '_ci_return' => $return
                ));
      }
    
    }
    
    ?>
    

    Then you want a external view file, suppose its in the third_party folder

    application/third_party/my_new_view.php

    Hello : <?php echo $my_name; ?>
    

    Then call your new view in the controller

    ext_view is your new view loader method,

    • 1st param : the folder inside you applicaton
    • 2nd param : the view name
    • 3rd param : the variables data and so on...

    test_controller.php

    $view_data = array('my_name' => 'dino');
    $this->load->ext_view('third_party', 'my_new_view', $view_data);
    

    If everything fine. it will output

    Hello : dino

    0 讨论(0)
  • 2020-12-03 13:11

    To customize models and views outside the 'application' folder, follow these easy steps,

    Create My_Loader.php file in 'application/core' directory Copy the code into the custom My_Loader.php

    class MY_Loader extends CI_Loader {
    
    function mymodel($model, $folder = '',$vars = array(), $return = FALSE) {
    
        array_push($this->_ci_model_paths, ""); //replace "" with any other directory
        parent::model($model);
    }
    
    
    function myview($folder, $view, $vars = array(), $return = FALSE) {
            $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH . '../' . $folder . '/' => TRUE));
            return $this->_ci_load(array(
                    '_ci_view' => $view,
                    '_ci_vars' => $this->_ci_object_to_array($vars),
                    '_ci_return' => $return
            ));
    }
    

    Save the file and in the controller, call and load the model (which resides outside the application folder) as,

    $this->load->mymodel('folder/model');
    

    and for the view,

    $this->load->myview('views','view_dir/view-php-file', $data);
    
    0 讨论(0)
  • 2020-12-03 13:12

    Following Dino's answer and correcting the ci_vars, working as view Codeigniter's function:

    Codeigniter View Function

    public function view($view, $vars = array(), $return = FALSE)
        {
            return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));
        }
    

    Dino's View Function will be now:

    function ext_view($folder, $view, $vars = array(), $return = FALSE) {
        $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH . $folder . '/' => TRUE));
        return $this->_ci_load(array(
                    '_ci_view' => $view,
                    '_ci_vars' => $this->_ci_prepare_view_vars($vars),
                    '_ci_return' => $return
                ));
      }
    
    0 讨论(0)
  • 2020-12-03 13:15

    Dino's solution seems very sound, and did indeed work for files in application, however, I was needing a bit deeper solution. Our CI is embedded into a subdirectory of a main directory, something like ip.ip.ip.ip/dir/sub/application/... Perhaps I was doing something wrong, but I was unable to make his solution work at all with my needs, even after trying to apply something like ../../, which still wouldn't be feasible; what if I need to go deeper into an unknown back directory count?

    Thus I ended up writing my own solution, that thus far, seems to work great, tho it makes use of vanilla PHP. In this manner it seeks to grab the very base directory your files sit in and load them, pretty much the same way CI's load function works.

    Same as his solution, create a file in application/core named MY_Loader.php. Then simply write in the following (or just add the method if you want to keep his solution as well):

    <?php
        class MY_Loader extends CI_Loader {
            public function base_view($view, $vars = array(), $get = FALSE) {
                //  ensures leading /
                if ($view[0] != '/') $view = '/' . $view;
                //  ensures extension   
                $view .= ((strpos($view, ".", strlen($view)-5) === FALSE) ? '.php' : '');
                //  replaces \'s with /'s
                $view = str_replace('\\', '/', $view);
    
                if (!is_file($view)) if (is_file($_SERVER['DOCUMENT_ROOT'].$view)) $view = ($_SERVER['DOCUMENT_ROOT'].$view);
    
                if (is_file($view)) {
                    if (!empty($vars)) extract($vars);
                    ob_start();
                    include($view);
                    $return = ob_get_clean();
                    if (!$get) echo($return);
                    return $return;
                }
    
                return show_404($view);
            }
        }
    

    Then, if you have a file named 'bob.php' in your inner most root directory, simply call as:

    $this->load->base_view('bob');
    // OR
    $this->load->base_view('bob.php');
    // OR if it's extension is .html
    $this->load->base_view('bob.html');
    

    And if it's in another directory at base root:

    $this->load->base_view('directory/bob');
    // OR
    $this->load->base_view('directory\bob.htm');
    

    Or however you please, as long as you call for a real file in a real directory!

    Hope this alternate solution might help someone of similar peril.

    0 讨论(0)
  • 2020-12-03 13:20

    Here is a much more straightforward answer that I found on the CodeIgniter forum at https://forum.codeigniter.com/thread-58412.html

    This is my ever-so-slight deviation from the solution presented by docmattman:

    class MY_Loader extends CI_Loader{
      public function __construct()
      {
        parent::__construct();
      }
    
      public function load_ext_view($view, $vars = array(), $return = FALSE)
      {
        $view_file = '/full/path/to/'.$view.'.php';
    
        if(file_exists($view_file)){
           $view_to_load = array('_ci_path'   => $view_file,
                                 '_ci_view'   => $view,
                                 '_ci_vars'   => $this->_ci_object_to_array($vars),
                                 '_ci_return' => $return
                                 );
    
           return $this->_ci_load($view_to_load);
        }
    
           return $this->view($view, $vars, $return);
        }
    }
    
    0 讨论(0)
  • 2020-12-03 13:23

    You can include assets like js,css into your view file directly. You need not load it as a View.

    Check the URL Helper function base_url();

    0 讨论(0)
提交回复
热议问题