* Date: 2018-4-3 */ namespace app\common\logic; use think\Model; use think\Db; /** * 逻辑定义 * @package common\Logic */ load_trait('controller/Jump'); class BuildhtmlLogic extends Model { use \traits\controller\Jump; /** * 初始化操作 */ public function _initialize() { parent::_initialize(); } /* * 保存URL配置 */ public function seo_handle($post = []) { $param = $post; $inc_type = 'seo'; $globalConfig = tpCache('global'); $seo_pseudo_new = $param['seo_pseudo']; /*伪静态格式*/ if (3 == $seo_pseudo_new && in_array($param['seo_rewrite_format'], [1,3,4])) { $param['seo_rewrite_format'] = !empty($param['seo_rewrite_view_format']) ? $param['seo_rewrite_view_format'] : 1; } /*--end*/ /* 生成静态页面代码 */ unset($param['seo_html_arcdir_limit']); if (!empty($param['seo_html_arcdir']) && !preg_match('/^([0-9a-zA-Z\_\-\/]+)$/i', $param['seo_html_arcdir'])) { $this->error('页面保存路径的格式错误!'); } if (!empty($param['seo_html_arcdir'])) { if (preg_match('/^([0-9a-zA-Z\_\-\/]+)$/i', $param['seo_html_arcdir'])) { // $param['seo_html_arcdir'] = ROOT_DIR.'/'.trim($param['seo_html_arcdir'], '/'); $param['seo_html_arcdir'] = '/'.trim($param['seo_html_arcdir'], '/'); } else { $this->error('页面保存路径的格式错误!'); } } $seo_html_arcdir_old = !empty($globalConfig['seo_html_arcdir']) ? $globalConfig['seo_html_arcdir'] : ''; /* end */ /*检测是否开启pathinfo模式*/ try { if (3 == $seo_pseudo_new || (1 == $seo_pseudo_new && 2 == $param['seo_dynamic_format'])) { $fix_pathinfo = ini_get('cgi.fix_pathinfo'); if (stristr(request()->host(), '.mylightsite.com')) { $this->error('腾讯云空间不支持伪静态!'); } else if ('' != $fix_pathinfo && 0 === $fix_pathinfo) { $this->error('空间不支持伪静态,请开启pathinfo,或者在php.ini里修改cgi.fix_pathinfo=1'); } } /* 生成静态页面代码 - URL模式切换时删掉根目录下的index.html静态文件 */ if(1 == $seo_pseudo_new || 3 == $seo_pseudo_new){ if(file_exists('./index.html')){ @unlink('./index.html'); } } /* end */ } catch (\Exception $e) {} /*--end*/ /*强制去除index.php*/ if (isset($param['seo_force_inlet'])) { $seo_force_inlet = $param['seo_force_inlet']; $seo_force_inlet_old = !empty($globalConfig['seo_force_inlet']) ? $globalConfig['seo_force_inlet'] : ''; if ($seo_force_inlet_old != $seo_force_inlet) { $param['seo_inlet'] = $seo_force_inlet; } } /*--end*/ // 用于静态模式,发布编辑文档后更新 $param['seo_uphtml_after_home'] = !empty($param['seo_uphtml_after_home']) ? $param['seo_uphtml_after_home'] : 0; $param['seo_uphtml_after_channel'] = !empty($param['seo_uphtml_after_channel']) ? $param['seo_uphtml_after_channel'] : 0; $param['seo_uphtml_after_pernext'] = !empty($param['seo_uphtml_after_pernext']) ? $param['seo_uphtml_after_pernext'] : 0; $param['seo_uphtml_editafter_home'] = !empty($param['seo_uphtml_editafter_home']) ? $param['seo_uphtml_editafter_home'] : 0; $param['seo_uphtml_editafter_channel'] = !empty($param['seo_uphtml_editafter_channel']) ? $param['seo_uphtml_editafter_channel'] : 0; $param['seo_uphtml_editafter_pernext'] = !empty($param['seo_uphtml_editafter_pernext']) ? $param['seo_uphtml_editafter_pernext'] : 0; // 用于动态、伪静态模式,在运营模式下 - 发布编辑文档后清除缓存 $param['seo_uphtml_after_home13'] = !empty($param['seo_uphtml_after_home13']) ? $param['seo_uphtml_after_home13'] : 0; $param['seo_uphtml_after_channel13'] = !empty($param['seo_uphtml_after_channel13']) ? $param['seo_uphtml_after_channel13'] : 0; $param['seo_uphtml_after_pernext13'] = !empty($param['seo_uphtml_after_pernext13']) ? $param['seo_uphtml_after_pernext13'] : 0; /*多语言*/ if (is_language()) { $seo_pseudo_lang = !empty($param['seo_pseudo_lang']) ? $param['seo_pseudo_lang'] : 1; unset($param['seo_pseudo_lang']); $langRow = \think\Db::name('language')->order('id asc') ->cache(true, EYOUCMS_CACHE_TIME, 'language') ->select(); foreach ($langRow as $key => $val) { if (2 != $seo_pseudo_new) { // 非生成静态模式下,所有语言的URL模式一致 tpCache($inc_type,$param,$val['mark']); } else { if($key == 0){ // 主体语言(第一个语言)是生成静态模式 tpCache($inc_type,$param,$val['mark']); }else{//其他语言统一设置URL模式非静态模式 $param['seo_pseudo'] = $seo_pseudo_lang; tpCache($inc_type,$param,$val['mark']); } } } } else { tpCache($inc_type,$param); } /*--end*/ } /** * 生成静态专用 - 获取全部栏目的数据 */ public function get_arctype_all($field = '*') { $cacheKey = md5('common_buildhtmllogic_get_arctype_all_'.$field); $result = cache($cacheKey); if (empty($result)) { $result = Db::name('arctype')->field($field)->getAllWithIndex('id'); cache($cacheKey, $result, null, 'arctype'); } return !empty($result) ? $result : []; } /** * 生成静态专用 - 获取全部文档对应的栏目id */ public function get_archives_all() { $empty_num = 0; $pagesize = 15000; for ($i=0; $i < 1000; $i++) { $result = []; $start = $i * $pagesize; $end = ($i + 1) * $pagesize; $field = 'aid,typeid'; $row = Db::name('archives')->where([ 'aid' => ['BETWEEN', [$start + 1, $end]], ])->field($field)->select(); if (empty($row)) { if ($empty_num < 2) { $empty_num++; continue; } else { break; } } foreach ($row as $key => $val) { $result[$val['aid']] = $val['typeid']; } $cacheKey = "table_archives_{$start}_{$end}"; cache($cacheKey, $result, null, 'archives'); } } /** * 删除文档对应的html页面文件 * @param array $aids [description] * @return [type] [description] */ public function delViewHtml($aids = [], $globalConfig = []) { if (empty($globalConfig)) { $globalConfig = tpCache('global'); } if (2 == $globalConfig['seo_pseudo']) { $info = Db::name('archives')->field('b.topid,b.dirpath,b.diy_dirpath,b.rulelist,b.ruleview,a.*') ->alias('a') ->join('__ARCTYPE__ b', 'a.typeid = b.id', 'LEFT') ->where([ 'a.aid' => ['in', $aids], ]) ->select(); $seo_html_pagename = $globalConfig['seo_html_pagename']; foreach ($info as $key => $row) { $filename = $row['aid']; if (!empty($row['htmlfilename'])) { $filename = $row['htmlfilename']; } $dir = $this->getArticleDir($row, $globalConfig); if (4 == $seo_html_pagename) { if (!empty($row['ruleview'])) { $path = $dir; }else{ $path = $dir . "/" . $filename . ".html"; } } else { $path = $dir . "/" . $filename . ".html"; } if (file_exists($path)) @unlink($path); } } } public function getArticleDir($row = [], $globalConfig = []) { if (empty($globalConfig)) { $globalConfig = tpCache('global'); } $dir = ""; $seo_html_pagename = $globalConfig['seo_html_pagename']; $seo_html_arcdir = $globalConfig['seo_html_arcdir']; $dirpath = !empty($row['dirpath']) ? $row['dirpath'] : ''; $aid = !empty($row['htmlfilename']) ? $row['htmlfilename'] : $row['aid']; if ($seo_html_pagename == 1) {//存放顶级目录 $dirpath_arr = explode('/', $dirpath); if (count($dirpath_arr) > 2) { $dir = '.' . $seo_html_arcdir . '/' . $dirpath_arr[1]; } else { $dir = '.' . $seo_html_arcdir . $dirpath; } } else if ($seo_html_pagename == 3) { //存放子级目录 $dirpath_arr = explode('/', $dirpath); if (count($dirpath_arr) > 2) { $dir = '.' . $seo_html_arcdir . '/' . end($dirpath_arr); } else { $dir = '.' . $seo_html_arcdir . $dirpath; } } else if ($seo_html_pagename == 4) { //自定义存放目录 $dir = '.' . $seo_html_arcdir; $diy_dirpath = !empty($row['diy_dirpath']) ? $row['diy_dirpath'] : ''; if (!empty($row['ruleview'])) { $y = $m = $d = 1; if (!empty($row['add_time'])) { $y = date('Y', $row['add_time']); $m = date('m', $row['add_time']); $d = date('d', $row['add_time']); } $ruleview = ltrim($row['ruleview'], '/'); $ruleview = str_ireplace("{aid}", $aid, $ruleview); $ruleview = str_ireplace("{Y}", $y, $ruleview); $ruleview = str_ireplace("{M}", $m, $ruleview); $ruleview = str_ireplace("{D}", $d, $ruleview); $ruleview = preg_replace('/{(栏目目录|typedir)}(\/?)/i', $diy_dirpath.'/', $ruleview); $ruleview = '/'.ltrim($ruleview, '/'); $dir .= $ruleview; }else{ $dir .= $diy_dirpath; } } else { //存放父级目录 $dir = '.' . $seo_html_arcdir . $dirpath; } return $dir; } }