0

私のページには、すべてのページに読み込まれるメニューがあります。メニューデータは、モデルを介してデータベースからフェッチされます。私が最初に考えたのは、コントローラーからモデルを呼び出してから、それをすべてのページのビューに渡すことでした。しかし、それは「厄介な」コードになります。メニューデータをビューに渡すのを忘れると、醜いエラーが発生します(またはメニュー項目がないだけです)。

そこで、ヘルパーを介してメニュー項目をフェッチし、ビューからヘルパー関数を呼び出すという解決策を思いつきました。コードは1か所(メニュービュー)にしか存在しないため、より理にかなっています。

私のビューは次のように設定されています。コントローラーは「ページ」ビューを呼び出し、ヘッダービュー、メニュービュー、適切なコンテンツビュー、最後にフッタービューを読み込みます。ヘルパーは、メニュービューという1つの場所からのみ呼び出されます。

通常、ヘルパーからモデルをロードすることもできませんが、$ i = get_instance();を使用して回避策を実行しました。次に、そのインスタンスを介してモデルをロードします。$ i-> load-> model()。

これは進むべき道ではないと感じていますが、もっと良い方法はありますか?

編集:より良い方法でそれを置くために:

欲しい:表示->データを取得->表示

ない:コントローラー->データの取得->表示に渡す->表示

MVCモデルを完全に無視しているため、それが「OK」であるかどうかはわかりません。

4

3 に答える 3

2

そこで、カットアンドペーストの簡単な例を見つけました(この場合、自動ロードと呼ばれるモデルloginがありますが、もちろん手動で行うこともできます)

ファイル内core\MY_Controller.php

class Admin_Controller extends CI_Controller 
{
    protected $login_ok;

    public function __construct() 
    {
        parent::__construct();

        /* --- Check if user is logged in --- */
        $this->config->load('adldap', TRUE);
        $data->login_ok = $this->login->check_login(TRUE);

        $this->load->vars($data);
    }
}

次に、これを使用してコントローラーを拡張します。あなたは$login_okあなたの見解で利用可能になります。

このようにして、必要な変数が常に準備され、コードを1か所に記述すればよいことを確認できます。

于 2012-07-04T15:52:33.423 に答える
1

解決策はあなたが思っているよりも簡単だと思います。

今あなたがあなたのヘルパーでこのようなことをしているなら:

create_menu()
{
    $menu_items = $this->db->query('')->result();
    // creating the menu here
}

このような入力を受け入れるように関数を変更するだけで、MVCパターンに従うことができます。

ヘルパー

create_menu($input)
{
    $menu_items = $input;
    // creating the menu here
}

モデル:

get_menu_data()
{
   $menu_items = $this->db->query('')->result();
}

これは意味がありますか?

編集:

これは私がプロジェクトの1つでそれをした方法です:

標準コントローラーを拡張しました。そのコントローラーのコンストラクター内で、モデルを呼び出してデータを取得しました。

$this->menu_items = $this->some_model->get_menu_items();

ビュー内nav.php

if(!empty($this->subnav_item))
{
   // Generate menu
}

このようにMVCはそのままですが、変数の受け渡しについて心配する必要はありません。

編集2

標準コントローラーを拡張する方法:

でファイルを作成MY_Controller.phpするapplication/core

class MY_Controller extends CI_Controller {

    public $menu_items = '';

    function __construct()
    {
        parent::__construct();
        $this->load->model('some_model_that_you_always_use');
        $this->load->library('some_library_that_you_always_use');
        $this->menu_items = $this->some_model->get_menu_items();
    }

}

新しいコントローラーを作成するときは、次のように拡張するMY_Controllerのではなく、次のCI_Controllerように拡張します。

 class Something extends MY_Controller {

 }
于 2012-07-04T14:30:28.793 に答える
1

MVCパターンについては、ビューがモデルに直接接続することを禁止するものは何もないことに注意してください。これは、CodeIgniterで一般的に思われる慣例です。

この場合、メニュービューはメニューモデルから直接メニューデータをロードする必要があることをお勧めします。

于 2012-07-04T15:07:32.900 に答える