關於TP框架設置模板和主題的淺析


關於TP框架設置模板和主題的思考

這是onethink下部署情況

1 /* 主題設置 */
2 'DEFAULT_THEME' =>  'theme',  // 默認模板主題名稱
3 /* 模板目錄設置 */
4 'view_path'     => 'Public/theme/',
這里是設置主題,和默認模板目錄,當然這是基於thinkphp3.2版本下的配置文件處理方式,其中模板目錄默認只能部署在public目錄下
這個可能是和入口文件有關系的,目前我還不是那么明白,待研究……

分析后,發現定位模板與主題的路徑規則,是否設置view_path為條件,如果設置,就是修改默認路徑了,view+theme+controller+functionname.html模式
這就是定位新的模板地址,遷移模板部署在public下代碼,
其中:注意下面方法中21行到24行代碼,就是引入模板路徑的關鍵代碼……
 1 /**
 2  * 自動定位模板文件
 3  * @access protected
 4  * @param string $template 模板文件規則
 5  * @return string
 6  */
 7 public function parseTemplate($template='') {
 8     if(is_file($template)) {
 9         return $template;
10     }
11     $depr   =   C('TMPL_FILE_DEPR');
12     $template = str_replace(':', $depr, $template);
13     // 獲取當前主題名稱
14     $theme = $this->getTemplateTheme();
15 
16     // 獲取當前模塊
17     $module   =  MODULE_NAME;
18     if(strpos($template,'@')){ // 跨模塊調用模版文件
19         list($module,$template)  =   explode('@',$template);
20     }
21     // 獲取當前主題的模版路徑
22     if(!defined('THEME_PATH')){
23         if(C('VIEW_PATH')){ // 視圖目錄
24             define('THEME_PATH',   C('VIEW_PATH').$module.'/'.$theme);
25         }else{ // 模塊視圖
26             define('THEME_PATH',   APP_PATH.$module.'/'.C('DEFAULT_V_LAYER').'/'.$theme);
27         }
28     }
29 
30     // 分析模板文件規則
31     if('' == $template) {
32         // 如果模板文件名為空 按照默認規則定位
33         $template = CONTROLLER_NAME . $depr . ACTION_NAME;
34     }elseif(false === strpos($template, $depr)){
35         $template = CONTROLLER_NAME . $depr . $template;
36     }
37     $file   =   THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX');
38     if(C('TMPL_LOAD_DEFAULTTHEME') && THEME_NAME != C('DEFAULT_THEME') && !is_file($file)){
39         // 找不到當前主題模板的時候定位默認主題中的模板
40         $file   =   dirname(THEME_PATH).'/'.C('DEFAULT_THEME').'/'.$template.C('TMPL_TEMPLATE_SUFFIX');
41     }
42     return $file;
43 }

 


當然thinkphp5的配置修改了,所以設置要相應的調整,配置文件中設置public目錄下模板路徑theme
1  'template' => [
2  // 模板根路徑
3      'view_path' => ROOT_PATH . 'public' . DS . 'theme' .DS ,
4     'view_base' => ROOT_PATH . 'public' . DS . 'theme' .DS,
5     'view_theme' => 'default',//設置主題,自己添加的
6 ],

注意:這里的ROOT_PATH常量實在入口文件定義的,

1 //定義項目根目錄
2 define('ROOT_PATH', dirname(__DIR__).'/');

 

而在框架目錄下  thinkphp\thinkphp\library\think\view\Think.php中

 1 /**
 2      * 自動定位模板文件
 3      * @access private
 4      * @param string $template 模板文件規則
 5      * @return string
 6      */
 7     private function parseTemplate($template)
 8     {
 9         // 分析模板文件規則
10         $request = Request::instance();
11         // 獲取視圖根目錄
12         if (strpos($template, '@')) {
13             // 跨模塊調用
14             list($module, $template) = explode('@', $template);
15         }
16         if ($this->config['view_base']) {
17             // 基礎視圖目錄
18             $module = isset($module) ? $module : $request->module();
19             $path   = $this->config['view_base'] . ($module ? $module . DS : '');
20         } else {
21             $path = isset($module) ? APP_PATH . $module . DS . 'view' . DS : $this->config['view_path'];
22         }
23 
24         /*springphp 2017-06-08 */
25         if ($this->config['view_theme']) {
26             $path .= $this->config['view_theme'].DS;
27         }
28 
29         $depr = $this->config['view_depr'];
30         if (0 !== strpos($template, '/')) {
31             $template   = str_replace(['/', ':'], $depr, $template);
32             $controller = Loader::parseName($request->controller());
33             if ($controller) {
34                 if ('' == $template) {
35                     // 如果模板文件名為空 按照默認規則定位
36                     $template = str_replace('.', DS, $controller) . $depr . $request->action();
37                 } elseif (false === strpos($template, $depr)) {
38                     $template = str_replace('.', DS, $controller) . $depr . $template;
39                 }
40             }
41         } else {
42             $template = str_replace(['/', ':'], $depr, substr($template, 1));
43         }
44         return $path . ltrim($template, '/') . '.' . ltrim($this->config['view_suffix'], '.');
45     }
注意設置上面24行至27行的代碼,即可調用主題,設置就是這么簡單吧,
當然tp5中模塊化設計更加靈活,所有若是在公共配置文件中修改以上代碼,會出現,多模塊都應用了主題設置,這樣顯然不是我們要的,這個時候,我們可以考慮單獨設置模塊主題,如下面在繼承controller控制器的控制器下加入如下代碼:
1  public function __construct(){
2     $this->theme = config('web_theme')?:(config('template.view_theme')?:'default');
3     config('template.view_theme',$this->theme);
4  }
5 //如果沒有設置view_theme 就是默認的主題default.

初始化就設置了默認主題,在前台控制器設置即可單獨處理前台的主題而不影響后台模板設計……

   說明;這樣可以修改模板路徑,但是tp5去掉了設置主題的功能,很可惜,但是可以自己修改添加主題即可,如上面代碼,就是很簡單的一種實現了……

  注意:初學者都應該知道,tp框架下view視圖的渲染,在框架下view目錄中的Think.php類中加載處理的……

還有個小問題就是使用 view()助手函數時傳遞參數的優化

1 public function index(){
2    $info = model('user')->select();
3    return view([
4             'info'  =>$info,
5    ]);
6 }

這個上面的代碼在tp5里是會報錯的,因為助手函數的參數問題,在tp框架library目錄下helper.php助手函數文件中,默認的格式是有$template

1 function view($template = '',$vars = [], $replace = [], $code = 200)
2 {
3    if (is_array($template)) {
4        $vars = $template;
5        $template = '';
6     }
7     return Response::create($template, 'view', $code)->replace($replace)->assign($vars);
8 }

默認會要求輸入$template參數的,這樣顯得繁瑣,如果加了3行至6行代碼處理下就可以簡化了,是不是很簡單,呵呵,希望能給初學的朋友有所幫助!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM