我需要从以下范围之外加载视图:
$this->load->view();
似乎在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();
但是所有声明的变量上面的注释让我陷入困境
// All these are set automatically. Don't mess with them.
任何关于从哪里开始的想法都将非常感激:-)
答案 0 :(得分:8)
不知道这是否是正确的方法,但它有效:)
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
));
}
}
?>
<强>应用/ THIRD_PARTY / my_new_view.php 强>
Hello : <?php echo $my_name; ?>
ext_view 是您的新视图加载器方法,
$view_data = array('my_name' => 'dino');
$this->load->ext_view('third_party', 'my_new_view', $view_data);
您好:dino
答案 1 :(得分:6)
Dino's
solution似乎非常合理,确实适用于application
中的文件,但是,我需要更深入的解决方案。我们的CI嵌入到主目录的子目录中,类似于ip.ip.ip.ip/dir/sub/application/..
。也许我做错了什么,但即使尝试应用../../
这样仍然不可行的东西,我也无法根据自己的需要使他的解决方案完全有效。如果我需要深入到未知的后台目录计数怎么办?
因此,我最终编写了自己的解决方案,到目前为止,似乎工作得很好,因为它使用了vanilla PHP。通过这种方式,它试图获取文件所在的基本目录并加载它们,这与CI的加载功能非常相似。
与他的解决方案相同,在名为application/core
的 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);
}
}
然后,如果你有一个名为&#39; bob.php&#39;在你最内层的根目录中,只需调用:
$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');
如果它位于基地的另一个目录中:
$this->load->base_view('directory/bob');
// OR
$this->load->base_view('directory\bob.htm');
或者不过请你,只要你在真实目录中要求一个真实的文件!
希望这个备用解决方案可以帮助有类似危险的人。
答案 2 :(得分:0)
要在'application'
文件夹之外自定义模型和视图,请按照以下简单步骤进行操作
在My_Loader.php
目录中创建'application/core'
文件
将代码复制到自定义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
));
}
保存文件并在控制器中调用并加载模型(位于应用程序文件夹之外),
$this->load->mymodel('folder/model');
并且对于视图,
$this->load->myview('views','view_dir/view-php-file', $data);
答案 3 :(得分:0)
在application / core /
中创建一个文件MY_Loader.php<?php
class MY_Loader extends CI_Loader {
function __construct() {
parent::__construct();
$CI =& get_instance();
$CI->load = $this;
}
public function ext_view($view, $vars = array(), $return = FALSE){
$_ci_ext = pathinfo($view, PATHINFO_EXTENSION);
$view = ($_ci_ext == '') ? $view.'.php' : $view;
return $this->_ci_load(array(
'_ci_vars' => $this->_ci_object_to_array($vars),
'_ci_path' => $view, '_ci_return' => $return));
}
}
在application / core /
中创建一个文件MY_Controller.php<?php
class MY_Controller extends CI_Controller {
public function __construct(){
parent::__construct();
$this->load =& load_class('Loader', 'core', 'MY_');
$this->load->initialize();
log_message('debug', "Controller Class Initialized");
}
}
使用MY_Controller
代替CI_Controller
,您可以使用
$this->load->ext_view(path/to/the/view/file,@param2,@param3);
例如:
class Welcome extends MY_Controller {
public function __construct() {
parent::__construct();
}
public function index() {
$this->load->ext_view('/path/to/view');
}
}
答案 4 :(得分:0)
我在http://forum.codeigniter.com/archive/index.php?thread-58412.html
的CodeIgniter论坛上找到了一个更直截了当的答案这是我对docmattman提出的解决方案的一点点偏离:
XElement xml2 = XElement.Load(HttpContext.Current.Server.MapPath("~/tests/UnitTests/Services/DocumentUpload.xml"));
答案 5 :(得分:0)
遵循Dino的答案并更正ci_vars,用作视图Codeigniter的功能:
Codeigniter查看功能
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的查看功能现在为:
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
));
}
答案 6 :(得分:-2)
您可以直接在视图文件中包含js,css等资源。您无需将其作为视图加载。
检查URL Helper函数base_url();