web-dev-qa-db-ja.com

CodeIgniterのビュー内にビューを含める最良の方法

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

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

62
David

他のビュー内のビューはネストされたビューと呼ばれます。 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番目の方法を使用することでコードを混同する必要がないため、include phpのようなものではないからです。間接的には両方とも同じですが、1番目の方法は2番目の方法よりも明確でクリーンです!

109
sandip

正直なところ、テンプレートビューを作成し、コントローラーから必要なデータをロードすることでこれを行うことを好みます。これは、ビューからビューをロードするよりもコードの繰り返しが少なく、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を置くのと同等であり、無駄であり、最終的に保守可能ではありません。

17
Rick Calder

METHOD 1

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

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


METHOD 2

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

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

どちらのメソッドも他のメソッドより優れているわけではありません。データを渡す必要があるか(この場合はmethod2を使用)、メインビューの特定の部分にビューを含めるか(この場合はmethod1を使用した方が良い) )


METHOD

メインビューによってデータをインクルードビューに渡す

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

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

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

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

$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);
4
Rahul Chipad

この問題をより効率的な方法で解決するための私の意見では、私はそうしました:

名前(es。common_helpers.php、アンダースコアが重要です)で(アプリケーション/ヘルパーで)新しいヘルパーを作成します。このファイルでは、すべての関数を、たとえば共通のhtmlの一部を構築するために配置します。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    function getHead(){
    require_once(APPPATH."views/common/head.php");
    }   

    function getScripts(){
    require_once(APPPATH."views/common/scripts.php");
    }

    function getFooter(){
    require_once(APPPATH."views/common/footer.php");
    }

コントローラーでは、MVCに関して1つのビューのみを呼び出し、カスタムヘルパーから関数を呼び出します。

class Hello extends CI_Controller {

   public function index(){
       $this->load->helper('common');
       $this->load->view('index');   
   }

}
0
Tudor