71

私は大規模な codeigniter プロジェクトを開始しており、さまざまなページ/コントローラーに表示されるデータのループなど、コンテンツのスニペット用に再利用可能な「ミニ」ビューを作成したいと考えています。

メインコントローラーのビュー内からビューを呼び出す方が良いですか? もしそうなら、どのように?または、コントローラーから「ミニ ビュー」を呼び出して、ビューのコードをメイン ビューに渡す必要がありますか?

4

6 に答える 6

124

他のビュー内のビューは、ネストされたビューと呼ばれます。CodeIgniterにネストされたビューを含めるには2つの方法があります。

1.コントローラー内にネストされたビューをロードします

事前にビューをロードして、他のビューに渡します。まず、これをコントローラーに入れます。

<?php
// the "TRUE" argument tells it to return the content, rather than display it immediately
$data['menu'] = $this->load->view('menu', NULL, TRUE);
$this->load->view ('home', $data);
?>

次に<?=$menu?>、メニューを表示したい場所にビューを配置します。

2.ビューの「内部から」ビューをロードします

まず、これをコントローラーに入れます。

<?php
  $this->load->view('home');
?>

次に、これを/application/views/home.phpビューに配置します。

<?php $this->view('menu'); ?>

<p>Other home content...</p>

最良の方法については、2番目の方法よりも1番目の方法の方が好きです。1番目の方法を使用することでコードを混同する必要がなく、 phpを含めるようなものではないからです。間接的には両方とも同じですが、1番目の方法は2番目の方法よりも明確でクリーンです!

于 2013-03-05T10:38:26.033 に答える
18

正直なところ、私はテンプレート ビューを作成し、コントローラーから必要なデータをロードすることでこれを行うことを好みます。これは、ビューからビューをロードするよりもコードの繰り返しが少なくなり、DRY の概念に従うことを意味します。特にヘッダー、フッター、メニューなどに。

したがって、私のテンプレート ビューは次のようになります。

template.php

$this->load->view('header',$title);
$this->load->view('sidebar',$sidebar_content);
$this->load->view('main_content',$main_content);
$this->load->view('footer');

次に、コントローラーで、次のようにテンプレートに必要なデータを渡します。

$data['title'] = 'Home Page';
$data['sidebar_content']='pages/standard_sidebar';
$data['main_content'] ='pages/my_home_page'; 
$this->load->view('template',$data);

このようにすることには多くの利点があります。まず、複数のテンプレートを使用できることです。たとえば、私の場合、2 つの主要なテンプレートがあり、1 つはサイドバーのないフル ページ ビュー用で、もう 1 つはサイドバー付きのページ用です。また、if ステートメントを呼び出して、含めるヘッダーを決定します。通常のもの、または管理メニューがあるもの。

はい、すべてのメイン ビュー ページにヘッダー、サイドバー、フッターを含めることはできますが、それでは大量の重複コードが発生します。たとえば、すべてのページに何か新しいもの、他の小さなスニペットを追加したい場合はどうなりますか? テンプレートを使用して、適切なテンプレートにスニペットを追加すれば完了です。私がすべてのページを見つけてそこにスニペットビューを追加する別のルートに行くと、私の意見ではページに CSS を配置するのと同じで、無駄が多く、最終的には保守できません。

于 2013-03-05T12:17:09.990 に答える
8

方法 1

このメソッドをビューに使用して、必要な場所にインクルード ビューを挿入します

$this->load->view('include/include_view');


方法 2

またはコントローラーでは、次のようなビュー以上のものをロードできます。

$this->load->view('header_view');
$this->load->view('list_view');
$this->load->view('footer_view');

データを渡す必要があるか (この場合は method2 を使用)、またはメイン ビューの特定の部分にビューを含めたいか (この場合は method1 を使用する方が良い) によって異なります。 )


方法 3

メイン ビューによるインクルード ビューへのデータの受け渡し

あなたのコントローラーに:

$data['title'] = "Title";
$this->load->view('main_view',$data);

あなたの見解では

$data2['title'] = $title;
$this->load->view('include/include_view',$data2);

データ全体をインクルード ビューに渡したい場合は、次の方法で行うことができます: コントローラーで:

$data['nestedView']['title'] = 'title';

あなたの見解では

$this->load->view('includes/included_view', $nestedView);
于 2013-03-05T10:26:25.737 に答える
4

これは、ビュー内にビューを含める簡単な方法です。事前にビューをロードする必要はありません。ビュー パスを他のビューに渡すだけです。

コントローラーでこれを使用します:

$data['middle'] = 'includeFolder/include_template_view';  //the view you want to include
$this->load->view('main_template_view',$data);  //load your main view

main_template_view には、他のビューを含めることができます。

$this->load->view($middle);
于 2013-03-05T11:31:06.777 に答える