Module.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: NODELOG
  5. * DateTime: 2017/7/10 13:46
  6. * Description:
  7. */
  8. namespace common\modules\theme;
  9. use Detection\MobileDetect;
  10. use Yii;
  11. use yii\base\BootstrapInterface;
  12. class Module extends \common\modules\Module implements BootstrapInterface
  13. {
  14. public function bootstrap($app)
  15. {
  16. if ($app->id == 'frontend') {
  17. $themeName = $this->resolveTheme();
  18. $this->setTheme($themeName);
  19. }
  20. }
  21. public $themeParam = 'theme';
  22. public $themeCookieName = 'localThemeName';
  23. public function resolveTheme()
  24. {
  25. //先看参数
  26. if (!$themeName = Yii::$app->request->get($this->themeParam)) {
  27. //再检查cookie
  28. if (Yii::$app->request->cookies->has($this->themeCookieName)) {
  29. $themeName = Yii::$app->request->cookies->get($this->themeCookieName);
  30. } else {
  31. //最后读系统默认
  32. $isMobile = (new MobileDetect())->isMobile();
  33. if ($isMobile) {
  34. $themeName = \Yii::$app->config->get('mobile_theme_name', 'basic');
  35. } else {
  36. $themeName = \Yii::$app->config->get('theme_name', 'basic');
  37. }
  38. }
  39. }
  40. return $themeName;
  41. }
  42. public function setTheme($themeName)
  43. {
  44. $theme = [
  45. 'class' => 'yii\base\Theme',
  46. 'basePath' => '@frontend/themes/' . $themeName,
  47. 'baseUrl' => '@web/themes/' . $themeName,
  48. 'pathMap' => [
  49. '@frontend/views' => [
  50. '@frontend/themes/' . $themeName,
  51. '@frontend/themes/basic',
  52. ],
  53. '@frontend/widgets' => [
  54. '@frontend/themes/' . $themeName . '/widgets',
  55. '@frontend/themes/basic/widgets'
  56. ],
  57. '@common/modules' => [
  58. '@frontend/themes/' . $themeName . '/modules',
  59. '@frontend/themes/basic/modules',
  60. ],
  61. ],
  62. ];
  63. \Yii::$app->view->theme = \Yii::createObject($theme);
  64. // p(\Yii::$app->view->theme);
  65. if (class_exists('frontend\\themes\\' . $themeName . '\\Theme')) {
  66. $themeClass = Yii::createObject('frontend\\themes\\' . $themeName . '\\Theme');
  67. if (method_exists($themeClass, 'bootstrap')) {
  68. $themeClass->bootstrap();
  69. }
  70. }
  71. }
  72. }