Special.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace addons\cms\controller;
  3. use addons\cms\library\Service;
  4. use addons\cms\model\Archives;
  5. use addons\cms\model\Fields;
  6. use addons\cms\model\Special as SpecialModel;
  7. use addons\cms\model\SpiderLog;
  8. use addons\cms\model\Taggable;
  9. use think\Config;
  10. use think\Exception;
  11. /**
  12. * 专题控制器
  13. * Class Special
  14. * @package addons\cms\controller
  15. */
  16. class Special extends Base
  17. {
  18. /**
  19. * 专题页面
  20. */
  21. public function index()
  22. {
  23. $config = get_addon_config('cms');
  24. $diyname = $this->request->param('diyname');
  25. if ($diyname && !is_numeric($diyname)) {
  26. $special = SpecialModel::getByDiyname($diyname);
  27. } else {
  28. $id = $diyname ? $diyname : $this->request->param('id', '');
  29. $special = SpecialModel::get($id);
  30. }
  31. if (!$special || $special['status'] != 'normal') {
  32. $this->error(__('No specified special found'));
  33. }
  34. $special->setInc("views", 1);
  35. Service::appendTextAndList('special', 0, $special);
  36. //模板名称
  37. $special['template'] = $special['template'] ? $special['template'] : 'special.html';
  38. $template = ($this->request->isAjax() ? '/ajax/' : '/') . $special["template"];
  39. $template = preg_replace('/\.html$/', '', $template);
  40. $pagelistParams = Service::getPagelistParams($template);
  41. //分页大小
  42. $pagesize = $pagelistParams['pagesize'] ?? 10;
  43. //过滤条件
  44. $filterPagelist = function ($query) use ($pagelistParams) {
  45. if (isset($pagelistParams['condition'])) {
  46. $query->where($pagelistParams['condition']);
  47. }
  48. };
  49. $archivesList = \addons\cms\model\Archives::with(['channel'])
  50. ->where(function ($query) use ($special) {
  51. //$query->whereRaw("(`special_ids`!='' AND FIND_IN_SET('{$special->id}', `special_ids`))");
  52. //if ($special['tag_ids']) {
  53. // $query->whereOr('id', 'in', function ($query) use ($special) {
  54. // return $query->name("cms_taggable")->where("tag_id", 'in', $special['tag_ids'])->field("archives_id");
  55. // });
  56. //}
  57. $tableName = (new Taggable)->getTable();
  58. $archivesIds = Archives::whereRaw("(`special_ids`!='' AND FIND_IN_SET({$special->id}, `special_ids`))")
  59. ->whereOr("id IN (SELECT archives_id FROM {$tableName} WHERE tag_id IN (" . ($special->tag_ids ? $special->tag_ids : '0') . "))")
  60. ->cache(true)
  61. ->column('id');
  62. $archivesIds = array_filter(array_unique($archivesIds));
  63. $query->where('id', 'in', $archivesIds);
  64. })
  65. ->where($filterPagelist)
  66. ->where('status', 'normal')
  67. ->whereNull('deletetime')
  68. ->order('weigh DESC,publishtime DESC')
  69. ->paginate($pagesize, $config['pagemode'] == 'simple');
  70. $this->view->assign("archivesList", $archivesList);
  71. $this->view->assign("__PAGELIST__", $archivesList);
  72. $this->view->assign("__SPECIAL__", $special);
  73. $channel = \addons\cms\model\Channel::getChannelByLinktype('special', $special['id']);
  74. $this->view->assign("__CHANNEL__", $channel);
  75. SpiderLog::record('special', $special['id']);
  76. //设置TKD
  77. Config::set('cms.title', isset($special['seotitle']) && $special['seotitle'] ? $special['seotitle'] : $special['title']);
  78. Config::set('cms.keywords', $special['keywords']);
  79. Config::set('cms.description', $special['description']);
  80. Config::set('cms.image', isset($special['image']) && $special['image'] ? cdnurl($special['image'], true) : '');
  81. if ($this->request->isAjax()) {
  82. $this->success("", "", $this->view->fetch($template));
  83. }
  84. return $this->view->fetch($template);
  85. }
  86. }