2012-03-01 12 views
2

私のWebアプリケーション用のテーマレイアウトを設計しています。Codeigniter - 他にビューがある場合

私はif($this->router->fetch_class() == 'A') { //display div A }

を利用することにより、コントローラ内部でこれを設定する方法を知っているのは、私は2つのコントローラを持っている場合は、AとB、私はビューはDIV AとBのビューを表示するにはのdiv B.

が表示されます言ってみましょう

しかし、これをどのように表示するには?

答えて

3

Noooo。そうしないでください。 ;)この種のハードコーディング文字列は、ほとんど常に悪いアプローチです。あなたの意見は厄介になり、あなたのコントローラークラスの名前を変更することができます。

まず、このコードがコントローラ内にある場合、はコントローラの種類がわかりません。

これは、これが複数のコントローラで使用されている継承されたメソッドであると想定しています。

  1. 表示したいDIV parent::some_action()方法を言って、当たりの子ごとでそれをオーバーライド:その場合には、いくつかのオプションがあります。あなたが名前を変更する場合は、あなたのIDEがあなたのために重い物を持ち上げるを行いますように(instanceof、むしろfetch_class()を使用するよりも

  2. 使用する(ここでは「権威」の適切な代表団は...後にあなたにいくつかのデカップリング頭痛が保存されます)クラス)。

  3. をサブビュー(つまり部分的なもの)に分割することを検討してください。 は実際にはになります。ビュー内で文字列の比較を行うのは面倒です。信頼。私。

は、ここで私が推薦するものです:

<?php 
// Overridden core class 
class MY_Controller extends CI_Controller { 

    public function some_action() 
    { 
     //... 
     if ($this instanceof Controller_class_that_uses_div_a) 
     { 
      $this->load->view('view_for_div_A'); 
     } 
     else 
     { 
      $this->load->view('view_for_div_B'); 
     } 
     //... 
    } 
} 
+1

私は自分自身の疑問にうんざりしていました。私はここで同意する。あなたは、眺めの中でコントローラのことをするという習慣に乗りたいとは思わない。生きている人のために、このコードを混乱させなければならないので、それをシンプルに保ってください。 –

3

あなたはあなたのコントローラで同じロジックを持っているし、ちょうどあなたのビューまでの値を渡すことができます:

$class = $this->router->fetch_class(); 

$this->load->view('myView', 
        array('class' => $class)); 

それからちょうどあなたのビューでその変数を使用します。

if ($class == 'A') ... 
+1

痛い、それはいくつかの通常の文字列ではないという理由だけで、私はthat..Thanks.willはそれを与えるようにそれがビューに渡すことはできませんと思いましたa try – foxns7

+0

はい、私が認識している制限はありません。文字列だけでなく、他のタイプのオブジェクトもビューに渡すことができます。 –

関連する問題