Загрузка окна просмотра внешнего вида с помощью CodeIgniter

Мне нужно загрузить представление извне:

$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. 

Любые идеи о том, куда идти отсюда, будут очень признательны 🙂

Solutions Collecting From Web of "Загрузка окна просмотра внешнего вида с помощью CodeIgniter"

Не знаю, правильно ли это, но это работает 🙂

В вашей папке 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

Приложение / THIRD_PARTY / my_new_view.php

 Hello : <?php echo $my_name; ?> 

Затем вызовите новое представление в контроллере

ext_view – ваш новый метод загрузчика вида,

  • 1-й параметр: папка внутри вас.
  • 2-й параметр: имя вида
  • 3-й параметр: данные переменных и т. Д. …

test_controller.php

 $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 ();