|
|
@@ -452,6 +452,7 @@ class HomePageModuleClass
|
|
|
'value' => strval($saved['value'] ?? ''),
|
|
|
'sort' => intval($saved['sort'] ?? self::SORT_PRODUCT),
|
|
|
'layoutCols' => self::normalizeLayoutCols($saved['layoutCols'] ?? null),
|
|
|
+ 'displayCount' => intval($saved['displayCount'] ?? 0),
|
|
|
];
|
|
|
}
|
|
|
|
|
|
@@ -464,6 +465,7 @@ class HomePageModuleClass
|
|
|
$value = trim(strval($data['value'] ?? ''));
|
|
|
$sort = intval($data['sort'] ?? self::SORT_PRODUCT);
|
|
|
$layoutCols = intval($data['layoutCols'] ?? self::DEFAULT_LAYOUT_COLS);
|
|
|
+ $displayCount = self::normalizeDisplayCount($data['displayCount'] ?? 0);
|
|
|
if ($name === '') {
|
|
|
util::fail('请输入首页展示名称');
|
|
|
}
|
|
|
@@ -488,6 +490,7 @@ class HomePageModuleClass
|
|
|
'value' => $value,
|
|
|
'sort' => $sort,
|
|
|
'layoutCols' => $layoutCols,
|
|
|
+ 'displayCount' => $displayCount,
|
|
|
]);
|
|
|
HomePageConfigClass::updateModuleEnabled($mainId, $moduleKey, !empty($data['enabled']) ? 1 : 0);
|
|
|
return true;
|
|
|
@@ -517,6 +520,21 @@ class HomePageModuleClass
|
|
|
* @return array [{id,name,price,stock,cover,coverUrl,sold}]
|
|
|
*/
|
|
|
public static function resolveDisplayGoods($mainId, $type, $value, $sort, $limit = self::DISPLAY_GOODS_LIMIT)
|
|
|
+ {
|
|
|
+ $paged = self::resolveDisplayGoodsPaged($mainId, $type, $value, $sort, 1, $limit);
|
|
|
+ return $paged['list'];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 匹配关联配置下的全部商品行(未截断、未格式化封面URL),供分页与总数统计复用
|
|
|
+ *
|
|
|
+ * @param int $mainId
|
|
|
+ * @param int $type
|
|
|
+ * @param string $value
|
|
|
+ * @param int $sort
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public static function matchGoodsRows($mainId, $type, $value, $sort)
|
|
|
{
|
|
|
$mainId = intval($mainId);
|
|
|
$type = intval($type);
|
|
|
@@ -588,10 +606,17 @@ class HomePageModuleClass
|
|
|
$rows = $ordered;
|
|
|
}
|
|
|
|
|
|
- if ($limit > 0 && count($rows) > $limit) {
|
|
|
- $rows = array_slice($rows, 0, $limit);
|
|
|
- }
|
|
|
+ return $rows;
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 将原始商品行格式化为首页/列表展示结构(含 coverUrl)
|
|
|
+ *
|
|
|
+ * @param array $rows
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public static function formatGoodsRows($rows)
|
|
|
+ {
|
|
|
$list = [];
|
|
|
foreach ($rows as $row) {
|
|
|
$cover = strval($row['cover'] ?? '');
|
|
|
@@ -609,6 +634,65 @@ class HomePageModuleClass
|
|
|
return $list;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 分页解析关联配置下的商品列表,返回 list + total(真实总数,不受首页展示上限限制)
|
|
|
+ *
|
|
|
+ * @param int $mainId
|
|
|
+ * @param int $type
|
|
|
+ * @param string $value
|
|
|
+ * @param int $sort
|
|
|
+ * @param int $page
|
|
|
+ * @param int $pageSize 传 0 表示不分页返回全部
|
|
|
+ * @return array {list, total}
|
|
|
+ */
|
|
|
+ public static function resolveDisplayGoodsPaged($mainId, $type, $value, $sort, $page = 1, $pageSize = self::DISPLAY_GOODS_LIMIT)
|
|
|
+ {
|
|
|
+ $rows = self::matchGoodsRows($mainId, $type, $value, $sort);
|
|
|
+ $total = count($rows);
|
|
|
+ $page = max(1, intval($page));
|
|
|
+ $pageSize = intval($pageSize);
|
|
|
+ if ($pageSize > 0) {
|
|
|
+ $rows = array_slice($rows, ($page - 1) * $pageSize, $pageSize);
|
|
|
+ }
|
|
|
+ return [
|
|
|
+ 'list' => self::formatGoodsRows($rows),
|
|
|
+ 'total' => $total,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 规范化首页商品展示数量:0=全部,1-10=具体数量
|
|
|
+ *
|
|
|
+ * @param mixed $value
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ public static function normalizeDisplayCount($value)
|
|
|
+ {
|
|
|
+ if ($value === '' || $value === null || intval($value) === 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ $count = intval($value);
|
|
|
+ if ($count < 1 || $count > 10) {
|
|
|
+ util::fail('商品展示数量范围为1-10,留空表示全部');
|
|
|
+ }
|
|
|
+ return $count;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据 displayCount 计算首页实际截断条数:1-10 用配置值,0(全部)回退默认上限
|
|
|
+ *
|
|
|
+ * @param mixed $displayCount
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ public static function resolveHomeDisplayLimit($displayCount)
|
|
|
+ {
|
|
|
+ $count = intval($displayCount);
|
|
|
+ if ($count >= 1 && $count <= 10) {
|
|
|
+ return $count;
|
|
|
+ }
|
|
|
+ return self::DISPLAY_GOODS_LIMIT;
|
|
|
+ }
|
|
|
+
|
|
|
public static function sectionSuffix($moduleKey)
|
|
|
{
|
|
|
$map = [
|
|
|
@@ -630,7 +714,7 @@ class HomePageModuleClass
|
|
|
'title' => strval($saved['title'] ?? ''),
|
|
|
'subtitle' => strval($saved['subtitle'] ?? ''),
|
|
|
'showCountdown' => !empty($saved['showCountdown']) ? 1 : 0,
|
|
|
- 'expandHome' => !empty($saved['expandHome']) ? 1 : 0,
|
|
|
+ 'displayCount' => intval($saved['displayCount'] ?? 0),
|
|
|
'startTime' => intval($saved['startTime'] ?? 0),
|
|
|
'endTime' => intval($saved['endTime'] ?? 0),
|
|
|
'desc' => strval($saved['desc'] ?? ''),
|
|
|
@@ -646,6 +730,7 @@ class HomePageModuleClass
|
|
|
$startTime = intval($data['startTime'] ?? 0);
|
|
|
$endTime = intval($data['endTime'] ?? 0);
|
|
|
$layoutCols = intval($data['layoutCols'] ?? self::DEFAULT_LAYOUT_COLS);
|
|
|
+ $displayCount = self::normalizeDisplayCount($data['displayCount'] ?? 0);
|
|
|
if ($title === '') {
|
|
|
util::fail('请输入活动标题');
|
|
|
}
|
|
|
@@ -677,7 +762,7 @@ class HomePageModuleClass
|
|
|
'title' => $title,
|
|
|
'subtitle' => $subtitle,
|
|
|
'showCountdown' => !empty($data['showCountdown']) ? 1 : 0,
|
|
|
- 'expandHome' => !empty($data['expandHome']) ? 1 : 0,
|
|
|
+ 'displayCount' => $displayCount,
|
|
|
'startTime' => $startTime,
|
|
|
'endTime' => $endTime,
|
|
|
'desc' => $desc,
|