19

ヘッダーとフッターを構築するための最良の方法は何ですか? コントローラーからすべて呼び出す必要がありますか、それともビューファイルから含める必要がありますか? 私は CodeIgniter を使用していますが、これのベスト プラクティスを知りたいと思っています。このように、コントローラーからすべての含まれているビュー ファイルをロードしますか?

class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('header');
      $this->load->view('menu');
      $this->load->view('content', $data);
      $this->load->view('footer');
   }

}

または、単一のビュー ファイルを呼び出し、そこからヘッダー ビューとフッター ビューを呼び出します。

//controller file    
class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('content', $data);

   }

}

//view file

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

<p>The data from the controller</p>

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

私はそれが両方の方法で行われるのを見てきましたが、道を行き過ぎる前に今選択したいと思います.

4

4 に答える 4

13

実際、これを自分でかなり調べた結果、MVCにヘッダーとフッターを含めるためのベストプラクティスは3番目のオプション、つまりベースコントローラーを拡張することであるという結論に達しました。これにより、特に非常にモジュール化されたレイアウト(ヘッダーとフッターだけでなく、サイドバーパネル、非静的メニューなど)を構築している場合は、テキストの提案よりも少し柔軟性が高くなります。

まず、Base_controllerクラスを定義します。このクラスでは、ページ要素(ヘッダー、フッターなど)を出力文字列に追加するメソッドを作成します。

class Base_controller extends Controller
{
    var $_output = '';

    function _standard_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for standard header here

        $this->_output .= $this->load->view('header', $data, true);
    }

    function _admin_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for expanded header here

        $this->_output .= $this->load->view('admin_header', $data, true);
    }

    function _standard_page($data)
    {
        $this->_standard_header();
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output; // note: place the echo statement in a
                             // separate function for added flexibility
    }

    function _page_with_admin_header($data)
    {
        $this->_admin_header($data);
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output;
    }
}

次に、ページコントローラで、基本クラスを拡張し、関数を呼び出してページを作成します。

class Page_controller extends Base_controller
{
    function index()
    {
        $data = ...; // Set content data here
        $this->_standard_page($data);
    }

    function admin()
    {
        $data = ...; // Set content and header data here
        $this->_page_with_admin_header($data);
    }
}

ベースコントローラーを使用すると、個々のページコントローラーで非常にクリーンなコードを実現し、ページ上の要素に対して個別のビューを設定できます(ビューとコントローラーの両方でコードを再利用できます)。必要なのは、共通ページの「セクション」(「フラグメント」と呼びたくなるかもしれないもの)をベースコントローラーの関数として定義することだけです。

また、ベースコントローラーが制御不能に成長し始めた場合(大規模なサイトで発生する可能性があります)、サブクラスに配置し、対応するページコントローラーに元のベースコントローラーの代わりにそれらを拡張させることで、一般的でない関数の一部を再配置できます。

楽しみ!

于 2009-01-24T19:49:17.657 に答える
10

この方法で試すこともできます。デフォルトのビュー テンプレートを定義すると、コントローラーから渡された変数 (この例では「コンテンツ」) に基づいてコンテンツが取り込まれます。

コントローラーで:

$data['content'] = 'your_controller/index';

// more code...

$this->load->vars($data);
$this->load->view('layouts/default');

次に、views/layouts/default.php など、すべてのページのデフォルト レイアウトを定義します。

// doctype, header html etc.

<div id="content">
    <?= $this->load->view($content) ?>
</div>

// footer html etc.

次に、ビューに純粋なコンテンツのみを含めることができます。たとえば、views/your_controller/index.php には、コントローラー/データ配列から渡された変数のみを含めることができます。

<?= $archives_table ?>
<?= $pagination ?>
// etc.

CI wiki/FAQ の詳細-- (Q. ビュー内にビューを埋め込むにはどうすればよいですか? ネストされたテンプレート?...)

于 2008-10-07T15:04:04.023 に答える
4

あなたがそれをしている最初の方法はよりきれいだと思います。単にレンダリングされる知識の観点から。残りを見つけるためにビューファイルを入力する必要はありません。

于 2008-10-07T03:48:17.537 に答える
3

他のビュー内でビューを呼び出すのは悪い習慣です。これは、コントローラービューの混合の一種である可能性があります。CI のビュー関数では、ビューの出力を文字列として返すようにする 3 番目のパラメーターを渡すことができます。これを使用して複合ビューを作成できます。

例えば:

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';
      
      $this->load->view('default_layout', array(
         'header'  => $this->load->view('header' , array(), true), 
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
         'footer'  => $this->load->view('footer' , array(), true), 
      ));
   }
}

default_layout.php

<? echo $header, $menu, $content, $footer; ?>

ヘッダーとフッターを組み合わせて、このようなテンプレートを作成することができます。

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';
      
      $this->load->view('default_template', array(
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
      ));
   }
}

default_template.php

<html><head></head><body><span>Some Header HTML</span> // this is your header html
<? echo $menu, $content; ?>
<span>some footer HTML</span></body></html>  // this is your footer html
于 2008-10-07T02:14:56.180 に答える