Мне нужно загрузить представление извне:
$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.
Любые идеи о том, куда идти отсюда, будут очень признательны 🙂
Не знаю, правильно ли это, но это работает 🙂
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's
кажется очень надежным и действительно работает для файлов в application
, однако мне нужно было немного более глубокое решение. Наш CI встроен в подкаталог основного каталога, что-то вроде ip.ip.ip.ip/dir/sub/application/..
Возможно, я делал что-то не так, но я не смог полностью решить свои проблемы с моими потребностями даже после того, как попытался применить что-то вроде ../../
, что все равно было бы невозможным; что, если мне нужно углубиться в неизвестный счетчик обратного каталога?
Таким образом, я закончил тем, что написал свое собственное решение, которое пока что работает отлично, и использует ванильный 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); } }
Затем, если у вас есть файл с именем «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');
И если он находится в другом каталоге в базовом корне:
$this->load->base_view('directory/bob'); // OR $this->load->base_view('directory\bob.htm');
Или, как вам угодно, до тех пор, пока вы вызываете настоящий файл в реальном каталоге!
Надейтесь, что это альтернативное решение может помочь кому-то с подобной опасностью.
Чтобы настроить модели и представления за пределами папки '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);
создайте файл 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)); } }
создайте файл 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
и вы можете получить доступ к методу ext_view с помощью
$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'); } }
Вот гораздо более простой ответ, который я нашел на форуме CodeIgniter по адресу http://forum.codeigniter.com/archive/index.php?thread-58412.html
Это мое очень небольшое отклонение от решения, представленного докматмантом:
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); } }
Вы можете включать в свой файл как js, css напрямую. Вам не нужно загружать его в виде представления.
Проверьте функцию URL-адреса base_url ();