| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- namespace addons\cms\controller;
- use think\Config;
- use think\Response;
- /**
- * Sitemap控制器
- * Class Sitemap
- * @package addons\cms\controller
- */
- class Sitemap extends Base
- {
- protected $noNeedLogin = ['*'];
- protected $options = [
- 'item_key' => '',
- 'root_node' => 'urlset',
- 'item_node' => 'url',
- 'root_attr' => 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/"'
- ];
- //默认配置
- protected $config = [
- 'pagesize' => 5000,
- 'cache' => 3600
- ];
- public function _initialize()
- {
- parent::_initialize();
- $config = get_addon_config('cms');
- $this->config['pagesize'] = $config['sitemappagesize'] ?? 5000;
- $this->config['cache'] = $config['sitemapcachelifetime'] ?? 3600;
- $this->config['cache'] = intval($this->config['cache']) < 0 ? false : $this->config['cache'];
- Config::set('default_return_type', 'xml');
- }
- /**
- * Sitemap集合
- */
- public function index()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $type = $this->request->param('type', '');
- $type = str_replace('.xml', '', $type);
- $type = $type === 'all' ? '' : $type;
- $list = [];
- $pagesizeStr = $pagesize != $this->config['pagesize'] ? "pagesize/{$pagesize}/" : '';
- if (!$type || $type == 'channel') {
- $path = "/addons/cms/sitemap/channels/{$pagesizeStr}page/[PAGE]";
- $channelsList = \addons\cms\model\Channel::where('status', 'normal')->field('id,name,diyname,createtime')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $channelsList->lastPage();
- foreach ($channelsList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'archives') {
- $path = "/addons/cms/sitemap/archives/{$pagesizeStr}page/[PAGE]";
- $archivesList = \addons\cms\model\Archives::with(['channel'])->where('status', 'normal')->field('id,channel_id,diyname,createtime,publishtime')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $archivesList->lastPage();
- foreach ($archivesList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'tags') {
- $path = "/addons/cms/sitemap/tags/{$pagesizeStr}page/[PAGE]";
- $tagsList = \addons\cms\model\Tag::where('status', 'normal')->field('id,name')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $tagsList->lastPage();
- foreach ($tagsList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'users') {
- $path = "/addons/cms/sitemap/users/{$pagesizeStr}page/[PAGE]";
- $usersList = \addons\cms\model\User::where('status', 'normal')->field('id')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $usersList->lastPage();
- foreach ($usersList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'specials') {
- $path = "/addons/cms/sitemap/specials/{$pagesizeStr}page/[PAGE]";
- $usersList = \addons\cms\model\Special::where('status', 'normal')->field('id')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $usersList->lastPage();
- foreach ($usersList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'pages') {
- $path = "/addons/cms/sitemap/pages/{$pagesizeStr}page/[PAGE]";
- $usersList = \addons\cms\model\Page::where('status', 'normal')->field('id')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $usersList->lastPage();
- foreach ($usersList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- if (!$type || $type == 'diyforms') {
- $path = "/addons/cms/sitemap/diyforms/{$pagesizeStr}page/[PAGE]";
- $usersList = \addons\cms\model\Diyform::where('status', 'normal')->field('id')->paginate($pagesize, false, ['path' => $path]);
- $lastPage = $usersList->lastPage();
- foreach ($usersList->getUrlRange(1, $lastPage) as $index => $item) {
- $list[] = ['loc' => url($item, '', 'xml', true)];
- }
- }
- $this->options = [
- 'item_key' => '',
- 'root_node' => 'sitemapindex',
- 'item_node' => 'sitemap',
- 'root_attr' => ''
- ];
- return $this->xml($list);
- }
- /**
- * 栏目
- */
- public function channels()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $archivesList = \addons\cms\model\Channel::where('status', 'normal')->cache($this->config['cache'])->field('id,name,diyname,createtime')->paginate($pagesize, true);
- $list = [];
- foreach ($archivesList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 文章
- */
- public function archives()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $archivesList = \addons\cms\model\Archives::with(['channel'])->where('status', 'normal')->cache($this->config['cache'])->field('id,channel_id,diyname,createtime')->paginate($pagesize, true);
- $list = [];
- foreach ($archivesList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.8
- ];
- }
- return $this->xml($list);
- }
- /**
- * 标签
- */
- public function tags()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $tagsList = \addons\cms\model\Tag::where('status', 'normal')->cache($this->config['cache'])->field('id,name')->paginate($pagesize, true);
- $list = [];
- foreach ($tagsList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 用户
- */
- public function users()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $userList = \addons\cms\model\User::where('status', 'normal')->cache($this->config['cache'])->field('id')->paginate($pagesize, true);
- $list = [];
- foreach ($userList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 专题
- */
- public function specials()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $specialList = \addons\cms\model\Special::where('status', 'normal')->cache($this->config['cache'])->field('id,diyname,createtime')->paginate($pagesize, true);
- $list = [];
- foreach ($specialList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 单页
- */
- public function pages()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $specialList = \addons\cms\model\Page::where('status', 'normal')->cache($this->config['cache'])->field('id,diyname,createtime')->paginate($pagesize, true);
- $list = [];
- foreach ($specialList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 自定义表单
- */
- public function diyforms()
- {
- $pagesize = $this->request->param('pagesize/d', $this->config['pagesize']);
- $specialList = \addons\cms\model\Diyform::where('status', 'normal')->cache($this->config['cache'])->field('id,diyname,createtime')->paginate($pagesize, true);
- $list = [];
- foreach ($specialList as $index => $item) {
- $list[] = [
- 'loc' => $item->fullurl,
- 'priority' => 0.6
- ];
- }
- return $this->xml($list);
- }
- /**
- * 输出XML
- */
- protected function xml($data = [])
- {
- foreach ($data as $index => &$item) {
- $item['loc'] = htmlspecialchars($item['loc']);
- }
- return Response::create($data, 'xml', 200, [], $this->options);
- }
- }
|