一直在研究怎样才能多主题,但是由于编译顺序的问题,很难做到只在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/对应模块名/主题名/相关样式文件

具体代码请下载例子,自己看一下。

http://www.thinkphp.cn/topic/download/id/12208.html