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()
、必要なナビゲーション データを構成ファイルから削除して読み込むことですが、これを行う方法がわかりません。