我正在构建一个将为自定义微型网站提供服务的codeigniter应用程序。基本上每个微型网站都将是七个不同视图的集合,所有这些视图都由单个控制器的方法加载。为了“主题”每个微型网站,将有不同的文件夹包含这些视图文件的不同版本(及其相关的css,js和图像文件),控制器将根据存储在数据库中的每个微型网站的信息知道要加载的视图文件夹记录。
这种方法的问题在于,单个微型网站需要具有与所有其他微型网站不同的自定义页面。由于它们都由一个控制器控制,我们遇到了所有微型网站都需要支持此页面的限制。
进一步解释我所指的想象这些网址:
http://www.fakewebsite.com/index.php/microsite/index/david_site
http://www.fakewebsite.com/index.php/microsite/index/frank_site
在这两个链接中,控制器都是“微型网站”,方法是“索引” 'index'根据它的第一个参数知道要返回的模板,在上面的例子中是'david_site'或'frank_site'。
答案 0 :(得分:1)
您是否可以为该控制器设置默认的“主题”,以适应大多数微型网站,然后如果您需要在顶部创建自定义主题,您可以更改它吗?
所以喜欢这个
http://www.fakewebsite.com/microsite/david_site/
< - 默认主题
http://www.fakewebsite.com/microsite/frank_site/
< - 默认主题
http://www.fakewebsite.com/microsite/john_site/customtheme/
< - 自定义主题
答案 1 :(得分:1)
我不能说Codeigniter是否可以这样做,但我假设:
那么现在你的问题是什么?您在控制器中有太多代码?将代码从控制器移动到模型中。然后代码更可重复使用,你可以在每个微型网站上安装小型控制器,并使用共享的胖模型。
到目前为止听起来并不是很好,对吗?每个站点仍然有一个控制器。好吧,让每个微型网站的控制器从基础控制器扩展。所以所有代码仍然在一个地方,但对于某些控制器方法,他们可以在每个站点的基础上扩展该基本控制器。
因此,如果我理解你的问题,那么前端控制器将为每个站点提供正确的控制器类 - 如果我理解你的问题。
答案 2 :(得分:1)
据我所知,你问的是如何只为特定的“微型网站”加载一个不同的视图文件,但是你们所有人都使用相同的控制器和代码库。
在你的views目录中,有1个目录用于默认主题,然后为每个“microsite”你想做一些自定义的东西,创建另一个包含唯一文件的目录,然后在加载文件时 - 检查是否唯一先存在。
假设默认文件位于views/
// I assume we know which site we're loading
$theme = 'david_site';
// Whatever the current view's name should be
$view = 'page3';
// Path to our custom file if it exists
$custom = APPPATH.'views/'.$theme.'/'.$view;
// Does a custom view exist?
if (file_exists($custom))
{
$view_file = $theme.'/'.$view;
}
else
{
// Use the default
$view_file = $view;
}
$this->load->view($view_file);
据我所知,CI中没有view_file_exists()
,所以我们只使用普通的file_exists()
完整路径。
当然值得为此写一个函数,但希望这会有所帮助。您甚至可以将其应用于加载库,模型等 - 甚至可以扩展Loader类以自动执行(可能是过度杀伤)。
CI2已经在ENVIRONMENT
常量中拥有此功能的一个版本,虽然这种用法不是它的意图 - 但这基本上就是它的作用。