Browse Source

Product标题支持多分类

moshaorui 6 days ago
parent
commit
dd34c33187

+ 15 - 27
app/Http/Controllers/ProductController.php

@@ -30,39 +30,27 @@ class ProductController extends Controller
 
     public function category($slug)
     {
+        // $products = DistProduct::paginate(10); // 每页显示10个产品
+//        return $this->liquidRenderer->render('products_categories.liquid', ['products' => $products]);
+
         // 获取分类信息
         // 获取分类信息,并限定 dist_id
-        $slugs = [];
-        if (strpos($slug, ',') !== false) {
-            // 包含逗号
-            $slugs = explode(',', $slug);
-        } else {
-            // 不包含逗号
-            $slugs = [$slug];
-        }
-
-        $categoryIds = [];
-        foreach ($slugs as $slug) {
-            $category = DistProductCategory::where(function ($query) use ($slug) {
-                $query->where('slug', $slug)
-                    ->orWhere('id', $slug);
-            })
-                ->where('dist_id', getDistId())
-                ->firstOrFail();
-            $categoryIds[] = $category->id;
-        }
+        $category = DistProductCategory::where(function ($query) use ($slug) {
+            $query->where('slug', $slug)
+                ->orWhere('id', $slug);
+        })
+            ->where('dist_id', getDistId())
+            ->firstOrFail();
 
-        if (empty($categoryIds)) {
+        if (!$category) {
             abort('404');
         }
-
-        if ($categoryIds) {
+        $categoryIds = [$category->id];
+        if ($category) {
             //找下一级分类
-            foreach ($categoryIds as $id) {
-                $subCategories = DistProductCategory::where('parent_id', $id)->get();
-                foreach ($subCategories as $subCategory) {
-                    $categoryIds[] = $subCategory->id;
-                }
+            $subCategories = DistProductCategory::where('parent_id', $category->id)->get();
+            foreach ($subCategories as $subCategory) {
+                $categoryIds[] = $subCategory->id;
             }
         }
 

+ 30 - 0
app/Models/DistProduct.php

@@ -75,4 +75,34 @@ class DistProduct extends Model
         return $query->get();
     }
 
+    public static function getProductsByCategoryIds($categoryIds = null, $limit = null)
+    {
+
+
+        $query = self::query();
+
+        $query->where('enabled', 1);
+
+        $query->where('dist_id', getDistId());
+
+        // 如果提供了分类 ID,添加过滤条件
+        if ($categoryIds) {
+            $query->whereIn('category_id', $categoryIds);
+        }
+
+        // 包括关联数据(图片和分类)
+        $query->with(['images', 'distProductCategory']);
+
+        // 添加排序逻辑:按 is_pinned 降序,再按 order 降序,再按 id 降序
+        $query->orderBy('order', 'desc')
+            ->orderBy('id', 'desc');
+        // 如果提供了限制数量,限制查询结果
+        if ($limit) {
+            return $query->limit($limit)->get();
+        }
+
+        // 默认返回所有结果
+        return $query->get();
+    }
+
 }

+ 21 - 0
app/Services/LiquidTags/LiquidTagProduct.php

@@ -30,6 +30,7 @@ class LiquidTagProduct extends AbstractBlock
         $this->quantity = 0;
         $this->limit = 10;
         $this->categoryId = 0;
+        $this->categoryIds = '';
         $this->templateFile = null;
 
         // 正则表达式解析传入的参数
@@ -57,6 +58,9 @@ class LiquidTagProduct extends AbstractBlock
                     case 'category_id':
                         $this->categoryId = (int)$value;
                         break;
+                    case 'category_ids':
+                        $this->categoryIds = $value;
+                        break;
                     case 'template':
                         $this->templateFile = $value;
                         break;
@@ -72,6 +76,9 @@ class LiquidTagProduct extends AbstractBlock
             return $this->renderList();
         } elseif ($this->mode === 'single') {
             return $this->renderSingle();
+        } elseif ($this->mode === 'lists') {
+            //支持多分类
+            return $this->renderLists();
         }
 
         // 如果模式不正确,返回空字符串
@@ -91,6 +98,20 @@ class LiquidTagProduct extends AbstractBlock
         return '';
     }
 
+    private function renderLists()
+    {
+        $categoryIds = explode(',', $this->categoryIds);
+        // 从数据库获取产品列表
+        $products = DistProduct::getProductsByCategoryIds($categoryIds, $this->limit);
+
+        if ($products->count() > 0) {
+            return $this->renderTemplate(['products' => $products->toArray()]);
+        }
+
+        // 如果没有产品,返回空字符串
+        return '';
+    }
+
     private function renderSingle()
     {
         // 从数据库获取单个产品信息