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)
关于从哪里去的任何想法将不胜感激:-)
不知道这是否是正确的方法,但它的工作原理:)
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/my_new_view.php
Hello : <?php echo $my_name; ?>
Run Code Online (Sandbox Code Playgroud)
ext_view是你的新视图加载器方法,
$view_data = array('my_name' => 'dino');
$this->load->ext_view('third_party', 'my_new_view', $view_data);
Run Code Online (Sandbox Code Playgroud)
你好:迪诺
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)
或者不管怎样,只要您在真实目录中调用真实文件!
希望这种替代解决方案可以帮助有类似危险的人.