* Date: 2018-4-3
*/
namespace app\api\controller;
use think\Db;
use think\template\driver\File;
class Sitemap extends Base
{
public function _initialize() {
parent::_initialize();
}
/**
* 生成sitemap
* @return [type] [description]
*/
public function ajax_update_sitemap()
{
sitemap_all();
if (IS_POST) {
$this->success('更新成功');
}
exit('success');
}
/**
* 生成sitemap.xml
* @return [type] [description]
*/
public function ajax_update_sitemap_xml()
{
sitemap_all('xml');
if (IS_POST) {
$this->success('更新成功');
}
exit('success');
}
/**
* 生成sitemap.txt
* @return [type] [description]
*/
public function ajax_update_sitemap_txt()
{
sitemap_all('txt');
if (IS_POST) {
$this->success('更新成功');
}
exit('success');
}
/**
* 生成sitemap.html
* @return [type] [description]
*/
public function ajax_update_sitemap_html(){
\think\Session::pause(); // 暂停session,防止session阻塞机制
$msg = $this->handleBuildSitemap();
if (IS_AJAX) {
if (empty($msg)) {
$this->success('更新成功');
} else {
$this->error('更新失败', null, ['msg'=>$msg]);
}
}
if (empty($msg)) {
exit('success');
} else {
exit($msg);
}
}
/*
* 处理生成html
*/
private function handleBuildSitemap()
{
$is_auto = input('param.is_auto/s', 'on'); // 是否自动生成,还是手工生成
$sitemapid = tpSetting('system.system_sitemapid1647228884'); //四个模块最后一条id,type_arc_tag_ask
$last_type = $last_arc = $last_tag = $last_ask = 0;
$is_create = false;
if (!is_file('./sitemap.html') || 'off' == $is_auto) {
$is_create = true;
}
if (!empty($sitemapid)){
$sitemapid_arr = explode("_",$sitemapid);
$last_type = !empty($sitemapid_arr[0]) ? $sitemapid_arr[0] : 0;
$last_arc = !empty($sitemapid_arr[1]) ? $sitemapid_arr[1] : 0;
$last_tag = !empty($sitemapid_arr[2]) ? $sitemapid_arr[2] : 0;
$last_ask = !empty($sitemapid_arr[3]) ? $sitemapid_arr[3] : 0;
}
$globalConfig = tpCache('global');
$web_name = empty($globalConfig['web_name']) ? $globalConfig['web_title'] : $globalConfig['web_name'];
$lang = get_current_lang();
//栏目信息
$type_map = array(
'status' => 1,
'is_del' => 0,
'lang' => $lang,
);
if (is_array($globalConfig)) {
// 过滤隐藏栏目
if (isset($globalConfig['sitemap_not1']) && $globalConfig['sitemap_not1'] > 0) {
$type_map['is_hidden'] = 0;
}
// 过滤外部模块
if (isset($globalConfig['sitemap_not2']) && $globalConfig['sitemap_not2'] > 0) {
$type_map['is_part'] = 0;
}
}
$result_arctype = Db::name('arctype')->field("*")
->where($type_map)
->order('id asc')
->getAllWithIndex('id');
$last_type_new = reset($result_arctype);
if ($is_create == false && !empty($last_type_new['id']) && $last_type_new['id'] > $last_type){
$is_create = true;
$last_type = $last_type_new['id'];
}
$type_list = [];
foreach ($result_arctype as $sub){
if ($sub['is_part'] == 1 && !empty($sub['typelink'])) {
$url = $sub['typelink'];
} else {
$url = get_typeurl($sub, false);
}
$type_list[] = [
'url' => $url,
'title' => $sub['typename']
];
}
//文档信息
$arc_map = array(
'channel' => ['IN', config('global.allow_release_channel')],
'arcrank' => array('gt', -1),
'status' => 1,
'is_del' => 0,
'lang' => $lang,
);
if (is_array($globalConfig)) {
// 过滤外部模块
if (isset($globalConfig['sitemap_not2']) && $globalConfig['sitemap_not2'] > 0) {
$arc_map['is_jump'] = 0;
}
}
/*定时文档显示插件*/
if (is_dir('./weapp/TimingTask/')) {
$weappModel = new \app\admin\model\Weapp;
$TimingTaskRow = $weappModel->getWeappList('TimingTask');
if (!empty($TimingTaskRow['status']) && 1 == $TimingTaskRow['status']) {
$arc_map['add_time'] = ['elt', getTime()]; // 只显当天或之前的文档
}
}
/*end*/
if (!isset($globalConfig['sitemap_archives_num']) || $globalConfig['sitemap_archives_num'] === '') {
$sitemap_archives_num = 1000;
} else {
$sitemap_archives_num = intval($globalConfig['sitemap_archives_num']);
}
$field = "aid, channel, is_jump, jumplinks, htmlfilename, add_time, update_time, typeid,title,province_id,city_id,area_id";
$result_archives = Db::name('archives')->field($field)
->where($arc_map)
->order('aid desc')
->limit($sitemap_archives_num)
->select();
$arc_list = [];
if ($is_create == false && !empty($result_archives[0]['aid']) && $result_archives[0]['aid'] > $last_arc){
$is_create = true;
$last_arc = $result_archives[0]['aid'];
}
foreach ($result_archives as $val){
if (empty($result_arctype[$val['typeid']])){
continue;
}
$val = array_merge($result_arctype[$val['typeid']], $val);
if ($val['is_jump'] == 1) {
$url = $val['jumplinks'];
} else {
$url = get_arcurl($val, false);
}
$arc_list[] = [
'url' => $url,
'title' => $val['title']
];
}
//tags页面
if (!isset($globalConfig['sitemap_tags_num']) || $globalConfig['sitemap_tags_num'] === '') {
$sitemap_tags_num = 1000;
} else {
$sitemap_tags_num = intval($globalConfig['sitemap_tags_num']);
}
$tags_map = array(
'lang' => $lang,
);
$field = "id, add_time, tag";
$result_tags = Db::name('tagindex')->field($field)
->where($tags_map)
->order('id desc')
->limit($sitemap_tags_num)
->select();
if ($is_create == false && !empty($result_tags[0]['id']) && $result_tags[0]['id'] > $last_tag){
$is_create = true;
$last_tag = $result_tags[0]['id'];
}
$tags_list = [];
foreach ($result_tags as $val){
$tags_list[] = [
'url' => get_tagurl($val['id']),
'title' => $val['tag']
];
}
// 问答插件
$ask_list = [];
if (is_dir('./weapp/Ask/')) {
try{
$askLogic = new \app\plugins\logic\AskLogic;
$Askow = Db::name("weapp")->where(['code'=>'Ask'])->field("status,data")->find();
if (!empty($Askow['status']) && 1 == $Askow['status']) {
$ask_map = [
'is_review' =>1,
];
$ask_seo_pseudo = 1;
$Askow['data'] = unserialize($Askow['data']);
if (!empty($Askow['data']['seo_pseudo'])) {
$ask_seo_pseudo = intval($Askow['data']['seo_pseudo']);
}
//问答首页
if (method_exists($askLogic, 'askurl')) {
$url = $askLogic->askurl('plugins/Ask/index', [], true, false, $ask_seo_pseudo);
} else {
$url = url('plugins/Ask/index', [], true, false, $ask_seo_pseudo);
}
$ask_list[] = [
'url' => auto_hide_index($url),
'title' => "问答首页"
];
//问答栏目
$result_ask_type = Db::name("weapp_ask_type")->field("type_id,type_name")->order('sort_order asc')->select();
foreach ($result_ask_type as $val){
if (method_exists($askLogic, 'askurl')) {
$url = $askLogic->askurl('plugins/Ask/index', ['type_id'=>$val['type_id']],true,false,$ask_seo_pseudo);
} else {
$url = url('plugins/Ask/index', ['type_id'=>$val['type_id']],true,false,$ask_seo_pseudo);
}
$ask_list[] = [
'url' => auto_hide_index($url),
'title' => $val['type_name']
];
}
//问答内容
$result_ask = Db::name('weapp_ask')->field('ask_id,type_id,ask_title')
->where($ask_map)
->order('ask_id desc')
->select();
foreach ($result_ask as $val){
if (method_exists($askLogic, 'askurl')) {
$url = $askLogic->askurl('plugins/Ask/details', ['ask_id'=>$val['ask_id']],true,false,$ask_seo_pseudo);
} else {
$url = url('plugins/Ask/details', ['ask_id'=>$val['ask_id']],true,false,$ask_seo_pseudo);
}
$ask_list[] = [
'url' => auto_hide_index($url),
'title' => $val['ask_title']
];
}
if ($is_create == false && !empty($result_ask[0]['ask_id']) && $result_ask[0]['ask_id'] > $last_ask){
$is_create = true;
$last_ask = $result_ask[0]['ask_id'];
}
}
}catch (\Exception $e){}
}
$msg = '';
if ($is_create){
//数据整合与生成
$eyou = array(
'seo_title' => $web_name.'_网站地图',
'seo_keywords' => '',
'seo_description' => '',
'index' => ['url'=>request()->domain().ROOT_DIR.'/','title'=>$web_name], //首页信息(url链接和title)
'type_list' => $type_list,
'arc_list' => $arc_list,
'tags_list' => $tags_list,
'ask_list' => $ask_list
);
$this->assign('eyou', $eyou);
try {
$savepath = "./sitemap.html";
$tpl = 'index';
$this->filePutContents($savepath, $tpl);
$sitemapid = $last_type."_".$last_arc."_".$last_tag."_".$last_ask;
$r = tpSetting('system',['system_sitemapid1647228884'=>$sitemapid]);
} catch (\Exception $e) {
$msg .= 'sitemap.html生成失败!' . $e->getMessage() . '
';
}
}
return $msg;
}
/*
* 写入静态页面
* $savepath 保存位置
* $tpl 模板名称
*
*/
private function filePutContents($savepath, $tpl)
{
ob_start();
static $templateConfig = null;
null === $templateConfig && $templateConfig = \think\Config::get('template');
$templateConfig['view_path'] = "./public/html/";
$template = "./public/html/sitemap.{$templateConfig['view_suffix']}";
$content = $this->fetch($template, [], [], $templateConfig);
/*解决模板里没有设置编码的情况*/
if (!stristr($content, 'utf-8')) {
$content = str_ireplace('