2009-04-19 16 views
5

CodeIgniterまたはコアPHPでは、 Railsのビューパーシャルとテンプレートに相当するものはありますか?CodeIgniterまたはPHPと同等のRailsパーシャルおよびテンプレート

部分的には、ビュー内で別のビューフラグメントをレンダリングすることができます。私は共通のnavbar.phpビューを私が内部に指し示すことができる私のhomepage.phpビュー。テンプレートは、HTMLページの全体的なシェルを1か所で定義し、それぞれのビューが本文を埋めるようにします。

CodeIgniterのドキュメントに最も近いのはLoading multiple viewsで、いくつかのビューがコントローラ内で連続してレンダリングされました。コントローラーの中の私のページの見た目を決めるのは奇妙なことです。 (すなわち、私の設計者がコントローラを編集しなければならないnavbarを動かす)。

私はこれを達成するためにPHPの方法でスタックオーバーフローを検索しています。私はthis pageを見つけました。これは、部分的なシミュレーションについてob_startと話しています。それはCodeIgniterの中で推奨されるアプローチですか?

+0

は眼を試すためにあなたは、それを確認することができます:それはOPが求めているまさにだ場合http://codeigniter.com/wiki/Ocular_Layout_Library/ – Geshan

答えて

13

私はいくつかのMVCルールを壊しているかもしれませんが、私はいつも個々のビューに自分の "フラグメント"を配置し、CodeIgniterスタイルをそれらを必要とする他のビューからロードしました。ほとんどすべての私のビューのそれぞれ、上部と下部にヘッダーとフッタービューをロード:

<? $this->load->view("header"); ?> 
//Page content... 
<? $this->load->view("footer"); ?> 

ヘッダその後、同じようにナビゲーションバーを含むことができ、など

+1

これは、独自のデータを必要としないパーシャルに行く方法です。しかし、データを必要とする部分的なビュー(「ウィジェット」)の場合、第三者の「Modular Extensions HMVC」のようなものが良い選択です。 – rick

+0

これはパーシャルをレンダリングする最も簡単な方法だと思います。 '$ this-> load-> view()'関数をコントローラからではなく(** $ data'配列キーを介して)**ビューファイル**に置くようにしてください。 – hohner

0

これは残念ながらCodeIgniter固有のものではありませんが、Savant3テンプレートシステムをご覧ください。テンプレートを文字列にレンダリングすることができます。それからあなたはどこにでもそれを貼り付けることができます。

多分CodeIgniterのようなものがありますか?

ビューをレンダリングするとき、テンプレートをレンダリングするとき、そしてそれに含まれるすべてのサブテンプレートをファシリティに追加する方法を考えることができます。

3

PHPでは、CodeIgniterのとSmartyのは、一緒にうまくプレーinclude

+0

は私にはわかりません。私は評価の時点でインクルードされたファイルを実行すると信じています。 OPはRails形式のインクルードを要求しています(インクルードされたファイルが最初に評価され、IIRC、その後合成されます)。これは、ページテンプレート/部分/ビューコンテンツの内容に基づいて、ページテンプレートの内容を決定するときなどに大きな違いがあります。 –

5

これは私が使用してどのような本質的である:

function render_partial($file, $data = false, $locals = array()) { 
    $contents = ''; 

    foreach($locals AS $key => $value) { 
     ${$key} = $value; 
    } 

    ${$name . '_counter'} = 0; 
    foreach($data AS $object) { 
     ${$name} = $object; 

     ob_start(); 
     include $file; 
     $contents .= ob_get_contents(); 
     ob_end_clean(); 

     ${$name . '_counter'}++; 
    } 

    return $contents; 
} 

これはあなたのような何かを呼び出すことができます:

render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true)); 

と/path/to/person.phtmlではあります

<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>) 

これは、何が起こっているのかをよりよく把握するのに役立つかもしれない魔法です。フルファイル:view.class.php

+4

extract($ locals); – Mario

+0

jeej i tkRenderPartial()a lot myself;)+1 – Ropstah

2

私は自分自身から移動しましたRailsをCIにも渡し、パーシャルで何をしたのかは基本的にビュー内のパーシャルを変数としてレンダリングし、コントローラから設定します。

ビューでは、(_partial。PHP):

<h2>Here Comes The Partials</h2> 
<?= $some_partials ?> 

そして、あなたのようなコントローラーからそれを設定することができます。

$this->load->view('the_view', 
    array('some_partials', 
     $this->load->view('_partial', array(), TRUE) 
    ) 
); 

は個人的に、私が代わりのob_startのCIのビューを使用することを好むが、それは私です=) PS:ロードビュー最初の引数はビュー名、2つ目はビューに渡すパラメータ、3つ目は "ECHO"フラグです。これは基本的にCIを直接レンダリングするかビューの値を返すかを指示します。基本的に私がこの例で行ったことです。

私はそれが良い解決策だとは思わないが、それは私のために働く。誰もがより良い解決策を持っていますか?

+0

'CI_Loader'がビューを読み込むときに' ob_start() 'を使用するので、' ob_start() 'をコントローラで使うことはできません。だからあなたはエラーを起こすだろう。 '$ this-> load-> view( 'view_name'、$ data、true);'メソッドを使用して、レンダリングされたビューを文字列として返すことをお勧めします。 – sholsinger

0

ここには、use smarty with codeigniterの方法を説明するブログ記事があります。 asp.netのようなmasterpageも実装されています。

2

私の最近のリリースTemplate libraryは、このように動作します。

このテンプレートライブラリも、私のDwoo implementationでうまく再生されます。これにより、より多くのパワーを与えることができます。

0

パーシャルとテンプレート

http://code.google.com/p/ocular/wiki/Introduction 
関連する問題