關於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行代碼處理下就可以簡化了,是不是很簡單,呵呵,希望能給初學的朋友有所幫助!