PageController.php 6.0 KB

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