一直在研究怎样才能多主题,但是由于编译顺序的问题,很难做到只在config.php中设置就达到多主题,最后只能用折中的方法,在每个模块的最开始执行一个函数来更改主题,但是采用本方法只需在各自模块中设置DEFAULT_THEME就可以了,而且在需要更换主题的地方执行一次该函数即可更换。缺点是每个模块必须做一个公共的Controller,以达到模块里的每个Controller在执行前都会执行这个更改主题的函数。
主体代码如下,附件中有对应的例子,可以下载试试。
1:Common/Conf/config.php
<?php
return array(
//'配置项'=>'配置值'
// 设置默认的模板主题
'DEFAULT_THEME' => 'Base',//当模块中没有设置主题,则模块主题会设置为此处设置的主题,主题名和模块名不能重复,如不能采用“Home”
/* 模板相关配置 */
//此处只做模板使用,具体替换在COMMON模块中的set_theme函数,该函数替换MODULE_NAME,DEFAULT_THEME两个值为设置值
'TMPL_PARSE_STRING' => array(
'__STATIC__' => __ROOT__ . '/Public/static',
'__IMG__' => __ROOT__ . '/Public/MODULE_NAME/DEFAULT_THEME/images',
'__CSS__' => __ROOT__ . '/Public/MODULE_NAME/DEFAULT_THEME/css',
'__JS__' => __ROOT__ . '/Public/MODULE_NAME/DEFAULT_THEME/js',
'__Theme__' => __ROOT__ . '/Public/MODULE_NAME/DEFAULT_THEME',
),
);
2:Common/Common/function.php
<?php
/**
* 系统公共库文件
* 主要定义系统公共函数库
*/
/**
* 设置主题
*/
function set_theme($theme=''){
//判断是否存在设置的模板主题
if(empty($theme)){
$theme_name=C('DEFAULT_THEME');
}else{
if(is_dir (MODULE_PATH.'View/'.$theme )){
$theme_name=$theme;
}else{
$theme_name=C('DEFAULT_THEME');
}
}
//替换COMMON模块中设置的模板值
if(C('Current_Theme')){
C('TMPL_PARSE_STRING',str_replace (C('Current_Theme') , $theme_name , C('TMPL_PARSE_STRING') ));
}else{
C('TMPL_PARSE_STRING',str_replace ( "MODULE_NAME" , MODULE_NAME , C('TMPL_PARSE_STRING') ));
C('TMPL_PARSE_STRING',str_replace ( "DEFAULT_THEME" , $theme_name , C('TMPL_PARSE_STRING') ));
}
C('Current_Theme',$theme_name);
C('DEFAULT_THEME', $theme_name);
}
3:Home/Conf/config.php
<?php
return array(
//'配置项'=>'配置值'
// 设置默认的模板主题
'DEFAULT_THEME' => 'Hometheme',//当模块中没有设置主题,则模块主题会设置为此处设置的主题,主题名和模块名不能重复,如不能采用“Home”
);
4:Home/Conf/HomeController.class.php 这个主要是运行Common/Common/function.php里的set_theme函数,保证正确替换主题路径。不同应用就看你自己怎么设,反正在模板输出前执行这个函数就可以了。
namespace Home\Controller;
use Think\Controller;
/**
* 前台公共控制器
* 为防止多分组Controller名称冲突,公共Controller名称统一使用分组名称
*/
class HomeController extends Controller {
/* 空操作,用于输出404页面 */
public function _empty(){
$this->redirect('Index/index');
}
protected function _initialize(){
// 设置主题
set_theme();
}
}
5:Home/Conf/IndexController.class.php 这里只需要$this->display();就可以了,其他代码是为了测试用的
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends HomeController {
public function index($theme=''){
echo $theme;
if(IS_POST){
set_theme($theme);
}
$this->display();
}
}
通过以上设置,你就可以按不同的主题设置模板文件,而更换主题只需执行set_name("主题名")就可以了。 注意一点是采用此方法,不能用模块名作为你的主题名,否则会替换错误,如“Home”不能作为主题名。
主题的文件在各模块的VIEW/主题名/模板文件 加载的CSS等在根目录下的Public/对应模块名/主题名/相关样式文件
具体代码请下载例子,自己看一下。