7

次の範囲外からビューをロードする必要があります。

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

ここからどこへ行くべきかについてのアイデアは大歓迎です:-)

4

6 に答える 6

11

それが正しい方法かどうかはわかりませんが、うまくいきます:)

あなたの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は、新しいビュー ローダー メソッドです。

  • 第 1 パラメータ: アプリケーション内のフォルダ
  • 2 番目のパラメーター: ビュー名
  • 3 番目のパラメーター: 変数データなど...

test_controller.php

$view_data = array('my_name' => 'dino');
$this->load->ext_view('third_party', 'my_new_view', $view_data);

すべてがうまくいけば。それは出力します

こんにちは:ディノ

于 2013-06-28T09:04:45.970 に答える
7

Dino's ソリューションは非常に健全なようで、実際に のファイルで機能しましapplicationたが、もう少し深いソリューションが必要でした。私たちの CI は、メイン ディレクトリのサブディレクトリに埋め込まれていip.ip.ip.ip/dir/sub/application/..ます。おそらく私は何か間違ったことをしていましたが、彼のソリューションを私のニーズに合わせてまったく機能させることができませんでした../../。不明なバック ディレクトリ カウントをさらに深く調べる必要がある場合はどうすればよいですか?

したがって、私は独自のソリューションを作成することになりました。これまでのところ、バニラ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);
        }
    }

次に、最も内側のルート ディレクトリに「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');

または、実際のディレクトリ内の実際のファイルを呼び出す限り、好きなようにできます!

この代替ソリューションが、同様の危険にさらされている人に役立つことを願っています。

于 2014-04-29T20:52:30.863 に答える
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と、次の方法で 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');
  }
}
于 2015-06-24T21:48:21.960 に答える
0

これは、 https: //forum.codeigniter.com/thread-58412.html の CodeIgniter フォーラムで見つけた、より直接的な回答です。

これは、docmatman によって提示されたソリューションからの私のごくわずかな逸脱です。

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);
    }
}
于 2016-04-08T20:31:27.367 に答える
0

Dino's answer に従って、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
            ));
  }
于 2019-01-26T19:51:39.090 に答える