多くの $this->load->view() を任意のコントローラー関数にコピー/ペーストするのが本当に好きですか? スパゲッティコードです。次に試すことができます: たとえば、デフォルトのコントローラーとして main.php コントローラーがあります。このメイン コントローラには主な機能が含まれています。
public function index()
{
ob_start();
$this->load->model('mainmodel');
$data = $this->mainmodel->_build_blocks(); //return array with needed blocks (header, menu, content, footer) in correct order
foreach ($data->result_array() as $row) {
$this->load->module($row['block_name']);
$this->name = new $row['block_name'];
$this->name->index();
}
ob_end_flush();
}
したがって、他の各コントローラーには、url セグメントに応じてアクションをディスパッチしたり、パラメーターを準備したりできる index() 関数もあります。
例としてのフッターコントローラー (私はテンプレートエンジンとして Smarty を使用しています):
public function index()
{
$this->mysmarty->assign('year', date("Y"));
$this->mysmarty->view('footer');
return true;
}
コンテンツ コントローラには次のものがあります。
public function index()
{
$name = $this->uri->segment(1, 'index');
$act = $this->uri->segment(2, 'index');
$this->load->module($name);
$this->name = new $name;
$pageData = $this->name->_show($act);
if ($pageData)
{
$this->mysmarty->assign($name, $pageData);
}
$this->mysmarty->view($name);
}
つまり、 http://site.name/page/contactusを表示したい場合は、次のようになります。
1) 必要なブロックによる main.php 開始サイクル
2) まず、ヘッダーコントローラーで header.tpl を表示します
3) 次に、メニューを表示します
4) 次に、URL を解析するコンテンツ コントローラーを呼び出し、ページ コントローラーで _show() 関数を呼び出す必要があるものを見つけ、それに action='contactus' を渡します。_show() 関数には、アクション名 (この場合は contactus.tpl) に依存するテンプレートを表示するいくつかのスイッチ/ケース構成を含めることができます。
5) 最後にフッター テンプレートを表示します
その場合は柔軟な体制をとっております。すべてのコントローラーには index() 関数が必要であり、コンテンツで呼び出すことができるすべてのコントローラーには _show($act) 関数が必要です。それで全部です。