PageController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\DistAppearanceTemplate;
  4. use Illuminate\Http\Request;
  5. use App\Services\LiquidRenderer;
  6. use App\Models\SitePage;
  7. class PageController extends Controller
  8. {
  9. protected $liquidRenderer;
  10. public function __construct(LiquidRenderer $liquidRenderer)
  11. {
  12. $this->liquidRenderer = $liquidRenderer;
  13. }
  14. /**
  15. * Display a listing of the pages.
  16. *
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function list()
  20. {
  21. abort('404');
  22. $cacheKey = "page_list_dist_" . getDistId() . "_page_" . request()->get('page', 1);
  23. $pages = SitePage::paginate(10)->where('dist_id', getDistId())->where('status', '1'); // 每页显示10个页面
  24. return $this->liquidRenderer->render('pages_list', ['pages' => $pages],$cacheKey);
  25. }
  26. /**
  27. * Display the specified page.
  28. *
  29. * @param string $slug
  30. * @return \Illuminate\Http\Response
  31. */
  32. public function detail($slug)
  33. {
  34. $recent_pages=null;
  35. $page = SitePage::where('status', '1')->where('dist_id', getDistId())->where('slug', $slug)->orWhere('id', $slug)->first();
  36. // 如果没有找到且是数字,通过 id 获取页面
  37. if (!$page) {
  38. if (is_numeric($slug))
  39. {
  40. $page = SitePage::where('status', '1')->where('dist_id', getDistId())->where('id', $slug)->firstOrFail();
  41. }
  42. else{
  43. abort(403);
  44. }
  45. }
  46. if($page->page_type==0) {
  47. $previousPage = SitePage::where('dist_id', getDistId())
  48. ->where('status', '1')
  49. ->where('id', '<', $page->id)
  50. ->where('page_type',0)
  51. ->orderBy('id', 'desc')
  52. ->first();
  53. $nextPage = SitePage::where('dist_id', getDistId())
  54. ->where('status', '1')
  55. ->where('id', '>', $page->id)
  56. ->where('page_type',0)
  57. ->orderBy('id', 'asc')
  58. ->first();
  59. // 创建分页数据结构
  60. $paginator = [
  61. 'previous_page' => $previousPage ? true : false, // 是否有上一页
  62. 'previous_page_url' => $previousPage ? "/pages/" . ($previousPage->slug ?: $previousPage->id) : null, // 上一页的 URL
  63. 'previous_page_title' => $previousPage ? $previousPage->title : null, // 上一页的标题
  64. 'next_page' => $nextPage ? true : false, // 是否有下一页
  65. 'next_page_url' => $nextPage ? "/pages/" . ($nextPage->slug ?: $nextPage->id) : null, // 下一页的 URL
  66. 'next_page_title' => $nextPage ? $nextPage->title : null, // 下一页的标题
  67. ];
  68. //Recent post
  69. //获取最近的文章 数量有限制,当前文章不要放进去
  70. $recent_pages_limit=10;
  71. $recent_pages = SitePage::where('dist_id', getDistId())
  72. ->where('status', '1')
  73. ->where('id', '!=', $page->id)
  74. ->where('page_type',0)
  75. ->orderBy('id', 'desc')
  76. ->limit($recent_pages_limit)
  77. ->get();
  78. }
  79. else{
  80. $paginator = [];
  81. }
  82. // 构建导航数据 开始
  83. $breadcrumbs = [
  84. [
  85. 'url' => '/',
  86. 'name' => 'Home',
  87. ]
  88. ];
  89. if ($page->tags->isNotEmpty()) {
  90. $tag = $page->tags->first();
  91. $breadcrumbs[] = [
  92. 'url' => $tag->slug ? "/collections/{$tag->slug}" : "/collections/{$tag->id}",
  93. 'name' => $tag->name,
  94. ];
  95. }
  96. $breadcrumbs[] = [
  97. 'url' => '#',
  98. 'name' => $page->title,
  99. ];
  100. // 构建导航数据 结束
  101. $template_file ='pages_detail.liquid';
  102. if(!empty($page->template_file ))
  103. {
  104. //查找当前外观是否存在这文件,找不到就用默认的
  105. $dist=app('dist');
  106. $appearanceId = $dist->appearance->id;
  107. if (DistAppearanceTemplate::hasFileName($page->template_file,getDistId(),$appearanceId) == true) {
  108. $template_file=$page->template_file;
  109. }
  110. }
  111. return $this->liquidRenderer->render($template_file,
  112. [
  113. 'page' => $page,
  114. 'recent_pages' => $recent_pages,
  115. 'breadcrumbs' => $breadcrumbs,
  116. 'paginator' => $paginator,
  117. 'csrf_token' => csrf_token(),
  118. ]);
  119. }
  120. }