ProductController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Services\LiquidRenderer;
  5. use App\Models\DistProduct;
  6. use App\Models\DistProductCategory; // 引入分类模型
  7. use App\Models\SitePage;
  8. class ProductController 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 products.
  17. *
  18. * @return \Illuminate\Http\Response
  19. */
  20. // public function index()
  21. // {
  22. // $products = Product::paginate(10); // 每页显示10个产品
  23. // return $this->liquidRenderer->render('products.index', ['products' => $products]);
  24. // }
  25. public function category($slug)
  26. {
  27. // $products = DistProduct::paginate(10); // 每页显示10个产品
  28. // return $this->liquidRenderer->render('products_categories.liquid', ['products' => $products]);
  29. // 获取分类信息
  30. // 获取分类信息,并限定 dist_id
  31. $category = DistProductCategory::where(function ($query) use ($slug) {
  32. $query->where('slug', $slug)
  33. ->orWhere('id', $slug);
  34. })
  35. ->where('dist_id', getDistId())
  36. ->firstOrFail();
  37. if (!$category) {
  38. abort('404');
  39. }
  40. $categoryIds = [$category->id];
  41. if ($category) {
  42. //找下一级分类
  43. $subCategories = DistProductCategory::where('parent_id', $category->id)->get();
  44. foreach ($subCategories as $subCategory) {
  45. $categoryIds[] = $subCategory->id;
  46. }
  47. }
  48. // 获取分类下的所有产品,排序,然后进行分页
  49. $products = DistProduct::whereIn('category_id', $categoryIds)
  50. ->where('dist_id', getDistId())
  51. ->where('enabled', 1)
  52. ->where('status', 2)
  53. ->with('images') // Eager load images
  54. ->orderBy('order', 'desc') // 按 order 字段降序排序
  55. ->orderBy('id', 'desc') // 按 id 降序排序
  56. ->paginate(12);
  57. // 创建分页数据结构
  58. $paginator = [
  59. 'previous_page' => $products->previousPageUrl() ? true : false, // 是否有上一页
  60. 'previous_page_url' => $products->previousPageUrl(), // 上一页的 URL
  61. 'next_page' => $products->nextPageUrl() ? true : false, // 是否有下一页
  62. 'next_page_url' => $products->nextPageUrl(), // 下一页的 URL
  63. 'current_page' => $products->currentPage(), // 当前页
  64. 'total_pages' => $products->lastPage(), // 总页数
  65. 'pages' => range(1, $products->lastPage()), // 页码数组
  66. 'page_url' => array_combine(
  67. range(1, $products->lastPage()),
  68. array_map(fn($page) => $products->url($page), range(1, $products->lastPage()))
  69. ), // 每页的 URL
  70. ];
  71. // 构建导航数据 开始
  72. $breadcrumbs = [
  73. [
  74. 'url' => '/',
  75. 'name' => 'Home',
  76. ]
  77. ];
  78. $breadcrumbs[] = [
  79. 'url' => '#',
  80. 'name' => $category->name,
  81. ];
  82. // 构建缓存键
  83. $cacheKey = "product_category_{$category->id}_page_{$products->currentPage()}";
  84. // 渲染模板并传递数据
  85. return $this->liquidRenderer->render('products_categories.liquid', [
  86. 'category' => $category, // 分类名称
  87. 'products' => $products, // 分类下的产品
  88. 'paginator' => $paginator, // 分页信息
  89. 'breadcrumbs' => $breadcrumbs,
  90. ], $cacheKey);
  91. }
  92. /**
  93. * 产品详情
  94. * Display the specified product.
  95. *
  96. * @param int $id
  97. * @return \Illuminate\Http\Response
  98. */
  99. public function detail($id)
  100. {
  101. $product = DistProduct::getProduct($id);
  102. if(!$product)
  103. {
  104. $product = DistProduct::getProductSlug($id);
  105. if(!$product)
  106. {
  107. abort('404');
  108. }
  109. }
  110. // 获取改产品分类下的相关产品,不包当前产品,限制条数 limit 4
  111. $relatedProducts = DistProduct::where('category_id', $product->category_id)
  112. ->where('dist_id', getDistId())
  113. ->where('enabled', 1)
  114. ->where('status', 2)
  115. ->where('id', '<>', $product->id)
  116. ->with('images') // Eager load images
  117. ->orderBy('order', 'desc') // 按 order 字段降序排序
  118. ->orderBy('id', 'desc') // 按 id 降序排序
  119. ->limit(4)
  120. ->get();
  121. // 构建导航数据 开始
  122. $category=$product->distProductCategory;
  123. $categoryUrl = $category->slug ? "/products/categories/{$category->slug}" : "/products/categories/{$category->id}";
  124. $breadcrumbs = [
  125. [
  126. 'url' => '/',
  127. 'name' => 'Home',
  128. ]
  129. ];
  130. $breadcrumbs[] = [
  131. 'url' => $categoryUrl,
  132. 'name' => $category->name,
  133. ];
  134. $breadcrumbs[] = [
  135. 'url' => '#',
  136. 'name' => $product->title,
  137. ];
  138. //能过 seo_keywords 查找相有相同 seo_keywords的产品, seo_keywords 可能是多个,用逗号分隔
  139. $seo_keywords = $product->seo_keywords;
  140. if($seo_keywords) {
  141. $seo_keywords_array = explode(',', $seo_keywords);
  142. }
  143. else {
  144. $seo_keywords_array = [];
  145. }
  146. $relatedPages= [];
  147. if(!empty($seo_keywords_array))
  148. {
  149. $seo_keywords_array = array_map('trim', $seo_keywords_array);
  150. $seo_keywords_array = array_unique($seo_keywords_array);
  151. // 构建查询条件
  152. $query = SitePage::where('dist_id', getDistId())
  153. ->where('status', 1);
  154. // 为每个关键词添加查询条件
  155. $query->where(function($q) use ($seo_keywords_array) {
  156. foreach ($seo_keywords_array as $keyword) {
  157. $q->orWhere(function($subQ) use ($keyword) {
  158. $subQ->where('seo_keywords', 'LIKE', $keyword)
  159. ->orWhere('seo_keywords', 'LIKE', $keyword . ',%')
  160. ->orWhere('seo_keywords', 'LIKE', '%,' . $keyword)
  161. ->orWhere('seo_keywords', 'LIKE', '%,' . $keyword . ',%');
  162. });
  163. }
  164. });
  165. // 获取相关产品
  166. $relatedPages = $query->orderBy('id', 'desc')
  167. ->limit(10)
  168. ->get();
  169. }
  170. // 渲染模板并传递数据
  171. return $this->liquidRenderer->render('products_detail.liquid',
  172. [
  173. 'product' => $product,
  174. 'relatedProducts' => $relatedProducts,
  175. 'breadcrumbs' => $breadcrumbs,
  176. 'relatedPages' => $relatedPages,
  177. ]);
  178. }
  179. }