2011-10-13 8 views
1

私はこの誤解を解釈しているかどうかはわかりませんが、私がいれば私を修正してください。私は、Code IgniterのLoaderクラスを使ってアプリケーション "package"をロードしています。ほとんどの場合、正常に動作しています。しかし、私を引きつけているのは、ビューパスがどのように動作しているか(または動作していないか)です。ドキュメント(http://codeigniter.com/user_guide/libraries/loader.html)でコードイグナイター2.0.3ローダーadd_package_pathビューカスケード

、それは言う:。

「デフォルトでadd_package_path()が表示パスがループスルーされていると呼ばれ、一致が検出されたら、そのビューがある場合は、パッケージのビューファイルのパスが設定されています

この場合、パッケージ内の名前の衝突による名前の衝突が発生し、誤ったパッケージが読み込まれる可能性があります。これを防ぐには、add_package_path()を呼び出すときにオプションの2番目のパラメータをFALSEに設定してください。

これは、彼らが与えるサンプルコードです:

$this->load->add_package_path(APPPATH.'my_app', TRUE); 
$this->load->view('my_app_index'); // Loads 
$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is TRUE 

// Reset things 
$this->load->remove_package_path(APPPATH.'my_app'); 

// Again without the second parameter: 
$this->load->add_package_path(APPPATH.'my_app', TRUE); 
$this->load->view('my_app_index'); // Loads 
$this->load->view('welcome_message'); // Loads 

)私はサンプルコードにタイプミスがあると思いますし、彼らがadd_package_pathへの2回目の呼び出し(にFALSEに渡すことを意味します。私の解釈は、あなたがFALSEを渡すと、パッケージのビューパスをスキップし、元のビューパスを使用する必要があるということです。

しかし、私が実際にFALSEで渡そうとすると、私はまだ外部パッケージからビューを取得しています(ビュー名は外部パッケージと現在のアプリケーションの両方に存在します)。

public function add_package_path($path, $view_cascade=TRUE) 
{ 
    $path = rtrim($path, '/').'/'; 

    array_unshift($this->_ci_library_paths, $path); 
    array_unshift($this->_ci_model_paths, $path); 
    array_unshift($this->_ci_helper_paths, $path); 

    $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; 

    // Add config file path 
    $config =& $this->_ci_get_component('config'); 
    array_unshift($config->_config_paths, $path); 
} 

何それがないことで、ビューのパスアレイの前にパッケージビューのパスを追加します:/system/core/Loader.phpでLoaderクラスを見てみると、これはadd_package_pathの定義は()でありますTRUEまたはFALSEの値。実際Loaderクラスでも、ビューをロードし_ci_load($ _ ci_data)と呼ばれる機能で、これはそれがで見てビューのパスを選択したセグメントである:

foreach ($this->_ci_view_paths as $view_file => $cascade) 
{ 
    if (file_exists($view_file.$_ci_file)) 
    { 
     $_ci_path = $view_file.$_ci_file; 
     $file_exists = TRUE; 
     break; 
    } 

    if (! $cascade) 
    { 
     break; 
    } 
} 

それはもしように私には思えますadd_package_pathの2番目のパラメータがTRUEかFALSEかにかかわらず、ビューは外部パッケージに存在します(add_package_pathの呼び出しから配列のfromにあるため)。これに関する文書はあまり多くありません。このために報告されたバグ報告はありませんでした。ここでも、私の解釈は、add_package_path()に渡された2番目のパラメータがFALSEの場合、パッケージのビューパスをスキップする必要があるということです。私は_ci_load()で、カスケードのチェックの内側に休憩の代わりに続行する必要があり、それがファイルのチェックの前に来るべきだと思っています。

これは私が報告しなければならないバグですか、ここで間違った解釈をしていますが、機能が正常に動作していますか?

+0

私は同じ問題があります。回避策を見つけることができましたか? –

答えて

1

この日付にも誤字があります。 2番目のコード例の2番目の引数はFALSEである必要があります。使い方の

私の解釈は次のとおりです。

2番目の引数がTRUEの場合、ビューは唯一の外部パッケージからロードされます。

2番目の引数がFALSEの場合、ビューは外部パッケージまたはローカルリポジトリからロードされます(外部パッケージを最初にチェックします)。外部パッケージにない場合は、ローカルリポジトリで検索を続行する必要があります。