* Date: 2018-4-3
*/
namespace app\admin\controller;
use think\Db;
use think\Cache;
use app\common\logic\ArctypeLogic;
use think\paginator\driver; // 生成静态页面代码
class Seo extends Base
{
public function _initialize() {
parent::_initialize();
$this->language_access(); // 多语言功能操作权限
}
/*
* 生成总站
*/
public function site(){
return $this->fetch();
}
/*
* 生成栏目页
*/
public function channel(){
$typeid = input('param.typeid/d','0'); // 栏目ID
$this->assign("typeid",$typeid);
return $this->fetch();
}
/*
* 生成文档页
*/
public function article()
{
$typeid = input('param.typeid/d','0'); // 栏目ID
$this->assign("typeid",$typeid);
return $this->fetch();
}
/*
* URL配置
*/
public function seo()
{
/* 纠正栏目的HTML目录路径字段值 */
$this->correctArctypeDirpath();
/* end */
$inc_type = 'seo';
$config = tpCache($inc_type);
$config['seo_pseudo'] = tpCache('seo.seo_pseudo');
$seo_pseudo_list = get_seo_pseudo_list();
$this->assign('seo_pseudo_list', $seo_pseudo_list);
/* 生成静态页面代码 - 多语言统一设置URL模式 */
$seo_pseudo_lang = '';
$web_language_switch = tpCache('web.web_language_switch');
if (is_language() && !empty($web_language_switch)) {
$markArr = Db::name('language')->field('mark')->order('id asc')->limit('1,1')->select();
if (!empty($markArr[0]['mark'])) {
$seo_pseudo_lang = tpCache('seo.seo_pseudo', [], $markArr[0]['mark']);
}
$seo_pseudo_lang = !empty($seo_pseudo_lang) ? $seo_pseudo_lang : 1;
}
$this->assign('seo_pseudo_lang', $seo_pseudo_lang);
/* end */
/* 限制文档HTML保存路径的名称 */
$wwwroot_dir = config('global.wwwroot_dir'); // 网站根目录的目录列表
$disable_dirname = config('global.disable_dirname'); // 栏目伪静态时的路由路径
$wwwroot_dir = array_merge($wwwroot_dir, $disable_dirname);
// 不能与栏目的一级目录名称重复
$arctypeDirnames = Db::name('arctype')->where(['parent_id'=>0])->column('dirname');
is_array($arctypeDirnames) && $wwwroot_dir = array_merge($wwwroot_dir, $arctypeDirnames);
// 不能与多语言的标识重复
$markArr = Db::name('language_mark')->column('mark');
is_array($markArr) && $wwwroot_dir = array_merge($wwwroot_dir, $markArr);
$wwwroot_dir = array_unique($wwwroot_dir);
$this->assign('seo_html_arcdir_limit', implode(',', $wwwroot_dir));
/* end */
$seo_html_arcdir_1 = '';
if (!empty($config['seo_html_arcdir'])) {
$config['seo_html_arcdir'] = trim($config['seo_html_arcdir'], '/');
$seo_html_arcdir_1 = '/'.$config['seo_html_arcdir'];
}
$this->assign('seo_html_arcdir_1', $seo_html_arcdir_1);
// 栏目列表
$map = array(
'status' => 1,
'is_del' => 0, // 回收站功能
);
$arctypeLogic = new ArctypeLogic();
$select_html = $arctypeLogic->arctype_list(0, 0, true, config('global.arctype_max_level'), $map);
$this->assign('select_html',$select_html);
// 允许发布文档列表的栏目
$arc_select_html = allow_release_arctype();
$this->assign('arc_select_html', $arc_select_html);
// 生成完页面之后,清除缓存
$this->buildhtml_clear_cache();
/*标记是否第一次切换静态页面模式*/
if (!isset($config['seo_html_arcdir'])) {
$init_html = 1; // 第一次切换
} else {
$init_html = 2; // 多次切换
}
$this->assign('init_html', $init_html);
/*--end*/
$this->assign('config',$config);//当前配置项
return $this->fetch();
}
/*
* 保存URL配置
*/
public function handle()
{
if (IS_POST) {
$inc_type = 'seo';
$param = input('post.');
$globalConfig = tpCache('global');
$seo_pseudo_new = $param['seo_pseudo'];
/* 生成静态页面代码 */
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($_SERVER['HTTP_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*/
/*多语言*/
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*/
/* 生成静态页面代码 - 更新分页php文件支持生成静态功能*/
$this->update_paginatorfile();
/* end */
// 清空缓存
delFile(rtrim(HTML_ROOT, '/'));
\think\Cache::clear();
$this->success('操作成功', url('Seo/seo'));
}
$this->error('操作失败');
}
/**
* 生成静态页面代码 - 更新分页php文件支持生成静态功能
*/
private function update_paginatorfile()
{
$dirpath = CORE_PATH . 'paginator/driver/*.php';
$files = glob($dirpath);
foreach ($files as $key => $file) {
if (is_writable($file)) {
$strContent = @file_get_contents($file);
if (false != $strContent && !stristr($strContent, 'data-ey_fc35fdc="html"')) {
$replace = 'htmlentities($url) . \'" data-ey_fc35fdc="html" data-tmp="1\'';
$strContent = str_replace('htmlentities($url)', $replace, $strContent);
@chmod($file,0777);
@file_put_contents($file, $strContent);
}
}
}
}
/*
* 生成整站静态文件
*/
public function buildSite(){
$type = input("param.type/s");
if($type != 'site'){
$this->error('操作失败');
}
$this->success('操作成功');
}
/*
* 获取生成栏目或文章的栏目id
*/
public function getAllType(){
$id = input("param.id/d");//栏目id
$type = input("param.type/d");//1栏目2文章
if(empty($id)) {
if($id == 0){
$mark = Db::name('language')->order('id asc')->value('mark');
if($type == 1){
$arctype = Db::name('arctype')->where(['is_del'=>0,'status'=>1,'lang'=>$mark])->getfield('id',true);
}else{
$where['is_del'] = 0;
$where['status'] = 1;
$where['lang'] = $mark;
$where['current_channel'] = array(array('neq',6),array('neq',8));
$arctype = Db::name('arctype')->where($where)->getfield('id',true);
}
if(empty($arctype)){
$this->error('没有要更新的栏目!');
}else{
$arctype = implode(',',$arctype);
$this->success($arctype);
}
}else{
$this->error('栏目ID不能为空!');
}
}else{
//递归查询所有的子类
$arctype_child_all = array($id);
getAllChild($arctype_child_all,$id,$type);
$arctype_child_all = implode(',',$arctype_child_all);
if(empty($arctype_child_all)) {
$this->error('没有要更新的栏目!');
}else{
$this->success($arctype_child_all);
}
}
}
/**
* 纠正栏目的HTML目录路径字段值
*/
private function correctArctypeDirpath()
{
$system_correctArctypeDirpath = tpCache('system.system_correctArctypeDirpath');
if (!empty($system_correctArctypeDirpath)) {
return false;
}
$saveData = [];
$arctypeList = Db::name('arctype')->field('id,parent_id,dirname,dirpath,grade')
->order('grade asc')
->getAllWithIndex('id');
foreach ($arctypeList as $key => $val) {
if (empty($val['parent_id'])) { // 一级栏目
$saveData[] = [
'id' => $val['id'],
'dirpath' => '/'.$val['dirname'],
'grade' => 0,
'update_time' => getTime(),
];
} else {
$parentRow = $arctypeList[$val['parent_id']];
if (empty($parentRow['parent_id'])) { // 二级栏目
$saveData[] = [
'id' => $val['id'],
'dirpath' => '/'.$parentRow['dirname'].'/'.$val['dirname'],
'grade' => 1,
'update_time' => getTime(),
];
} else { // 三级栏目
$topRow = $arctypeList[$parentRow['parent_id']];
$saveData[] = [
'id' => $val['id'],
'dirpath' => '/'.$topRow['dirname'].'/'.$parentRow['dirname'].'/'.$val['dirname'],
'grade' => 2,
'update_time' => getTime(),
];
}
}
}
$r = model('Arctype')->saveAll($saveData);
if (false !== $r) {
/*多语言*/
if (is_language()) {
$langRow = \think\Db::name('language')->order('id asc')
->cache(true, EYOUCMS_CACHE_TIME, 'language')
->select();
foreach ($langRow as $key => $val) {
tpCache('system', ['system_correctArctypeDirpath'=>1],$val['mark']);
}
} else {
tpCache('system',['system_correctArctypeDirpath'=>1]);
}
/*--end*/
}
}
/**
* 静态页面模式切换为其他模式时,检测之前生成的静态目录是否存在,并提示手工删除还是自动删除
*/
public function ajax_checkHtmlDirpath()
{
$seo_pseudo_new = input('param.seo_pseudo_new/d');
if (3 == $seo_pseudo_new) {
$dirArr = [];
$seo_html_listname = tpCache('seo.seo_html_listname');
$row = Db::name('arctype')->field('dirpath')->select();
foreach ($row as $key => $val) {
$dirpathArr = explode('/', $val['dirpath']);
if (3 == $seo_html_listname) {
$dir = end($dirpathArr);
} else {
$dir = !empty($dirpathArr[1]) ? $dirpathArr[1] : '';
}
if (!empty($dir) && !in_array($dir, $dirArr)) {
array_push($dirArr, $dir);
}
}
$data = [];
$data['msg'] = '';
$num = 0;
$wwwroot = glob('*', GLOB_ONLYDIR);
foreach ($wwwroot as $key => $val) {
if (in_array($val, $dirArr)) {
if (0 == $num) {
$data['msg'] .= "根目录下有HTML静态目录,请先删除:
";
}
$data['msg'] .= ($num+1)."、{$val}
";
$num++;
}
}
$data['height'] = $num * 24;
$this->success('检测成功!', null, $data);
}
}
/**
* 自动删除静态HTML存放目录
*/
public function ajax_delHtmlDirpath()
{
if (IS_AJAX_POST) {
$error = false;
$dirArr = [];
$seo_html_listname = tpCache('seo.seo_html_listname');
$row = Db::name('arctype')->field('dirpath')->select();
foreach ($row as $key => $val) {
$dirpathArr = explode('/', $val['dirpath']);
if (3 == $seo_html_listname) {
$dir = end($dirpathArr);
} else {
$dir = !empty($dirpathArr[1]) ? $dirpathArr[1] : '';
}
$filepath = "./{$dir}";
if (!empty($dir) && !in_array($dir, $dirArr) && file_exists($filepath)) {
@unlink($filepath."/index.html");
$bool = delFile($filepath, true);
if (false !== $bool) {
array_push($dirArr, $dir);
} else {
$error = true;
}
}
}
$data = [];
$data['msg'] = '';
if ($error) {
$num = 0;
$wwwroot = glob('*', GLOB_ONLYDIR);
foreach ($wwwroot as $key => $val) {
if (in_array($val, $dirArr)) {
if (0 == $num) {
$data['msg'] .= "部分目录删除失败,请手工删除:
";
}
$data['msg'] .= ($num+1)."、{$val}
";
$num++;
}
}
$data['height'] = $num * 24;
$this->error('删除失败!', null, $data);
}
$this->success('删除成功!', null, $data);
}
}
/**
* 生成完页面之后,清除缓存
*/
private function buildhtml_clear_cache()
{
// 文档参数缓存
cache("article_info_serialize",null);
cache("article_page_total_serialize",null);
cache("article_content_serialize",null);
cache("article_tags_serialize",null);
cache("article_attr_info_serialize",null);
cache("article_children_row_serialize",null);
// 栏目参数缓存
cache("channel_page_total_serialize",null);
cache("channel_info_serialize",null);
cache("has_children_Row_serialize",null);
}
}