Sfoglia il codice sorgente

1. 修改 Goods 控制器中的 Add 与 Update 方法
2. 给 Add 与 Update 方法添加表单验证

shizhongqi 1 anno fa
parent
commit
1d424d2df2

+ 19 - 4
app-hd/controllers/GoodsController.php

@@ -57,7 +57,14 @@ class GoodsController extends BaseController
     //添加商品 ssh 2019.12.7
     public function actionAdd()
     {
-        $data = Yii::$app->request->post();
+        $form = new \hd\models\goods\AddForm();
+        $form->load(Yii::$app->request->post(), '');
+        if (!$form->validateForm()) {
+            return;
+        }
+        
+        //$data = Yii::$app->request->post();
+        $data = $form->attributes;
         $data['sjId'] = $this->sjId;
         $data['mainId'] = $this->mainId;
         $data['shopId'] = $this->shopId ?? 0;
@@ -156,7 +163,7 @@ class GoodsController extends BaseController
     //获取商品详情 ssh 2019.12.7
     public function actionDetail()
     {
-        $id = Yii::$app->request->get('id');
+        $id = intval(Yii::$app->request->get('id'));
         $goods = GoodsClass::getGoodsInfo($id);
         GoodsClass::valid($goods, $this->mainId);
         util::success($goods);
@@ -165,8 +172,14 @@ class GoodsController extends BaseController
     //更新商品 ssh 2019.12.7
     public function actionUpdate()
     {
-        $data = Yii::$app->request->post();
-        $id = isset($data['id']) ? $data['id'] : 0;
+        $form = new \hd\models\goods\UpdateForm();
+        $form->load(Yii::$app->request->post(), '');
+        if (!$form->validateForm()) {
+            return;
+        }
+        
+        $data = $form->attributes;
+        $id = $data['id'];
         $info = GoodsService::getById($id);
         GoodsService::valid($info, $this->mainId);
         $data['sjId'] = $this->sjId;
@@ -187,6 +200,8 @@ class GoodsController extends BaseController
             $transaction->commit();
             util::complete();
         } catch (\Exception $e) {
+            // 记录错误日志
+            Yii::error('商品更新失败:' . $e->getMessage(), 'goods.update'); //. "\n" . $e->getTraceAsString()
             $transaction->rollBack();
             util::fail();
         }

+ 1 - 1
app-hd/controllers/OrderController.php

@@ -505,7 +505,7 @@ class OrderController extends BaseController
         $post['hdId'] = $hdId;
         $post['hdName'] = $hdName;
 
-        $post['customId'] = $customId;
+        //$post['customId'] = $customId;
         $customName = $custom->name ?? '';
         $post['customName'] = $customName;
         $post['customNamePy'] = stringUtil::py($customName);

+ 0 - 1
app-hd/models/.gitkeep

@@ -1 +0,0 @@
-*

+ 27 - 0
app-hd/models/BaseForm.php

@@ -0,0 +1,27 @@
+<?php
+namespace hd\models;
+
+use yii\base\Model;
+use common\components\util;
+
+/**
+ * 管理员表单基类
+ */
+class BaseForm extends Model
+{
+    /**
+     * 验证表单数据并返回结果
+     *
+     * @return bool 验证是否通过
+     */
+    public function validateForm()
+    {
+        if (!$this->validate()) {
+            $errors = $this->getFirstErrors();
+            $message = reset($errors);
+            util::fail($message);
+            return false;
+        }
+        return true;
+    }
+}

+ 161 - 0
app-hd/models/goods/AddForm.php

@@ -0,0 +1,161 @@
+<?php
+
+namespace hd\models\goods;
+
+use hd\models\BaseForm;
+use yii\validators\RequiredValidator;
+
+/**
+ * 商品添加表单模型
+ */
+class AddForm extends BaseForm
+{
+    /**
+     * 商品名称
+     * @var string
+     */
+    public $name;
+
+    /**
+     * 商品分类ID
+     * @var int
+     */
+    public $catId;
+
+    /**
+     * 商品单价
+     * @var float
+     */
+    public $price;
+
+    /**
+     * 价格类型
+     * @var int
+     */
+    public $priceType;
+
+    /**
+     * 历史销量
+     * @var int
+     */
+    public $sold;
+
+    /**
+     * 商品种类ID
+     * @var int
+     */
+    public $kindId;
+
+    /**
+     * 商品种类名称
+     * @var string
+     */
+    public $kindName;
+
+    /**
+     * 花朵数量
+     * @var int
+     */
+    public $flowerNum;
+
+    /**
+     * 商品图片
+     * @var array
+     */
+    public $shopImg;
+
+    /**
+     * 商品封面图
+     * @var string
+     */
+    public $cover;
+
+    /**
+     * 商品库存
+     * @var int
+     */
+    public $stock;
+
+    /**
+     * 商品SPU编码
+     * @var string
+     */
+    public $spu;
+
+    /**
+     * 商品分类ID
+     * @var array
+     */
+    public $catIds;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rules()
+    {
+        return [
+            // 必填字段验证
+            [['name'], 'required', 'message' => '请填写商品名称'],
+            [['priceType'], 'required', 'message' => '请选择价格类型'],
+            [['catIds'], 'required', 'message' => '请选择商品分类'],
+
+            ['price', 'default', 'value' => 0],
+            ['flowerNum', 'default', 'value' => 0],
+            ['sold', 'default', 'value' => 0],
+            ['catIds', 'default', 'value' => []],
+            
+            // 数据类型验证
+            [['name', 'kindName', 'cover', 'spu'], 'string'],
+            [['catId', 'kindId', 'flowerNum', 'stock'], 'integer'],
+            ['priceType', 'in', 'range' => [0, 1]],
+            [['price'], 'number', 'min' => 0, 'message' => '商品价格必须大于或等于0'],
+            ['flowerNum', 'number', 'min' => 0, 'message' => '花朵数量必须大于或等于0'],
+            ['sold', 'integer', 'min' => 0, 'message' => '已售数量必须大于或等于0'],
+
+            // 添加条件验证
+//            ['price', 'required', 'message' => '请填写商品价格', 'when' => function($model) {
+//                 return isset($_POST['priceType']) && $_POST['priceType'] == '1';
+//            }],
+            
+            // 数组类型验证
+            [['shopImg'], 'validateShopImg'],
+            
+            // 其他业务规则验证
+            //[['num'], 'number', 'min' => 1, 'message' => '商品数量必须大于0'],
+            [['flowerNum'], 'number', 'min' => 0, 'message' => '花朵数量必须大于或等于0'],
+        ];
+    }
+
+    /**
+     * 验证商品图片
+     * @param string $attribute 属性名
+     * @param array $params 参数
+     */
+    public function validateShopImg($attribute, $params)
+    {
+        if (!empty($this->$attribute) && !is_array($this->$attribute)) {
+            $this->addError($attribute, '商品图片格式不正确');
+        }
+    }
+
+    /**
+     * 获取属性标签
+     * @return array
+     */
+    public function attributeLabels()
+    {
+        return [
+            'name' => '商品名称',
+            'catId' => '商品分类',
+            'price' => '商品价格',
+            //'num' => '商品数量',
+            'kindId' => '商品种类ID',
+            'kindName' => '商品种类名称',
+            'flowerNum' => '花朵数量',
+            'shopImg' => '商品图片',
+            'cover' => '商品封面图',
+            'stock' => '商品库存',
+            'spu' => '商品编码',
+        ];
+    }
+} 

+ 221 - 0
app-hd/models/goods/UpdateForm.php

@@ -0,0 +1,221 @@
+<?php
+
+namespace hd\models\goods;
+
+use hd\models\BaseForm;
+
+/**
+ * 商品更新表单模型
+ */
+class UpdateForm extends BaseForm
+{
+    /**
+     * 商品ID
+     * @var int
+     */
+    public $id;
+
+    /**
+     * 商品名称
+     * @var string
+     */
+    public $name;
+
+    /**
+     * 商品价格
+     * @var float
+     */
+    public $price;
+
+    /**
+     * 价格类型
+     * @var int
+     */
+    public $priceType;
+
+    /**
+     * 已售数量
+     * @var int
+     */
+    public $sold;
+
+    /**
+     * 花朵数量
+     * @var int
+     */
+    public $flowerNum;
+
+    /**
+     * 自动涨价
+     * @var int
+     */
+    public $autoRise;
+
+    /**
+     * 商品图片
+     * @var array
+     */
+    public $shopImg;
+
+    /**
+     * 商品封面图
+     * @var string
+     */
+    public $cover;
+
+    /**
+     * 库存设置
+     * @var int
+     */
+    public $stockSet;
+
+    /**
+     * 商品库存
+     * @var int
+     */
+    public $stock;
+
+    /**
+     * 商品分类ID列表
+     * @var array
+     */
+    public $categoryIdList;
+
+    /**
+     * 商品状态
+     * @var int
+     */
+    public $status;
+
+    /**
+     * 删除状态
+     * @var int
+     */
+    public $delStatus;
+
+    /**
+     * 商品子项数量
+     * @var int
+     */
+    public $setItemNum;
+
+    /**
+     * 商品子项列表
+     * @var string
+     */
+    public $itemList;
+
+    /**
+     * 是否需要发货
+     * @var int
+     */
+    public $needSend;
+
+    /**
+     * 运费类型
+     * @var int
+     */
+    public $freightType;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rules()
+    {
+        return [
+            // 必填字段验证
+            [['id'], 'required', 'message' => '商品ID不能为空'],
+            [['name'], 'required', 'message' => '请填写商品名称'],
+            [['categoryIdList'], 'required', 'message' => '请选择商品分类'],
+
+            // 数据类型验证
+            [['id', 'status', 'delStatus', 'setItemNum'], 'integer'],
+            [['name', 'cover', 'itemList'], 'string'],
+            [['price'], 'number', 'min' => 0, 'message' => '商品价格必须大于或等于0'],
+            [['sold'], 'integer', 'min' => 0, 'message' => '已售数量必须大于或等于0'],
+            [['flowerNum'], 'integer', 'min' => 0, 'message' => '花朵数量必须大于或等于0'],
+            [['autoRise'], 'in', 'range' => [0, 1]],
+            [['stockSet'], 'in', 'range' => [0, 1]],
+            [['stock'], 'integer', 'min' => 0, 'message' => '库存不能小于0'],
+            [['priceType'], 'in', 'range' => [0, 1]],
+            [['delStatus'], 'in', 'range' => [0, 1]],
+            [['needSend'], 'in', 'range' => [0, 1]],
+            [['freightType'], 'in', 'range' => [0, 1]],
+            [['status'], 'in', 'range' => [0, 1]],
+
+            // 数组类型验证
+            [['shopImg'], 'validateShopImg'],
+            [['categoryIdList'], 'validateCategoryIdList'],
+            [['itemList'], 'validateItemList'],
+
+            // 默认值设置
+            ['flowerNum', 'default', 'value' => 0],
+            ['status', 'default', 'value' => 1],
+            ['delStatus', 'default', 'value' => 0],
+            ['categoryIdList', 'default', 'value' => []],
+            ['stock', 'default', 'value' => 0],
+        ];
+    }
+
+    /**
+     * 验证商品图片
+     * @param string $attribute 属性名
+     * @param array $params 参数
+     */
+    public function validateShopImg($attribute, $params)
+    {
+        if (!empty($this->$attribute) && !is_array($this->$attribute)) {
+            $this->addError($attribute, '商品图片格式不正确');
+        }
+    }
+
+    /**
+     * 验证分类ID列表
+     * @param string $attribute 属性名
+     * @param array $params 参数
+     */
+    public function validateCategoryIdList($attribute, $params)
+    {
+        if (!empty($this->$attribute) && !is_array($this->$attribute)) {
+            $this->addError($attribute, '商品分类格式不正确');
+        }
+    }
+
+    /**
+     * 验证商品子项列表
+     * @param string $attribute 属性名
+     * @param array $params 参数
+     */
+    public function validateItemList($attribute, $params)
+    {
+        if (!empty($this->$attribute)) {
+            $itemArr = json_decode($this->$attribute, true);
+            if (json_last_error() !== JSON_ERROR_NONE) {
+                $this->addError($attribute, '商品子项格式不正确');
+            }
+        }
+    }
+
+    /**
+     * 获取属性标签
+     * @return array
+     */
+    public function attributeLabels()
+    {
+        return [
+            'id' => '商品ID',
+            'name' => '商品名称',
+            'price' => '商品价格',
+            'priceType' => '价格类型',
+            'flowerNum' => '花朵数量',
+            'shopImg' => '商品图片',
+            'cover' => '商品封面图',
+            'stock' => '商品库存',
+            'categoryIdList' => '商品分类',
+            'status' => '商品状态',
+            'delStatus' => '删除状态',
+            'setItemNum' => '商品子项数量',
+            'itemList' => '商品子项列表',
+        ];
+    }
+}

+ 14 - 1
biz-hd/goods/classes/GoodsClass.php

@@ -385,6 +385,14 @@ class GoodsClass extends BaseClass
             }
             $val['belongCategory'] = $belongCategory;
             $shortCover = $val['cover'] ?? '';
+            // 兼容 cover 保存的是数字(表示第几张图片)
+            if (intval($shortCover) > 0) {
+                $shopImg = isset($val['shortImgList']) ? $val['shortImgList'] : [];
+                $idx = intval($shortCover) - 1;
+                if (isset($shopImg[$idx])) {
+                    $shortCover = $shopImg[$idx];
+                }
+            }
             $val['shortCover'] = $shortCover;
             $val['cover'] = imgUtil::groupImg($shortCover);
             $val['smallCover'] = imgUtil::groupImg($shortCover) . "?x-oss-process=image/resize,m_fill,h_700,w_700";
@@ -594,7 +602,12 @@ class GoodsClass extends BaseClass
         }
         GoodsCategoryClass::batchAdd($addCategory);
         CategoryClass::counters(['goodsNum' => 1], ['id' => $categoryIdList]);
-        $data['cover'] = $data['shopImg'][0] ?? '';
+        // 兼容 cover 参数是数字
+        if (intval($data['cover']) > 0) {
+            // 如果是大于0的整数,说明是图片序号
+        } else {
+            $data['cover'] = $data['shopImg'][0] ?? '';
+        }
         $data['shopImg'] = json_encode($data['shopImg']);
         $data['py'] = $py;