使用CodeIgniter加载视图文件夹外部的视图

bar*_*_88 5 php codeigniter autoload

我需要从以下范围之外加载视图:

$this->load->view();
Run Code Online (Sandbox Code Playgroud)

这似乎是从base/application/views目录工作.如何从/application/目录外部访问视图?

我想我将不得不延长CI_Loader class这将是最好的前进方式吗?

我还找到了包含view_paths的数组:

// base/system/core/Loader.php 
// CI_Loader 
 /**
 * List of paths to load views from
 *
 * @var array
 * @access protected
 */
protected $_ci_view_paths       = array();
Run Code Online (Sandbox Code Playgroud)

但是所有声明的变量上面的注释让我陷入困境

// All these are set automatically. Don't mess with them.
Run Code Online (Sandbox Code Playgroud)

关于从哪里去的任何想法将不胜感激:-)

Din*_*ino 9

不知道这是否是正确的方法,但它的工作原理:)

在你的application/core文件夹中放置这个加载器扩展

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

}

?>
Run Code Online (Sandbox Code Playgroud)

然后你想要一个外部视图文件,假设它在third_party文件夹中

应用/ THIRD_PARTY/my_new_view.php

Hello : <?php echo $my_name; ?>
Run Code Online (Sandbox Code Playgroud)

然后在控制器中调用新视图

ext_view是你的新视图加载器方法,

  • 第一个参数:您应用的文件夹
  • 第二个参数:视图名称
  • 第三个参数:变量数据等等......

test_controller.php

$view_data = array('my_name' => 'dino');
$this->load->ext_view('third_party', 'my_new_view', $view_data);
Run Code Online (Sandbox Code Playgroud)

如果一切都很好.它会输出

你好:迪诺

  • 我假设你可以添加做`APPPATH.'../'.$文件夹.'/'`如果你想制作一个看起来比APPPATH高一级的. (3认同)

SpY*_*3HH 7

Dino's 解决方案看起来非常合理,并且确实适用于文件application,但是,我需要更深入的解决方案.我们的CI嵌入到主目录的子目录中,类似于ip.ip.ip.ip/dir/sub/application/...也许我做错了什么,但是我无法根据自己的需要使他的解决方案工作,即使在尝试应用类似的东西之后../../,这仍然是不可行的; 如果我需要深入到未知的后台目录计数怎么办?

因此,我最终编写了自己的解决方案,到目前为止,似乎工作得很好,因为它使用了vanilla PHP.以这种方式,它试图获取文件所在的基本目录并加载它们,这与CI的加载函数的工作方式非常相似.

与他的解决方案相同,在application/corenamed中创建一个文件MY_Loader.php.然后简单地写下面的内容(或者如果你想保留他的解决方案,只需添加方法):

<?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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后,如果你的内部最根目录中有一个名为'bob.php'的文件,只需调用:

$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');
Run Code Online (Sandbox Code Playgroud)

如果它位于基根的另一个目录中:

$this->load->base_view('directory/bob');
// OR
$this->load->base_view('directory\bob.htm');
Run Code Online (Sandbox Code Playgroud)

或者不管怎样,只要您在真实目录中调用真实文件!

希望这种替代解决方案可以帮助有类似危险的人.