0

CodeIgniter と MVC パターン全体を試しています。Colin Williams の Template ライブラリをインストールしましたが、2 つのメニュー/ナビゲーションを含める適切な方法を考えようとすると行き詰まります。1 つは一般的なもの (おそらく上部) で、もう 1 つは各コントローラーに固有のサイドバーです。

いずれにせよ、それらの配置は関係ありません。コードの一般的な構造について考えています。今のところget_menu()、モデルに関数があり、サイドバーの部分テンプレート ビューをロードするときに、この関数からの戻り値が引数として渡されます。または、コントローラーで行う必要がありますか?

私の友人は、デフォルトのコントローラーまたはモデルを ie a で拡張しないようにアドバイスしてくれましたMY_Controllerが、いつ一般メニューを実装するのかわかりませんか? または、テンプレート構成ファイルでこれをハードコーディングする必要がありますか?

このタイプのタスクに関するガイドラインは見つかりません。どこに行っても新しい解決策を見つけましたが、それらの多くは見栄えが悪く、他の多くには重複したコードがたくさんあります。

編集。コードを更新しました。上部のナビゲーションをどのように書くかまだ決めていません (おそらくMY_Controller、現在のページを強調表示できるようにするためです)。

MY_Controller.php

abstract class MY_Controller extends CI_Controller {
    protected $_nav;

    const CONTENT_REGION = 'content';
    const NAV_REGION = 'nav';
    const TITLE_REGION = 'title';

    const SIDEBAR_NAV_TEMPLATE = 'templates/sidebar_nav';

    public function __construct() {
        parent::__construct();
        $this->_load_nav();
    }

    abstract protected function _get_nav();

    protected function _load_nav() {
        $this->_nav = array('nav' => $this->_get_nav());
    }

    protected function _render() {
        $args = func_get_args();
        $n = func_num_args() - 1;

        if ($n < 2) {
            return;
        }

        $this->template->write(self::TITLE_REGION, $args[0]);

        for ($i = 1; $i < $n; $i++) {
            $this->template->write_view(self::CONTENT_REGION, $args[$i], $args[$n]);
        }

        $this->template->write_view(self::NAV_REGION, self::SIDEBAR_NAV_TEMPLATE, $this->_nav);
        $this->template->render();
    }

    protected function _set_active_view($active) {
        if ($active !== null && isset($this->_nav['nav'][$active])) {
            $this->_nav['nav'][$active]['class'] .= ' active';
        }
    }
}

コレクション.php

class Collection extends MY_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->model('collection_model');
    }

    protected function _get_nav() {
        return array(
            'collection/view' => array(
                'href'  => 'collection/view',
                'value' => 'View collection',
                'class' => 'icon-film'
            ),
            'collection/add' => array(
                'href'  => 'collection/add',
                'value' => 'Add title',
                'class' => 'icon-plus-sign'
            )
        );
    }

    public function index() {
        $this->view();
    }

    public function view() {
        $data['list'] = $this->collection_model->get_list();
        $this->_set_active_view('collection/view');
        $this->_render('View Collection', 'collection/view', $data);
    }
}

sidebar_nav.php

<ul class="nav nav-list bs-docs-sidenav">
    <?php

    foreach ($nav as $item) {
        echo '<li';

        if ($item['class'] !== null || $item['class'] !== '') {
            echo ' class="' . $item['class'] . '"';
        }

        echo '><a href="' . $item['href'] . '">' . $item['value'] . '</a></li>';
    }

    ?>
</ul>

これはどのように見えますか?すべてのテンプレート処理を行う関数_render($title, $view, $data)を に書くかもしれません。MY_Controllerどう思いますか?

私が考えている別の解決策は_get_nav()、必要なナビゲーション データを構成ファイルから削除して読み込むことですが、これを行う方法がわかりません。

4

1 に答える 1

0

あなたの「相棒」がコントローラークラスを拡張しないように言う理由として考えられるものは何ですか? このタイプの反復的なものは、まさにその機能の目的です... サイト全体で頻繁に使用する getMenu などの関数を使用して MY_Controller を作成し、CI_Controller ではなく MY_Controller を拡張するコレクションを作成します。

CI コントローラーを拡張するだけでなく、MY_Controller を User_Controller および Admin_Controller に拡張して、それらのユーザーのみが使用できる特定の機能を含めます。

なぜそんなことをするなと言う人がいるのか、一生想像がつきません。

于 2012-10-22T17:49:58.880 に答える