在我的codeigniter控制器函数中,我使用以下代码生成我的视图并插入所有必要的内容:
$left_column = $this->load->view('widgets/sub_navigation', $subnav_data, true);
$left_column .= $this->load->view('widgets/search_box', '', true); //Set data to be loaded into columns
$left_column_base = $this->load->view('widgets/assist_navigation', '', true);
$center_column = 'this is center column';
$right_column = $this->load->view('widgets/ask_us_a_question', '', true);
$right_column .= $this->load->view('widgets/newsletter', '', true);
$right_column .= $this->load->view('widgets/latest_news', '', true);
$this->template->inject_partial('left_column', $left_column); //Inject data into the partial columns
$this->template->inject_partial('left_column_base', $left_column_base);
$this->template->inject_partial('center_column', $center_column);
$this->template->inject_partial('right_column', $right_column);
$this->template->build('template',$data);
我使用的是三列布局,上面的代码指示了每个列中显示的内容。它以非常模块化的方式工作,允许我快速自定义每个页面。
有没有办法简化上面的代码,使用数组,可以减少重复代码,使事情更干嘛?
答案 0 :(得分:5)
您需要创建扩展CI_Controller的基本控制器。然后,所有控制器都会扩展您创建的某个基本控制器,具体取决于在调用控制器的所有情况下需要执行的操作。
在application/core
中创建一个名为MY_controller.php
的文件(前缀可在配置中更改):
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
/* Widgets are only prepared -- they will be fetched and rendered once layout->render is called.
This saves the overhead of reading the files on requests where layout isn't rendered.
*/
$this->layout->prepare_widget( "widgets/navigation", "navigation_widget" );
$this->layout->prepare_widget( "widgets/footer", "footer_widget" );
$this->layout->prepare_widget( "widgets/twitter", "twitter_widget" );
}
}
class Public_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
}
}
class Admin_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
if( !$this->user->has_permissions( PERMISSION_ADMIN ) )
{
redirect( base_url(), "location", 303 );
die();
}
}
}
class Member_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
if( !$this->user->has_permissions( PERMISSION_REGISTERED ) )
{
redirect( base_url(), "location", 303 );
die();
}
}
}
如您所见,所有子控制器都自动拥有小部件,因为它们扩展了public,admin或member。扩展管理控制器的子控制器会自动检查权限,因此您无需再次执行此操作。您可以将此概念应用于您的应用。
子控制器:(置于正常application/controllers
)
class Articles extends Member_controller {
...
}
将自动确保用户已登录,并且无需执行任何操作即可准备小部件,因为父类的父级已准备好它们。如果逻辑需要在最后进行布局渲染,那么您需要在文章中做的就是调用$this->layout->render
。
答案 1 :(得分:1)
Codeigniter控制器是在事务脚本模式之后设计的,众所周知,当应用程序增长时,控制器会变得很大并且“不会干”。
为防止出现这种情况,您可以重新实现视图以处理支持布局的两步复合视图模式。寻找布局视图IIRC在codeigniter网站上有一些。
答案 2 :(得分:0)
我写了一篇博文,解释了我在组织CodeIgniter控制器时的设计理念,使它们更加干燥。我喜欢将控制器的索引功能作为公共入口/出口点,以避免重复所有控制器方法通用的操作。