hai*_*ets 6 php model-view-controller templates codeigniter dry
在我的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);
Run Code Online (Sandbox Code Playgroud)
我使用的是三列布局,上面的代码指示了每个列中显示的内容.它以非常模块化的方式工作,允许我快速自定义每个页面.
有没有办法简化上面的代码,使用数组可能,减少重复代码,使事情更干?
您需要创建扩展CI_Controller的基本控制器.然后,所有控制器都会扩展您创建的某个基本控制器,具体取决于在调用控制器的所有情况下需要执行的操作.
在application/core创建一个名为的文件中MY_controller.php(可以在config中更改前缀):
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,所有子控制器都自动拥有小部件,因为它们扩展了public,admin或member.扩展管理控制器的子控制器会自动检查权限,因此您无需再次执行此操作.您可以将此概念应用于您的应用.
一个子控制器:(置于正常状态application/controllers)
class Articles extends Member_controller {
...
}
Run Code Online (Sandbox Code Playgroud)
将自动确保用户已登录,并且无需执行任何操作即可准备小部件,因为父类的父级已准备好它们.您需要在文章中做的就是$this->layout->render在逻辑需要最后的布局渲染时调用.
Codeigniter 控制器是按照事务脚本模式设计的,众所周知,当应用程序增长时,控制器往往会变大并且“不干”。
为了防止这种情况,您可以重新实现视图来处理支持布局的两步复合视图模式。寻找布局视图 IIRC 在 codeigniter 网站上有一些。