加载中...

YII框架分析笔记12:主题管理


YII主题的控制由CThemeManager和CTheme管理,CThemeManager在应用初始化时作为核心组件注册,主题默认路径是app/themes/。


主题配置
由于主题组件在应用初始化时注册,其配置以及很方面,比如在app/themes/下有一个custom1主题
在主配置文件中加入'theme'=>'custom1'键值对,在主题注册的时候会调用 CWebApplication::setTheme($value)初始化主题的名字。


获取主题
主题的获取从控制器渲染视图说起,通过视action方法传递的视图名称获取视图文件的路径

  1. CController::getViewFile()
  2. public function getViewFile($viewName)
  3. {
  4. if(($theme=Yii::app()->getTheme())!==null && ($viewFile=$theme->getViewFile($this,$viewName))!==false)
  5. return $viewFile;
  6. $moduleViewPath=$basePath=Yii::app()->getViewPath();
  7. if(($module=$this->getModule())!==null)
  8. $moduleViewPath=$module->getViewPath();
  9. return $this->resolveViewFile($viewName,$this->getViewPath(),$basePath,$moduleViewPath);
  10. }
  1. CTheme::etViewFile()
  2. /**
  3. * Finds the view file for the specified controller's view.
  4. * @param CController $controller the controller
  5. * @param string $viewName the view name
  6. * @return string the view file path. False if the file does not exist.
  7. */
  8. public function getViewFile($controller,$viewName)
  9. {
  10. $moduleViewPath=$this->getViewPath(); //获取视图目录路径,默认是app/themes/custom1/view
  11. if(($module=$controller->getModule())!==null)
  12. $moduleViewPath.='/'.$module->getId(); //如果存在module,目录路径app/themes/custom1/view/moduleId
  13. return $controller->resolveViewFile($viewName,$this->getViewPath().'/'.$controller->getUniqueId(),$this->getViewPath(),$moduleViewPath);
  14. }
回到CController获取具体视图文件路径,视图名称有三种特殊命名
1、以//开头是相对于应用级别的视图路径
2、以/开头是相对于module基本的视图路径
3、以xx.xx是别名视图
  1. public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null)
  2. {
  3. if(empty($viewName))
  4. return false;
  5.  
  6. if($moduleViewPath===null)
  7. $moduleViewPath=$basePath;
  8.  
  9. if(($renderer=Yii::app()->getViewRenderer())!==null)
  10. $extension=$renderer->fileExtension;
  11. else
  12. $extension='.php';
  13. if($viewName[0]==='/')
  14. {
  15. if(strncmp($viewName,'//',2)===0)
  16. $viewFile=$basePath.$viewName;
  17. else
  18. $viewFile=$moduleViewPath.$viewName;
  19. }
  20. else if(strpos($viewName,'.'))
  21. $viewFile=Yii::getPathOfAlias($viewName);
  22. else
  23. $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName;
  24.  
  25. if(is_file($viewFile.$extension))
  26. return Yii::app()->findLocalizedFile($viewFile.$extension);
  27. else if($extension!=='.php' && is_file($viewFile.'.php'))
  28. return Yii::app()->findLocalizedFile($viewFile.'.php');
  29. else
  30. return false;
  31. }
在视图文件中,在对该主题在的样式js和图片的引用的需要用到Yii::app()- >theme->baseUrl来作为baseUrl。



还没有评论.