Language.php 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  1. <?php
  2. /**
  3. * 易优CMS
  4. * ============================================================================
  5. * 版权所有 2016-2028 海南赞赞网络科技有限公司,并保留所有权利。
  6. * 网站地址: http://www.eyoucms.com
  7. * ----------------------------------------------------------------------------
  8. * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
  9. * ============================================================================
  10. * Author: 小虎哥 <1105415366@qq.com>
  11. * Date: 2018-06-28
  12. */
  13. namespace app\admin\controller;
  14. use think\Page;
  15. use think\Db;
  16. use app\common\logic\ArctypeLogic;
  17. /**
  18. * 插件的控制器
  19. */
  20. class Language extends Base
  21. {
  22. /**
  23. * 语言库模型
  24. */
  25. public $langModel;
  26. /**
  27. * 国家语言模型
  28. */
  29. public $langMarkModel;
  30. /**
  31. * 语言包模型
  32. */
  33. public $langPackModel;
  34. /**
  35. * 语言模板变量模型
  36. */
  37. public $langAttributeModel;
  38. /**
  39. * 语言模板变量关联绑定的数据模型
  40. */
  41. public $langAttrModel;
  42. /**
  43. * 构造方法
  44. */
  45. public function __construct(){
  46. parent::__construct();
  47. $this->langModel = model('Language');
  48. $this->langMarkModel = model('LanguageMark');
  49. $this->langAttributeModel = model('LanguageAttribute');
  50. $this->langAttrModel = model('LanguageAttr');
  51. $this->langPackModel = model('LanguagePack');
  52. }
  53. /**
  54. * 多语言 - 列表
  55. */
  56. public function index()
  57. {
  58. function_exists('set_time_limit') && set_time_limit(0); //防止备份数据过程超时
  59. /*修复多语言之前的坑,删除索引,兼容多语言的重名变量*/
  60. Db::execute('ALTER TABLE `ey_config` DROP INDEX `name`');
  61. /*--end*/
  62. /*同步数据到模板变量*/
  63. $this->syn_langattr();
  64. /*--end*/
  65. $list = array();
  66. $keywords = input('keywords/s');
  67. $map = array();
  68. if (!empty($keywords)) {
  69. $map['cn_title'] = array('LIKE', "%{$keywords}%");
  70. }
  71. $language_db = Db::name('language');
  72. $count = $language_db->where($map)->count('id');// 查询满足要求的总记录数
  73. $pageObj = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
  74. $list = $language_db->where($map)
  75. ->order('id asc')
  76. ->limit($pageObj->firstRow.','.$pageObj->listRows)
  77. ->select();
  78. if (!empty($list)) {
  79. $marks = get_arr_column($list, 'mark');
  80. $languagemarkList = Db::name('language_mark')->field('mark,cn_title')
  81. ->where([
  82. 'mark' => ['IN', $marks]
  83. ])->getAllWithIndex('mark');
  84. $this->assign('languagemarkList', $languagemarkList);
  85. }
  86. $pageStr = $pageObj->show(); // 分页显示输出
  87. $this->assign('list', $list); // 赋值数据集
  88. $this->assign('pageStr', $pageStr); // 赋值分页输出
  89. $this->assign('pageObj', $pageObj); // 赋值分页对象
  90. return $this->fetch();
  91. }
  92. /**
  93. * 多语言 - 新增
  94. */
  95. public function add()
  96. {
  97. //防止php超时
  98. function_exists('set_time_limit') && set_time_limit(0);
  99. $this->language_access(); // 多语言功能操作权限
  100. if (IS_POST) {
  101. $post = input('post.');
  102. $mark = trim($post['mark']);
  103. $is_home_default = intval($post['is_home_default']);
  104. $count = $this->langModel->where('mark',$mark)->count();
  105. if (!empty($count)) {
  106. $this->error('该语言已存在,请检查');
  107. }
  108. if (!empty($post['url']) && !is_http_url($post['url'])) {
  109. $post['url'] = 'http://'.$post['url'];
  110. }
  111. /*组装存储数据*/
  112. $nowData = array(
  113. 'is_home_default' => $is_home_default,
  114. 'add_time' => getTime(),
  115. 'update_time' => getTime(),
  116. );
  117. $saveData = array_merge($post, $nowData);
  118. /*--end*/
  119. $this->langModel->save($saveData);
  120. $insertId = $this->langModel->id;
  121. if (false !== $insertId) {
  122. $syn_status = $this->langModel->afterAdd($insertId, $post);
  123. if (false !== $syn_status) {
  124. adminLog('新增多语言:'.$post['title']); // 写入操作日志
  125. $this->success("新增成功,正在同步官方语言包数据……", url('Language/add_lang_syn_pack', ['mark'=>$mark, 'c_lang'=>$post['copy_lang']]), '', 2);
  126. } else {
  127. $id_arr = [$insertId];
  128. $lang_list = [$mark];
  129. $this->langModel->where("id",'IN',$id_arr)->delete();
  130. $this->langModel->afterDel($id_arr, $lang_list);
  131. $this->error("同步数据失败,请重新操作");
  132. }
  133. }else{
  134. $this->error("操作失败");
  135. }
  136. exit;
  137. }
  138. $assign_data = [];
  139. $assign_data['languagemark'] = $this->langMarkModel
  140. ->field('title,mark,cn_title')
  141. ->order('sort_order asc, pinyin asc')
  142. ->select(); // 多国语言列表
  143. $assign_data['main_lang'] = get_main_lang(); // 主体语言(第一个存在的语言)
  144. $this->assign($assign_data);
  145. return $this->fetch();
  146. }
  147. /**
  148. * 多语言 - 编辑
  149. */
  150. public function edit()
  151. {
  152. if (IS_POST) {
  153. $post = input('post.');
  154. $post['id'] = eyIntval($post['id']);
  155. if(!empty($post['id'])){
  156. $is_home_default = intval($post['is_home_default']);
  157. $mark = trim($post['mark']);
  158. $count = $this->langModel->where([
  159. 'mark'=>$mark,
  160. 'id'=>['NEQ', $post['id']]
  161. ])->count();
  162. if (!empty($count)) {
  163. $this->error('该语言已存在,请检查');
  164. }
  165. /*组装存储数据*/
  166. $nowData = array(
  167. 'is_home_default' => $is_home_default,
  168. 'update_time' => getTime(),
  169. );
  170. $saveData = array_merge($post, $nowData);
  171. /*--end*/
  172. $r = $this->langModel->save($saveData, ['id'=>$post['id']]);
  173. if ($r) {
  174. /*默认语言的设置*/
  175. if (1 == $is_home_default) { // 设置默认语言,只允许有一个是默认,其他取消
  176. $this->langModel->where('id','NEQ',$post['id'])->update([
  177. 'is_home_default' => 0,
  178. 'update_time' => getTime(),
  179. ]);
  180. /*多语言 设置默认前台语言*/
  181. if (is_language()) {
  182. $langRow = \think\Db::name('language')->order('id asc')
  183. ->cache(true, EYOUCMS_CACHE_TIME, 'language')
  184. ->select();
  185. foreach ($langRow as $key => $val) {
  186. tpCache('system', ['system_home_default_lang'=>$mark], $val['mark']);
  187. }
  188. } else { // 单语言
  189. tpCache('system', ['system_home_default_lang'=>$mark]);
  190. }
  191. /*--end*/
  192. } else { // 默认语言取消之后,自动将第一个语言设置为默认
  193. $count = Db::name('language')->where(['is_home_default'=>1])->count();
  194. if (empty($count)) {
  195. $langInfo = Db::name('language')->field('id,mark')->order('id asc')->limit(1)->find();
  196. $this->langModel->where('id','eq',$langInfo['id'])->update([
  197. 'is_home_default' => 1,
  198. 'update_time' => getTime(),
  199. ]);
  200. /*多语言 设置默认前台语言*/
  201. if (is_language()) {
  202. $langRow = \think\Db::name('language')->order('id asc')
  203. ->cache(true, EYOUCMS_CACHE_TIME, 'language')
  204. ->select();
  205. foreach ($langRow as $key => $val) {
  206. tpCache('system', ['system_home_default_lang'=>$langInfo['mark']], $val['mark']);
  207. }
  208. } else { // 单语言
  209. tpCache('system', ['system_home_default_lang'=>$langInfo['mark']]);
  210. }
  211. /*--end*/
  212. }
  213. }
  214. /*--end*/
  215. /*统计多语言数量*/
  216. model('Language')->setLangNum();
  217. adminLog('编辑多语言:'.$post['title']); // 写入操作日志
  218. $this->success("操作成功!", url('Language/index'));
  219. }
  220. }
  221. $this->error("操作失败!");
  222. }
  223. $id = input('id/d', 0);
  224. $row = $this->langModel->find($id);
  225. $row['cn_title'] = Db::name('language_mark')->where([
  226. 'mark' => $row['mark']
  227. ])->getField('cn_title');
  228. if (empty($row)) {
  229. $this->error('数据不存在,请联系管理员!');
  230. exit;
  231. }
  232. $this->assign('row',$row);
  233. return $this->fetch();
  234. }
  235. /**
  236. * 多语言 - 删除文档
  237. */
  238. public function del()
  239. {
  240. //防止php超时
  241. function_exists('set_time_limit') && set_time_limit(0);
  242. $this->language_access(); // 多语言功能操作权限
  243. $id_arr = input('del_id/a');
  244. $id_arr = eyIntval($id_arr);
  245. if(!empty($id_arr)){
  246. /*不允许删除默认语言*/
  247. $count = $this->langModel->where([
  248. 'id' => ['IN', $id_arr],
  249. 'is_home_default' => 1,
  250. ])->count();
  251. if (!empty($count)) {
  252. $this->error('禁止删除前台默认语言');
  253. }
  254. /*--end*/
  255. $result = Db::name('language')->where("id",'IN',$id_arr)->select();
  256. $title_list = get_arr_column($result, 'title');
  257. $lang_list = get_arr_column($result, 'mark');
  258. $r = $this->langModel->where("id",'IN',$id_arr)->delete();
  259. if($r){
  260. $this->langModel->afterDel($id_arr, $lang_list);
  261. adminLog('删除多语言:'.implode(',', $title_list));
  262. $this->success("删除成功!");
  263. }else{
  264. $this->error("删除失败!");
  265. }
  266. }else{
  267. $this->error("参数有误!");
  268. }
  269. }
  270. /**
  271. * 模板栏目变量 - 列表
  272. */
  273. public function customvar_arctype()
  274. {
  275. /*同步数据到模板变量*/
  276. $this->syn_langattr();
  277. /*--end*/
  278. $list = array();
  279. $keywords = input('keywords/s');
  280. $map = array('attr_group'=>'arctype','is_del'=>0);
  281. if (!empty($keywords)) {
  282. $map['attr_name'] = array('LIKE', "%{$keywords}%");
  283. }
  284. $langAttribute_db = Db::name('language_attribute');
  285. $count = $langAttribute_db->where($map)->count('attr_id');// 查询满足要求的总记录数
  286. $pageObj = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
  287. $list = $langAttribute_db->where($map)->order('attr_id asc')->limit($pageObj->firstRow.','.$pageObj->listRows)->select();
  288. $bindAttrName = []; // 当前页被绑定的所有栏目ID
  289. foreach ($list as $key => $val) {
  290. if ('arctype' == $val['attr_group']) {
  291. array_push($bindAttrName, $val['attr_name']);
  292. }
  293. }
  294. $pageStr = $pageObj->show(); // 分页显示输出
  295. $this->assign('list', $list); // 赋值数据集
  296. $this->assign('pageStr', $pageStr); // 赋值分页输出
  297. $this->assign('pageObj', $pageObj); // 赋值分页对象
  298. $arctypeList = [];
  299. $bindAttrList = [];
  300. if (!empty($bindAttrName)) {
  301. $bindAttrName = array_unique($bindAttrName);
  302. /*获取每个栏目ID关联的栏目列表*/
  303. $bindAttrList =Db::name('language_attr')->field('attr_name,attr_value,lang')
  304. ->where('attr_name','IN',$bindAttrName)
  305. ->select();
  306. $arctypeids = get_arr_column($bindAttrList, 'attr_value');
  307. $bindAttrList = group_same_key($bindAttrList, 'attr_name');
  308. /*--end*/
  309. /*获取指定栏目的信息*/
  310. $arctypeList = Db::name('arctype')->field('id,typename')
  311. ->where('id','IN',$arctypeids)
  312. ->getAllWithIndex('id');
  313. /*--end*/
  314. }
  315. $this->assign('bindAttrList', $bindAttrList);
  316. $this->assign('arctypeList', $arctypeList);
  317. $this->assign('main_lang', $this->main_lang);
  318. $this->assign('admin_lang', $this->admin_lang);
  319. return $this->fetch();
  320. }
  321. /**
  322. * 同步数据到多语言模板变量表
  323. */
  324. private function syn_langattr()
  325. {
  326. $this->syn_langattr_arctype();
  327. $this->syn_langattr_gbookattribute();
  328. $this->syn_langattr_proattribute();
  329. $this->syn_langattr_ad();
  330. $this->syn_langattr_ad_position();
  331. }
  332. /**
  333. * 同步栏目到多语言模板变量表
  334. */
  335. private function syn_langattr_arctype()
  336. {
  337. $attr_group = 'arctype';
  338. $arctype_arr = array(); // 栏目数组
  339. $addData = array(); // 新增数据存储
  340. $updateData = array(); // 更新数据存储
  341. $addAttrData = array(); // 新增模板栏目变量数据存储
  342. $langAttributeRow = $this->langAttributeModel->where('attr_group',$attr_group)->getAllWithIndex('attr_name');
  343. $result = Db::name('arctype')->where('lang',$this->main_lang)->order('id asc')->select();
  344. // 栏目表ey_arctype对比多语言模板变量表ey_language_attribute,检测两边数据是否一致
  345. foreach($result as $k=>$v){
  346. // 对比结果:栏目表有,多语言模板变量表没有
  347. $attr_name = 'tid'.$v['id'];
  348. $arctype_arr[] = $attr_name;
  349. $data = array(
  350. 'attr_title' => $v['typename'],
  351. 'attr_name' => $attr_name,
  352. 'attr_group' => $attr_group,
  353. 'is_del' => isset($v['is_del']) ? $v['is_del'] : 0,
  354. );
  355. if(empty($langAttributeRow[$attr_name])){ // 新增栏目之后进行同步到多语言模板变量
  356. $data['add_time'] = getTime();
  357. $data['update_time'] = getTime();
  358. $addData[] = $data;
  359. $addAttrData[] = [
  360. 'attr_name' => $attr_name,
  361. 'attr_value' => $v['id'],
  362. 'lang' => $this->main_lang,
  363. 'attr_group' => $attr_group,
  364. 'add_time' => getTime(),
  365. 'update_time' => getTime(),
  366. ];
  367. } else { // 更新
  368. if ($langAttributeRow[$attr_name]['attr_title'] != $v['typename']) {
  369. $updateData[] = [
  370. 'attr_id' => $langAttributeRow[$attr_name]['attr_id'],
  371. 'attr_title' => $v['typename'],
  372. 'is_del' => $v['is_del'],
  373. 'update_time' => getTime(),
  374. ];
  375. }
  376. }
  377. }
  378. if (!empty($addData)) {
  379. $this->langAttributeModel->saveAll($addData);
  380. }
  381. if (!empty($addAttrData)) {
  382. $this->langAttrModel->saveAll($addAttrData);
  383. }
  384. if (!empty($updateData)) {
  385. $this->langAttributeModel->saveAll($updateData);
  386. }
  387. //多语言模板变量表有,栏目表没有,清除多余的模板变量
  388. /*foreach($langAttributeRow as $k => $v){
  389. $attr_name = $v['attr_name'];
  390. if (!in_array($attr_name, $arctype_arr)) {
  391. $this->langAttributeModel->where('attr_name',$attr_name)->delete();
  392. $this->langAttrModel->where('attr_name',$v['attr_name'])->delete();
  393. }
  394. }*/
  395. }
  396. /**
  397. * 同步留言属性到多语言模板变量表
  398. */
  399. private function syn_langattr_gbookattribute()
  400. {
  401. $attr_group = 'guestbook_attribute';
  402. $gbookAttr_arr = array(); // 留言属性数组
  403. $addData = array(); // 新增数据存储
  404. $updateData = array(); // 更新数据存储
  405. $addAttrData = array(); // 新增模板留言属性变量数据存储
  406. $langAttributeRow = $this->langAttributeModel->where('attr_group',$attr_group)->getAllWithIndex('attr_name');
  407. $result = Db::name('guestbook_attribute')->where('lang',$this->main_lang)->order('attr_id asc')->select();
  408. // 栏目表ey_arctype对比多语言模板变量表ey_language_attribute,检测两边数据是否一致
  409. foreach($result as $k=>$v){
  410. // 对比结果:栏目表有,多语言模板变量表没有
  411. $attr_name = 'attr_'.$v['attr_id'];
  412. $gbookAttr_arr[] = $attr_name;
  413. $data = array(
  414. 'attr_title' => $v['attr_name'],
  415. 'attr_name' => $attr_name,
  416. 'attr_group' => $attr_group,
  417. 'is_del' => isset($v['is_del']) ? $v['is_del'] : 0,
  418. );
  419. if(empty($langAttributeRow[$attr_name])){ // 新增留言属性之后进行同步到多语言模板变量
  420. $data['add_time'] = getTime();
  421. $data['update_time'] = getTime();
  422. $addData[] = $data;
  423. $addAttrData[] = [
  424. 'attr_name' => $attr_name,
  425. 'attr_value' => $v['attr_id'],
  426. 'lang' => $this->main_lang,
  427. 'attr_group' => $attr_group,
  428. 'add_time' => getTime(),
  429. 'update_time' => getTime(),
  430. ];
  431. } else { // 更新
  432. if ($langAttributeRow[$attr_name]['attr_title'] != $v['attr_name']) {
  433. $updateData[] = [
  434. 'attr_id' => $langAttributeRow[$attr_name]['attr_id'],
  435. 'attr_title' => $v['attr_name'],
  436. 'is_del' => $v['is_del'],
  437. 'update_time' => getTime(),
  438. ];
  439. }
  440. }
  441. }
  442. if (!empty($addData)) {
  443. $this->langAttributeModel->saveAll($addData);
  444. }
  445. if (!empty($addAttrData)) {
  446. $this->langAttrModel->saveAll($addAttrData);
  447. }
  448. if (!empty($updateData)) {
  449. $this->langAttributeModel->saveAll($updateData);
  450. }
  451. }
  452. /**
  453. * 同步产品属性到多语言模板变量表
  454. */
  455. private function syn_langattr_proattribute()
  456. {
  457. $attr_group = 'product_attribute';
  458. $proAttr_arr = array(); // 产品属性数组
  459. $addData = array(); // 新增数据存储
  460. $updateData = array(); // 更新数据存储
  461. $addAttrData = array(); // 新增模板留言属性变量数据存储
  462. $langAttributeRow = $this->langAttributeModel->where('attr_group',$attr_group)->getAllWithIndex('attr_name');
  463. $result = Db::name('product_attribute')->where('lang',$this->main_lang)->order('attr_id asc')->select();
  464. // 栏目表ey_arctype对比多语言模板变量表ey_language_attribute,检测两边数据是否一致
  465. foreach($result as $k=>$v){
  466. // 对比结果:栏目表有,多语言模板变量表没有
  467. $attr_name = 'attr_'.$v['attr_id'];
  468. $proAttr_arr[] = $attr_name;
  469. $data = array(
  470. 'attr_title' => $v['attr_name'],
  471. 'attr_name' => $attr_name,
  472. 'attr_group' => $attr_group,
  473. 'is_del' => isset($v['is_del']) ? $v['is_del'] : 0,
  474. );
  475. if(empty($langAttributeRow[$attr_name])){ // 新增产品属性之后进行同步到多语言模板变量
  476. $data['add_time'] = getTime();
  477. $data['update_time'] = getTime();
  478. $addData[] = $data;
  479. $addAttrData[] = [
  480. 'attr_name' => $attr_name,
  481. 'attr_value' => $v['attr_id'],
  482. 'lang' => $this->main_lang,
  483. 'attr_group' => $attr_group,
  484. 'add_time' => getTime(),
  485. 'update_time' => getTime(),
  486. ];
  487. } else { // 更新
  488. if ($langAttributeRow[$attr_name]['attr_title'] != $v['attr_name']) {
  489. $updateData[] = [
  490. 'attr_id' => $langAttributeRow[$attr_name]['attr_id'],
  491. 'attr_title' => $v['attr_name'],
  492. 'is_del' => $v['is_del'],
  493. 'update_time' => getTime(),
  494. ];
  495. }
  496. }
  497. }
  498. if (!empty($addData)) {
  499. $this->langAttributeModel->saveAll($addData);
  500. }
  501. if (!empty($addAttrData)) {
  502. $this->langAttrModel->saveAll($addAttrData);
  503. }
  504. if (!empty($updateData)) {
  505. $this->langAttributeModel->saveAll($updateData);
  506. }
  507. }
  508. /**
  509. * 同步广告到多语言模板变量表
  510. */
  511. private function syn_langattr_ad()
  512. {
  513. $attr_group = 'ad';
  514. $ad_arr = array(); // 广告数组
  515. $addData = array(); // 新增数据存储
  516. $updateData = array(); // 更新数据存储
  517. $addAttrData = array(); // 新增模板广告变量数据存储
  518. $langAttributeRow = $this->langAttributeModel->where('attr_group',$attr_group)->getAllWithIndex('attr_name');
  519. $result = Db::name('ad')->where('lang',$this->main_lang)->order('id asc')->select();
  520. // 广告表ey_ad对比多语言模板变量表ey_language_attribute,检测两边数据是否一致
  521. foreach($result as $k=>$v){
  522. // 对比结果:广告表有,多语言模板变量表没有
  523. $attr_name = 'ad'.$v['id'];
  524. $ad_arr[] = $attr_name;
  525. $data = array(
  526. 'attr_title' => $v['title'],
  527. 'attr_name' => $attr_name,
  528. 'attr_group' => $attr_group,
  529. 'is_del' => isset($v['is_del']) ? $v['is_del'] : 0,
  530. );
  531. if(empty($langAttributeRow[$attr_name])){ // 新增广告之后进行同步到多语言模板变量
  532. $data['add_time'] = getTime();
  533. $data['update_time'] = getTime();
  534. $addData[] = $data;
  535. $addAttrData[] = [
  536. 'attr_name' => $attr_name,
  537. 'attr_value' => $v['id'],
  538. 'lang' => $this->main_lang,
  539. 'attr_group' => $attr_group,
  540. 'add_time' => getTime(),
  541. 'update_time' => getTime(),
  542. ];
  543. } else { // 更新
  544. if ($langAttributeRow[$attr_name]['attr_title'] != $v['title']) {
  545. $updateData[] = [
  546. 'attr_id' => $langAttributeRow[$attr_name]['attr_id'],
  547. 'attr_title' => $v['title'],
  548. 'is_del' => $v['is_del'],
  549. 'update_time' => getTime(),
  550. ];
  551. }
  552. }
  553. }
  554. if (!empty($addData)) {
  555. $this->langAttributeModel->saveAll($addData);
  556. }
  557. if (!empty($addAttrData)) {
  558. $this->langAttrModel->saveAll($addAttrData);
  559. }
  560. if (!empty($updateData)) {
  561. $this->langAttributeModel->saveAll($updateData);
  562. }
  563. }
  564. /**
  565. * 同步广告到多语言模板变量表
  566. */
  567. private function syn_langattr_ad_position()
  568. {
  569. $attr_group = 'ad_position';
  570. $adposition_arr = array(); // 广告位置数组
  571. $addData = array(); // 新增数据存储
  572. $updateData = array(); // 更新数据存储
  573. $addAttrData = array(); // 新增模板广告变量数据存储
  574. $langAttributeRow = $this->langAttributeModel->where('attr_group',$attr_group)->getAllWithIndex('attr_name');
  575. $result = Db::name('ad_position')->where('lang',$this->main_lang)->order('id asc')->select();
  576. // 广告位置表ey_ad对比多语言模板变量表ey_language_attribute,检测两边数据是否一致
  577. foreach($result as $k=>$v){
  578. // 对比结果:广告位置表有,多语言模板变量表没有
  579. $attr_name = 'adp'.$v['id'];
  580. $adposition_arr[] = $attr_name;
  581. $data = array(
  582. 'attr_title' => $v['title'],
  583. 'attr_name' => $attr_name,
  584. 'attr_group' => $attr_group,
  585. 'is_del' => isset($v['is_del']) ? $v['is_del'] : 0,
  586. );
  587. if(empty($langAttributeRow[$attr_name])){ // 新增广告位置之后进行同步到多语言模板变量
  588. $data['add_time'] = getTime();
  589. $data['update_time'] = getTime();
  590. $addData[] = $data;
  591. $addAttrData[] = [
  592. 'attr_name' => $attr_name,
  593. 'attr_value' => $v['id'],
  594. 'lang' => $this->main_lang,
  595. 'attr_group' => $attr_group,
  596. 'add_time' => getTime(),
  597. 'update_time' => getTime(),
  598. ];
  599. } else { // 更新
  600. if ($langAttributeRow[$attr_name]['attr_title'] != $v['title']) {
  601. $updateData[] = [
  602. 'attr_id' => $langAttributeRow[$attr_name]['attr_id'],
  603. 'attr_title' => $v['title'],
  604. 'is_del' => $v['is_del'],
  605. 'update_time' => getTime(),
  606. ];
  607. }
  608. }
  609. }
  610. if (!empty($addData)) {
  611. $this->langAttributeModel->saveAll($addData);
  612. }
  613. if (!empty($addAttrData)) {
  614. $this->langAttrModel->saveAll($addAttrData);
  615. }
  616. if (!empty($updateData)) {
  617. $this->langAttributeModel->saveAll($updateData);
  618. }
  619. }
  620. /**
  621. * 关联绑定栏目
  622. */
  623. public function customvar_bind()
  624. {
  625. if (IS_POST) {
  626. $attr_id = input('post.attr_id/d', '');
  627. $typeid = input('post.typeid/d', '');
  628. $row = $this->langAttributeModel->where('attr_group','arctype')->find($attr_id);
  629. if (!empty($row)) {
  630. $attr_name = $row['attr_name'];
  631. $row2 = $this->langAttrModel->where([
  632. 'attr_name' => $attr_name,
  633. 'attr_group' => 'arctype',
  634. 'lang' => $this->admin_lang,
  635. ])->find();
  636. if (!empty($row2)) {
  637. $r = $this->langAttrModel->where('id', $row2['id'])
  638. ->update([
  639. 'attr_value' => $typeid,
  640. 'update_time' => getTime(),
  641. ]);
  642. } else {
  643. $r = $this->langAttrModel->add([
  644. 'attr_name' => $attr_name,
  645. 'attr_value' => $typeid,
  646. 'lang' => $this->admin_lang,
  647. 'add_time' => getTime(),
  648. 'update_time' => getTime(),
  649. ]);
  650. }
  651. if (false != $r) {
  652. $this->success('操作成功');
  653. }
  654. }
  655. $this->error('操作失败');
  656. }
  657. $attr_id = input('param.attr_id/d', '');
  658. $this->assign('attr_id',$attr_id);
  659. /*所有栏目列表*/
  660. $arctype_max_level = intval(config('global.arctype_max_level'));
  661. $arctypeLogic = new ArctypeLogic();
  662. $select_html = $arctypeLogic->arctype_list(0, 0, true, $arctype_max_level);
  663. $this->assign('select_html',$select_html);
  664. /*--end*/
  665. return $this->fetch();
  666. }
  667. /**
  668. * 模板语言变量
  669. */
  670. public function pack_index()
  671. {
  672. $list = array();
  673. $param = input('param.');
  674. $keywords = input('keywords/s');
  675. $condition = array();
  676. // 应用搜索条件
  677. foreach (['keywords'] as $key) {
  678. if (isset($param[$key]) && $param[$key] !== '') {
  679. if ($key == 'keywords') {
  680. $condition['a.name|a.value'] = array('LIKE', "%{$param[$key]}%");
  681. } else {
  682. $tmp_key = 'a.'.$key;
  683. $condition[$tmp_key] = array('eq', $param[$key]);
  684. }
  685. }
  686. }
  687. // 多语言
  688. $condition['a.lang'] = $this->admin_lang;
  689. $condition['a.is_syn'] = 0;
  690. $pack_db = Db::name('language_pack');
  691. $count = $pack_db->alias('a')->where($condition)->count();// 查询满足要求的总记录数
  692. $pageObj = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
  693. $list = $pack_db->alias('a')
  694. ->where($condition)
  695. ->order('id desc')
  696. ->limit($pageObj->firstRow.','.$pageObj->listRows)
  697. ->select();
  698. $this->assign('pageStr',$pageObj->show());// 赋值分页输出
  699. $this->assign('list',$list);// 赋值数据集
  700. $this->assign('pageObj',$pageObj);// 赋值分页对象
  701. return $this->fetch();
  702. }
  703. /**
  704. * 模板语言变量 - 新增
  705. */
  706. public function pack_add()
  707. {
  708. if (IS_POST) {
  709. $name = strtolower(input('post.name/s'));
  710. $values = input('post.value/a', '', 'strip_sql');
  711. // 检测变量名
  712. if (preg_match('/^(sys)(\d+)$/i', $name)) {
  713. $this->error('禁止使用sys+数字的变量名,请更换');
  714. }
  715. $count = Db::name('language_pack')->where([
  716. 'name' => $name
  717. ])->count();
  718. if (!empty($count)) {
  719. $this->error('该变量名已存在,请检查');
  720. }
  721. $saveData = [];
  722. $languageRow = Db::name('language')->field('mark')
  723. ->order('sort_order asc,id asc')
  724. ->select();
  725. foreach ($languageRow as $key => $val) {
  726. $saveData[] = [
  727. 'name' => $name,
  728. 'value' => !empty($values[$val['mark']]) ? $values[$val['mark']] : '',
  729. 'lang' => $val['mark'],
  730. 'sort_order' => 100,
  731. 'add_time' => getTime(),
  732. 'update_time' => getTime(),
  733. ];
  734. }
  735. $languagePack_M = model('LanguagePack');
  736. $r = $languagePack_M->saveAll($saveData);
  737. if (false !== $r) {
  738. $this->createLangFile(); // 生成语言包文件
  739. adminLog('新增模板语言变量:'.$name); // 写入操作日志
  740. $this->success("操作成功", url('Language/pack_index'));
  741. }else{
  742. $this->error("操作失败");
  743. }
  744. }
  745. $languageRow = Db::name('language')->field('mark,title')
  746. ->order('sort_order asc,id asc')
  747. ->select();
  748. $this->assign('languageRow', $languageRow);
  749. return $this->fetch();
  750. }
  751. /**
  752. * 模板语言变量 - 批量新增
  753. */
  754. public function pack_batch_add()
  755. {
  756. //防止php超时
  757. function_exists('set_time_limit') && set_time_limit(0);
  758. if (IS_POST) {
  759. $admin_lang = $this->admin_lang;
  760. $main_lang = $this->main_lang;
  761. $content = input('post.content/s', '', 'strip_sql');
  762. $languagePack_M = model('LanguagePack');
  763. $tmp_content = trim(str_replace(PHP_EOL,"",$content)); //去掉回车换行符号
  764. if (empty($tmp_content)) {
  765. $this->error('数据不能为空!');
  766. }
  767. // 语言列表
  768. $languageRow = Db::name('language')->field('mark')
  769. ->order('id asc')
  770. ->select();
  771. $r = false;
  772. $time = getTime();
  773. $data = explode(PHP_EOL, $content);
  774. foreach ($data as $key => $val) {
  775. if (empty($val) || "" === trim($val)) {
  776. continue;
  777. }
  778. $saveData = [];
  779. $values = explode('=', str_replace('=', '=', $val));
  780. $saveData = [
  781. 'value' => !empty($values[0]) ? $values[0] : '',
  782. 'lang' => $main_lang,
  783. 'sort_order' => 100,
  784. 'add_time' => $time,
  785. 'update_time' => getTime(),
  786. ];
  787. $r = $languagePack_M->insertGetId($saveData);
  788. $insertId = $r;
  789. if (false != $insertId) {
  790. $name = 'lang'.$insertId;
  791. $r = $languagePack_M->update([
  792. // 'name' => Db::raw("CONCAT('lang',id)"),
  793. 'name' => $name,
  794. ], ['id' => $insertId]);
  795. if (false != $r) {
  796. $saveDataAll = [];
  797. foreach ($languageRow as $k2 => $v2) {
  798. if (0 < intval($k2)) {
  799. $saveDataAll[] = [
  800. 'name' => $name,
  801. 'value' => !empty($values[$k2]) ? $values[$k2] : '',
  802. 'lang' => $v2['mark'],
  803. 'sort_order' => 100,
  804. 'add_time' => $time,
  805. 'update_time' => getTime(),
  806. ];
  807. }
  808. }
  809. !empty($saveDataAll) && $languagePack_M->saveAll($saveDataAll);
  810. }
  811. }
  812. }
  813. if (false !== $r) {
  814. $this->createLangFile(); // 生成语言包文件
  815. adminLog('新增模板语言变量:'.str_replace(PHP_EOL, '|', $content)); // 写入操作日志
  816. $this->success("操作成功", url('Language/pack_index'));
  817. }else{
  818. model('LanguagePack')->where(['add_time'=>$time])->delete();
  819. $this->error("操作失败");
  820. }
  821. }
  822. $languageRow = Db::name('language')->field('mark,title')
  823. ->order('id asc')
  824. ->select();
  825. $languageStr = implode('=', get_arr_column($languageRow, 'title')).PHP_EOL;
  826. $this->assign('languageStr', $languageStr);
  827. return $this->fetch();
  828. }
  829. /**
  830. * 模板语言变量 - 批量新增
  831. */
  832. // public function pack_batch_add()
  833. // {
  834. // if (IS_POST) {
  835. // $admin_lang = $this->admin_lang;
  836. // $content = input('post.content/s', '', 'strip_sql');
  837. // $tmp_content = trim(str_replace(PHP_EOL,"",$content)); //去掉回车换行符号
  838. // if (empty($tmp_content)) {
  839. // $this->error('数据不能为空!');
  840. // }
  841. // $time = getTime();
  842. // $saveData = [];
  843. // $data = explode(PHP_EOL, $content);
  844. // foreach ($data as $key => $val) {
  845. // if (empty($val) || "" === trim($val)) {
  846. // continue;
  847. // }
  848. // $saveData[] = [
  849. // 'value' => $val,
  850. // 'lang' => $admin_lang,
  851. // 'sort_order' => 100,
  852. // 'add_time' => $time,
  853. // 'update_time' => getTime(),
  854. // ];
  855. // }
  856. // $r = false;
  857. // $languagePack_M = model('LanguagePack');
  858. // if (!empty($saveData)) {
  859. // $r = $languagePack_M->saveAll($saveData);
  860. // if (false != $r) {
  861. // $r = $languagePack_M->update([
  862. // 'name' => Db::raw("CONCAT('language',id)"),
  863. // ], ['add_time' => $time]);
  864. // }
  865. // }
  866. // if (false !== $r) {
  867. // /*同步到其他多语言*/
  868. // $languageRow = Db::name('language')->field('mark')
  869. // ->where('mark','NEQ',$admin_lang)
  870. // ->order('sort_order asc,id asc')
  871. // ->select();
  872. // if (!empty($languageRow)) {
  873. // $synData = Db::name('language_pack')->field('id,lang', true)
  874. // ->where([
  875. // 'add_time' => $time,
  876. // 'lang' => $admin_lang,
  877. // ])->select();
  878. // $synSaveData = [];
  879. // foreach ($languageRow as $k1 => $v1) {
  880. // foreach ($synData as $k2 => $v2) {
  881. // $v2['lang'] = $v1['mark'];
  882. // $synSaveData[] = $v2;
  883. // }
  884. // }
  885. // $languagePack_M->saveAll($synSaveData);
  886. // }
  887. // /*--end*/
  888. // $this->createLangFile(); // 生成语言包文件
  889. // adminLog('新增模板语言变量:'.str_replace(PHP_EOL, '|', $content)); // 写入操作日志
  890. // $this->success("操作成功", url('Language/pack_index'));
  891. // }else{
  892. // model('LanguagePack')->where(['add_time'=>$time])->delete();
  893. // $this->error("操作失败");
  894. // }
  895. // }
  896. // return $this->fetch();
  897. // }
  898. /**
  899. * 模板语言变量 - 编辑
  900. */
  901. public function pack_edit()
  902. {
  903. $admin_lang = $this->admin_lang;
  904. $official = input('official');
  905. if (IS_POST) {
  906. $id = input('post.id/d');
  907. $name = strtolower(input('post.name/s'));
  908. $values = input('post.value/a', '', 'strip_sql');
  909. $languagepack_db = Db::name('language_pack');
  910. // 旧的变量名
  911. $old_name = $languagepack_db->where([
  912. 'id' => $id,
  913. 'lang' => $admin_lang,
  914. ])->getField('name');
  915. // 检测变量名
  916. if ($old_name != $name && preg_match('/^(sys)(\d+)$/i', $name)) {
  917. $this->error('禁止使用sys+数字的变量名,请更换');
  918. }
  919. $count = $languagepack_db->where([
  920. 'name' => $name,
  921. 'id' => ['NEQ', $id],
  922. 'lang' => $admin_lang,
  923. ])->count();
  924. if (!empty($count)) {
  925. $this->error('该变量名已存在,请检查');
  926. }
  927. // 所有语言对应此变量的id
  928. $idRow = $languagepack_db->field('id,lang')
  929. ->where(['name'=>$old_name])
  930. ->getAllWithIndex('lang');
  931. // 更新变量值
  932. $updateData = [];
  933. foreach ($values as $key => $val) {
  934. $updateData[] = [
  935. 'id' => $idRow[$key]['id'],
  936. 'name' => $name,
  937. 'lang' => $key,
  938. 'value' => $val,
  939. 'update_time' => getTime(),
  940. ];
  941. }
  942. $r = model('LanguagePack')->saveAll($updateData);
  943. if (false !== $r) {
  944. $this->createLangFile(); // 生成语言包文件
  945. adminLog('编辑模板语言变量:'.$name); // 写入操作日志
  946. if (1 == $official) {
  947. $gourl = url('Language/official_pack_index');
  948. } else {
  949. $gourl = url('Language/pack_index');
  950. }
  951. $this->success("操作成功", $gourl);
  952. }else{
  953. $this->error("操作失败");
  954. }
  955. }
  956. $id = input('id/d');
  957. $row = Db::name('language_pack')->where([
  958. 'id' => $id,
  959. 'lang' => $admin_lang,
  960. ])->find();
  961. if (empty($row)) {
  962. $this->error('数据不存在,请联系管理员!');
  963. exit;
  964. }
  965. $this->assign('row',$row);
  966. // 语言列表
  967. $languageRow = Db::name('language')->field('mark,title')
  968. ->order('sort_order asc,id asc')
  969. ->select();
  970. $this->assign('languageRow', $languageRow);
  971. // 变量值列表
  972. $values = Db::name('language_pack')->field('lang,value')->where([
  973. 'name' => $row['name'],
  974. ])->getAllWithIndex('lang');
  975. $this->assign('values', $values);
  976. $this->assign('official', $official);
  977. return $this->fetch();
  978. }
  979. /**
  980. * 模板语言变量 - 删除
  981. */
  982. public function pack_del()
  983. {
  984. if (IS_POST) {
  985. $id_arr = input('del_id/a');
  986. $id_arr = eyIntval($id_arr);
  987. if(!empty($id_arr)){
  988. $languagepack_db = Db::name('language_pack');
  989. $count = $languagepack_db->where([
  990. 'id' => ['IN', $id_arr],
  991. 'lang' => $this->admin_lang,
  992. 'is_syn'=> 1,
  993. ])->count();
  994. if (!empty($count)) {
  995. $this->error('官方同步语言包,禁止删除');
  996. }
  997. $names = $languagepack_db->where([
  998. 'id' => ['IN', $id_arr],
  999. 'lang' => $this->admin_lang,
  1000. ])->column('name');
  1001. $r = $languagepack_db->where([
  1002. 'name' => ['IN', $names],
  1003. ])->delete();
  1004. if($r){
  1005. $this->createLangFile(); // 生成语言包文件
  1006. adminLog('删除模板语言变量:'.implode(',', $names));
  1007. $this->success('删除成功');
  1008. }else{
  1009. $this->error('删除失败');
  1010. }
  1011. } else {
  1012. $this->error('参数有误');
  1013. }
  1014. }
  1015. $this->error('非法访问');
  1016. }
  1017. /**
  1018. * 官方语言包变量
  1019. */
  1020. public function official_pack_index()
  1021. {
  1022. $list = array();
  1023. $param = input('param.');
  1024. $keywords = input('keywords/s');
  1025. $condition = array();
  1026. // 应用搜索条件
  1027. foreach (['keywords'] as $key) {
  1028. if (isset($param[$key]) && $param[$key] !== '') {
  1029. if ($key == 'keywords') {
  1030. $condition['a.name|a.value'] = array('LIKE', "%{$param[$key]}%");
  1031. } else {
  1032. $tmp_key = 'a.'.$key;
  1033. $condition[$tmp_key] = array('eq', $param[$key]);
  1034. }
  1035. }
  1036. }
  1037. // 多语言
  1038. $condition['a.lang'] = $this->admin_lang;
  1039. $condition['a.is_syn'] = 1;
  1040. $pack_db = Db::name('language_pack');
  1041. $count = $pack_db->alias('a')->where($condition)->count();// 查询满足要求的总记录数
  1042. $pageObj = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
  1043. $list = $pack_db->alias('a')
  1044. ->where($condition)
  1045. ->order('id desc')
  1046. ->limit($pageObj->firstRow.','.$pageObj->listRows)
  1047. ->select();
  1048. $this->assign('pageStr',$pageObj->show());// 赋值分页输出
  1049. $this->assign('list',$list);// 赋值数据集
  1050. $this->assign('pageObj',$pageObj);// 赋值分页对象
  1051. return $this->fetch();
  1052. }
  1053. /**
  1054. * 生成语言包文件
  1055. */
  1056. private function createLangFile()
  1057. {
  1058. $result = [];
  1059. $packRow = Db::name('language_pack')->field('name,value,lang')->order('lang asc, id asc')->select();
  1060. foreach ($packRow as $key => $val) {
  1061. $result[$val['lang']][$val['name']] = $val['value'];
  1062. }
  1063. foreach ($result as $key => $val) {
  1064. file_put_contents( APP_PATH."lang/{$key}.php", "<?php\r\n\r\n"."return ".var_export($val,true).";" );
  1065. }
  1066. }
  1067. /**
  1068. * 自动同步官方语言包
  1069. */
  1070. public function official_pack_syn($lang = '')
  1071. {
  1072. $this->pack_syn(true);
  1073. $this->success('同步成功', url('Language/official_pack_index'));
  1074. }
  1075. /**
  1076. * 新增语言,系统自动同步官方语言包
  1077. */
  1078. public function add_lang_syn_pack($mark = '', $c_lang = '')
  1079. {
  1080. if (!empty($mark) && !empty($c_lang)) {
  1081. $service_ey = config('service_ey');
  1082. $query_str = 'L2luZGV4LnBocD9tPWFwaSZjPUxhbmd1YWdlJmE9c3luX3BhY2tfc2luZ2xlJg==';
  1083. $values = array(
  1084. 'lang'=>$mark,
  1085. );
  1086. $url = base64_decode($service_ey).base64_decode($query_str).http_build_query($values);
  1087. $context = stream_context_set_default(array('http' => array('timeout' => 3,'method'=>'GET')));
  1088. $response = @file_get_contents($url,false,$context);
  1089. $params = json_decode($response,true);
  1090. if (is_array($params) && !empty($params)) {
  1091. $saveData = [];
  1092. foreach ($params as $key => $val) {
  1093. $saveData[] = [
  1094. 'name' => $val['name'],
  1095. 'value' => $val['value'],
  1096. 'is_syn' => 1,
  1097. 'lang' => $mark,
  1098. 'sort_order' => 100,
  1099. 'add_time' => getTime(),
  1100. 'update_time' => getTime(),
  1101. ];
  1102. }
  1103. if (!empty($saveData)) {
  1104. $r = $this->langPackModel->saveAll($saveData);
  1105. if ($r) {
  1106. /*同步官方语言包最后一次同步的ID*/
  1107. $language_db = Db::name('language');
  1108. $syn_pack_id = $language_db->where([
  1109. 'mark' => $c_lang,
  1110. ])->getField('syn_pack_id');
  1111. $language_db->where([
  1112. 'mark' => $mark,
  1113. ])->update([
  1114. 'syn_pack_id' => $syn_pack_id,
  1115. 'update_time' => getTime(),
  1116. ]);
  1117. /*--end*/
  1118. $this->createLangFile(); // 生成语言包文件
  1119. $this->success('同步成功', url('Language/index'));
  1120. }
  1121. }
  1122. }
  1123. }
  1124. $this->error("同步失败,稍后系统默认同步");
  1125. }
  1126. /**
  1127. * 同步全部语言的官方语言包
  1128. */
  1129. public function pack_syn($return = false)
  1130. {
  1131. //防止超时
  1132. function_exists('set_time_limit') && set_time_limit(0);
  1133. $syn_pack_id = Db::name('language')->max('syn_pack_id');
  1134. $service_ey = config('service_ey');
  1135. $query_str = 'L2luZGV4LnBocD9tPWFwaSZjPUxhbmd1YWdlJmE9c3luX3BhY2tfbGlzdCY=';
  1136. $values = array(
  1137. 'pack_id'=>$syn_pack_id,
  1138. );
  1139. $url = base64_decode($service_ey).base64_decode($query_str).http_build_query($values);
  1140. $context = stream_context_set_default(array('http' => array('timeout' => 5,'method'=>'GET')));
  1141. $response = @file_get_contents($url,false,$context);
  1142. $params = json_decode($response,true);
  1143. $list = !empty($params['list']) ? $params['list'] : [];
  1144. if (false != $response && empty($list)) {
  1145. $this->success("已是最新语言包");
  1146. }
  1147. if (!empty($list) && is_array($list)) {
  1148. $new_syn_pack_id = $params['max_pack_id'];
  1149. $saveData = [];
  1150. $languageRow = Db::name('language')->field('mark')
  1151. ->order('sort_order asc,id asc')
  1152. ->select();
  1153. foreach ($languageRow as $k1 => $v1) {
  1154. foreach ($list['cn'] as $k2 => $v2) {
  1155. $name = !empty($list[$v1['mark']]) ? $list[$v1['mark']][$k2]['name'] : $v2['name'];
  1156. $value = !empty($list[$v1['mark']]) ? $list[$v1['mark']][$k2]['value'] : $v2['value'];
  1157. $lang = !empty($list[$v1['mark']]) ? $list[$v1['mark']][$k2]['lang'] : $v1['mark'];
  1158. $saveData[] = [
  1159. 'name' => $name,
  1160. 'value' => $value,
  1161. 'is_syn' => 1,
  1162. 'lang' => $lang,
  1163. 'sort_order' => 100,
  1164. 'add_time' => getTime(),
  1165. 'update_time' => getTime(),
  1166. ];
  1167. }
  1168. }
  1169. if (!empty($saveData)) {
  1170. $r = $this->langPackModel->saveAll($saveData);
  1171. if (false !== $r) {
  1172. $this->langModel->where(['id'=>['gt',0]])->update([
  1173. 'syn_pack_id' => $new_syn_pack_id,
  1174. 'update_time' => getTime(),
  1175. ]);
  1176. $this->createLangFile(); // 生成语言包文件
  1177. if (false === $return) {
  1178. $this->success('操作成功');
  1179. } else {
  1180. return true;
  1181. }
  1182. }
  1183. }
  1184. }
  1185. if (false === $return) {
  1186. $this->error("操作失败");
  1187. } else {
  1188. return false;
  1189. }
  1190. }
  1191. /**
  1192. * 检测单个语言是否同步最新官方语言包
  1193. */
  1194. public function check_pack_syn()
  1195. {
  1196. //防止超时
  1197. function_exists('set_time_limit') && set_time_limit(0);
  1198. $syn_pack_id = Db::name('language')->max('syn_pack_id');
  1199. $service_ey = config('service_ey');
  1200. $query_str = 'L2luZGV4LnBocD9tPWFwaSZjPUxhbmd1YWdlJmE9Y2hlY2tfYWxsX25ld19wYWNrJg==';
  1201. $values = array(
  1202. 'pack_id'=>$syn_pack_id,
  1203. );
  1204. $url = base64_decode($service_ey).base64_decode($query_str).http_build_query($values);
  1205. $context = stream_context_set_default(array('http' => array('timeout' => 3,'method'=>'GET')));
  1206. $response = @file_get_contents($url,false,$context);
  1207. $params = json_decode($response,true);
  1208. if (false != $params && 0 < intval($params)) {
  1209. $this->error("有新版本语言包");
  1210. } else {
  1211. $this->success("已是最新语言包");
  1212. }
  1213. }
  1214. }