I have the need to load a view from outside the scope of:
$this->load->view();
which appears to work from base/application/views
directory. How can I access a view from outside the /application/
directory ?
I assume i will have to extend the CI_Loader class
would this be the best way forward ?
I have also found the array which holds the 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();
but the comment above all the declared variables has got me stuck
// All these are set automatically. Don't mess with them.
Any ideas on where to go from here would be greatly appreciated :-)
Don't know whether it's a correct way, but it works :)
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
));
}
}
?>
application/third_party/my_new_view.php
Hello : <?php echo $my_name; ?>
ext_view is your new view loader method,
$view_data = array('my_name' => 'dino');
$this->load->ext_view('third_party', 'my_new_view', $view_data);
Hello : dino
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With