Feehi.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. /**
  3. * Author: lf
  4. * Blog: https://blog.feehi.com
  5. * Email: job@feehi.com
  6. * Created at: 2017-03-15 21:16
  7. */
  8. namespace common\components;
  9. use Yii;
  10. use common\models\Category;
  11. use feehi\cdn\DummyTarget;
  12. use common\helpers\FileDependencyHelper;
  13. use backend\components\CustomLog;
  14. use yii\base\Component;
  15. use backend\components\AdminLog;
  16. use common\models\Options;
  17. use yii\caching\FileDependency;
  18. use yii\base\Event;
  19. use yii\db\BaseActiveRecord;
  20. class Feehi extends Component
  21. {
  22. public function __set($name, $value)
  23. {
  24. $this->$name = $value;
  25. }
  26. public function __get($name)
  27. {
  28. return isset($this->$name) ? $this->$name : '';
  29. }
  30. public function init()
  31. {
  32. parent::init();
  33. $cache = Yii::$app->getCache();
  34. $key = 'options';
  35. if (($data = $cache->get($key)) === false) {
  36. $data = Options::find()->where(['type' => Options::TYPE_SYSTEM])->orwhere([
  37. 'type' => Options::TYPE_CUSTOM,
  38. 'autoload' => Options::CUSTOM_AUTOLOAD_YES,
  39. ])->asArray()->indexBy("name")->all();
  40. /** @var FileDependencyHelper $cacheDependencyObject */
  41. $cacheDependencyObject = Yii::createObject([
  42. 'class' => FileDependencyHelper::className(),
  43. 'fileName' => Options::CACHE_DEPENDENCY_TYPE_SYSTEM_FILE_NAME,
  44. ]);
  45. $fileName = $cacheDependencyObject->createFileIfNotExists();
  46. $dependency = new FileDependency(['fileName' => $fileName]);
  47. $cache->set($key, $data, 30*60, $dependency);
  48. }
  49. foreach ($data as $v) {
  50. $this->{$v['name']} = $v['value'];
  51. }
  52. }
  53. public static function frontendInit()
  54. {
  55. self::configInit();
  56. if (! Yii::$app->feehi->website_status) {
  57. Yii::$app->catchAll = ['site/offline'];
  58. }
  59. Yii::$app->timeZone = Yii::$app->feehi->website_timezone;
  60. Yii::$app->language = Yii::$app->feehi->website_language;
  61. self::determineLanguage();
  62. if (! isset(Yii::$app->params['site']['url']) || empty(Yii::$app->params['site']['url'])) {
  63. Yii::$app->params['site']['url'] = Yii::$app->request->getHostInfo();
  64. }
  65. if(isset(Yii::$app->session['view'])) Yii::$app->viewPath = Yii::getAlias('@frontend/view') . Yii::$app->session['view'];
  66. $category = new Category();
  67. Yii::configure(Yii::$app->getUrlManager(), [
  68. 'rules' => array_merge(Yii::$app->getUrlManager()->rules, $category->getUrlRules())
  69. ]);
  70. Yii::$app->getUrlManager()->init();
  71. }
  72. public static function backendInit()
  73. {
  74. self::configInit();
  75. self::determineLanguage();
  76. Event::on(BaseActiveRecord::className(), BaseActiveRecord::EVENT_AFTER_INSERT, [
  77. AdminLog::className(),
  78. 'create'
  79. ]);
  80. Event::on(BaseActiveRecord::className(), BaseActiveRecord::EVENT_AFTER_UPDATE, [
  81. AdminLog::className(),
  82. 'update'
  83. ]);
  84. Event::on(BaseActiveRecord::className(), BaseActiveRecord::EVENT_AFTER_DELETE, [
  85. AdminLog::className(),
  86. 'delete'
  87. ]);
  88. Event::on(CustomLog::className(), CustomLog::EVENT_AFTER_CREATE, [
  89. AdminLog::className(),
  90. 'custom'
  91. ]);
  92. Event::on(CustomLog::className(), CustomLog::EVENT_AFTER_DELETE, [
  93. AdminLog::className(),
  94. 'custom'
  95. ]);
  96. Event::on(CustomLog::className(), CustomLog::EVENT_CUSTOM, [
  97. AdminLog::className(),
  98. 'custom'
  99. ]);
  100. Event::on(BaseActiveRecord::className(), BaseActiveRecord::EVENT_AFTER_FIND, function ($event) {
  101. if (isset($event->sender->updated_at) && $event->sender->updated_at == 0) {
  102. $event->sender->updated_at = null;
  103. }
  104. });
  105. }
  106. public static function configInit()
  107. {
  108. self::mergeAdminUserSettingConfig();
  109. self::formatConfig();
  110. }
  111. private static function mergeAdminUserSettingConfig()
  112. {
  113. //merge backend admin user setting config options
  114. if (! empty(Yii::$app->feehi->website_url)) {
  115. Yii::$app->params['site']['url'] = Yii::$app->feehi->website_url;
  116. }
  117. if (! empty(Yii::$app->feehi->smtp_host) && ! empty(Yii::$app->feehi->smtp_username)) {
  118. Yii::configure(Yii::$app->mailer, [
  119. 'useFileTransport' => false,
  120. 'transport' => [
  121. 'class' => 'Swift_SmtpTransport',
  122. 'host' => Yii::$app->feehi->smtp_host, //每种邮箱的host配置不一样
  123. 'username' => Yii::$app->feehi->smtp_username,
  124. 'password' => Yii::$app->feehi->smtp_password,
  125. 'port' => Yii::$app->feehi->smtp_port,
  126. 'encryption' => Yii::$app->feehi->smtp_encryption,
  127. ],
  128. 'messageConfig' => [
  129. 'charset' => 'UTF-8',
  130. 'from' => [Yii::$app->feehi->smtp_username => Yii::$app->feehi->smtp_nickname]
  131. ],
  132. ]);
  133. }
  134. }
  135. public static function formatConfig()
  136. {
  137. //format config options
  138. if (substr(Yii::$app->params['site']['url'], -1, 1) != '/') {
  139. Yii::$app->params['site']['url'] .= '/';
  140. }
  141. $cdn = Yii::$app->get('cdn');
  142. if( $cdn instanceof DummyTarget){
  143. Yii::configure(Yii::$app->cdn, [
  144. 'host' => Yii::$app->params['site']['url']
  145. ]);
  146. }
  147. }
  148. public static function determineLanguage()
  149. {
  150. if (isset(Yii::$app->session['language'])) {//user selected language already
  151. Yii::$app->language = Yii::$app->session['language'];
  152. }else {
  153. $supportLanguages = array_flip(Yii::$app->params['supportLanguages']);
  154. $supportLanguagesWithoutArea = [];
  155. foreach ($supportLanguages as $supportLanguage) {
  156. $arr = explode("-", $supportLanguage);
  157. if (is_array($arr) && count($arr) == 2) {
  158. $supportLanguagesWithoutArea[ $arr[0]] = $supportLanguage;
  159. }
  160. }
  161. $determinedLanguage = false;
  162. $acceptLanguages = Yii::$app->getRequest()->getAcceptableLanguages();
  163. foreach ($acceptLanguages as $k=> $acceptLanguage) {//match like en-US
  164. if (in_array($acceptLanguage, $supportLanguages)) {
  165. Yii::$app->language = $acceptLanguage;
  166. $determinedLanguage = true;
  167. break;
  168. }
  169. if( strpos($acceptLanguage, "-") !== false ) {
  170. $temp = explode("-", $acceptLanguage);
  171. $shortLanguage = $temp[0];
  172. }else{
  173. $shortLanguage = $acceptLanguage;
  174. }
  175. if (isset($supportLanguagesWithoutArea[$shortLanguage])) {//match like en
  176. Yii::$app->language = $supportLanguagesWithoutArea[$shortLanguage];
  177. $determinedLanguage = true;
  178. break;
  179. }
  180. }
  181. if ($determinedLanguage){
  182. return;
  183. }
  184. foreach ($acceptLanguages as $acceptLanguage){
  185. if( isset($supportLanguagesWithoutArea[$acceptLanguage]) ) {//match like en
  186. Yii::$app->language = $supportLanguagesWithoutArea[$acceptLanguage];
  187. break;
  188. }
  189. }
  190. }
  191. }
  192. }