正在显示
26 个修改的文件
包含
4792 行增加
和
26 行删除
1 | +<?php | ||
2 | + | ||
3 | +namespace app\admin\controller\activity_goods; | ||
4 | + | ||
5 | +use app\admin\model\litestore\Litestoregoodsspec; | ||
6 | +use app\common\controller\Backend; | ||
7 | +use app\admin\model\litestore\Litestorespec as SpecModel; | ||
8 | +use app\admin\model\litestore\Litestorespecvalue as SpecValueModel; | ||
9 | +use PhpOffice\PhpSpreadsheet\Cell\Coordinate; | ||
10 | +use PhpOffice\PhpSpreadsheet\Reader\Csv; | ||
11 | +use PhpOffice\PhpSpreadsheet\Reader\Xls; | ||
12 | +use PhpOffice\PhpSpreadsheet\Reader\Xlsx; | ||
13 | +use think\Db; | ||
14 | +use think\exception\PDOException; | ||
15 | + | ||
16 | + | ||
17 | +/** | ||
18 | + * | ||
19 | + * | ||
20 | + * @icon fa fa-circle-o | ||
21 | + */ | ||
22 | +class ImportGoods extends Backend | ||
23 | +{ | ||
24 | + private $SpecModel; | ||
25 | + private $SpecValueModel; | ||
26 | + /** | ||
27 | + * Litestoregoods模型对象 | ||
28 | + * @var \app\admin\model\litestore\Litestoregoods | ||
29 | + */ | ||
30 | + protected $model = null; | ||
31 | + protected $spec_model = null; | ||
32 | +// protected $searchFields = 'category.name'; | ||
33 | + | ||
34 | + public function _initialize() | ||
35 | + { | ||
36 | + parent::_initialize(); | ||
37 | + $this->SpecModel = new SpecModel; | ||
38 | + $this->SpecValueModel = new SpecValueModel; | ||
39 | + | ||
40 | + $this->model = new \app\admin\model\litestore\Litestoregoods; | ||
41 | + $this->spec_model = new \app\admin\model\litestore\Litestoregoodsspec(); | ||
42 | + $this->view->assign("specTypeList", $this->model->getSpecTypeList()); | ||
43 | + $this->view->assign("deductStockTypeList", $this->model->getDeductStockTypeList()); | ||
44 | + $this->view->assign("goodsStatusList", $this->model->getGoodsStatusList()); | ||
45 | + $this->view->assign("isDeleteList", $this->model->getIsDeleteList()); | ||
46 | + $this->view->assign("makeforList", $this->model->getMakeforList()); | ||
47 | + $this->view->assign("isIndexList", $this->model->getIsIndexList()); | ||
48 | + | ||
49 | + $this->view->assign("spec_attr", ''); | ||
50 | + $this->view->assign("spec_list", ''); | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 | ||
55 | + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 | ||
56 | + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 | ||
57 | + */ | ||
58 | + | ||
59 | + | ||
60 | + /** | ||
61 | + * 查看 | ||
62 | + */ | ||
63 | + public function index() | ||
64 | + { | ||
65 | + //当前是否为关联查询 | ||
66 | + $this->relationSearch = true; | ||
67 | + //设置过滤方法 | ||
68 | + $this->request->filter(['strip_tags']); | ||
69 | + if ($this->request->isAjax()) { | ||
70 | + //如果发送的来源是Selectpage,则转发到Selectpage | ||
71 | + if ($this->request->request('keyField')) { | ||
72 | + return $this->selectpage(); | ||
73 | + } | ||
74 | + list($where, $sort, $order, $offset, $limit) = $this->buildparams("category.name",true); | ||
75 | + $total = $this->model | ||
76 | + ->with(['category', 'activity']) | ||
77 | + ->where($where) | ||
78 | + ->where('activity_id',3) | ||
79 | + ->order($sort, $order) | ||
80 | + ->count(); | ||
81 | + | ||
82 | + $list = $this->model | ||
83 | + ->with(['category', 'activity']) | ||
84 | + ->where($where) | ||
85 | + ->where('activity_id',3) | ||
86 | + ->order($sort, $order) | ||
87 | + ->limit($offset, $limit) | ||
88 | + ->select(); | ||
89 | + | ||
90 | + foreach ($list as $row) { | ||
91 | + | ||
92 | + $row->getRelation('category')->visible(['name']); | ||
93 | + $row->getRelation('activity')->visible(['name']); | ||
94 | +// $row->getRelation('freight')->visible(['name']); | ||
95 | + $row->stock_num = Litestoregoodsspec::where('goods_id', $row['goods_id'])->sum('stock_num'); | ||
96 | + } | ||
97 | + $list = collection($list)->toArray(); | ||
98 | + $result = array("total" => $total, "rows" => $list); | ||
99 | + | ||
100 | + return json($result); | ||
101 | + } | ||
102 | + $this->assign('template', $this->request->domain() . '/static/template/商品导入模板.xlsx'); | ||
103 | + | ||
104 | + return $this->view->fetch(); | ||
105 | + } | ||
106 | + | ||
107 | + public function addSpec($spec_name, $spec_value) | ||
108 | + { | ||
109 | + // 判断规格组是否存在 | ||
110 | + if (!$specId = $this->SpecModel->getSpecIdByName($spec_name)) { | ||
111 | + // 新增规格组and规则值 | ||
112 | + if ($this->SpecModel->add($spec_name) | ||
113 | + && $this->SpecValueModel->add($this->SpecModel['id'], $spec_value)) | ||
114 | + return $this->success('', '', [ | ||
115 | + 'spec_id' => (int)$this->SpecModel['id'], | ||
116 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
117 | + ]); | ||
118 | + return $this->error(); | ||
119 | + } | ||
120 | + //return ; | ||
121 | + // 判断规格值是否存在 | ||
122 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($specId, $spec_value)) { | ||
123 | + return $this->success('', '', [ | ||
124 | + 'spec_id' => (int)$specId, | ||
125 | + 'spec_value_id' => (int)$specValueId, | ||
126 | + ]); | ||
127 | + } | ||
128 | + // 添加规则值 | ||
129 | + if ($this->SpecValueModel->add($specId, $spec_value)) | ||
130 | + return $this->success('', '', [ | ||
131 | + 'spec_id' => (int)$specId, | ||
132 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
133 | + ]); | ||
134 | + return $this->error(); | ||
135 | + } | ||
136 | + | ||
137 | + | ||
138 | + /** | ||
139 | + * 添加规格值 | ||
140 | + */ | ||
141 | + public function addSpecValue($spec_id, $spec_value) | ||
142 | + { | ||
143 | + // 判断规格值是否存在 | ||
144 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($spec_id, $spec_value)) { | ||
145 | + return $this->success('', '', [ | ||
146 | + 'spec_value_id' => (int)$specValueId, | ||
147 | + ]); | ||
148 | + } | ||
149 | + // 添加规则值 | ||
150 | + if ($this->SpecValueModel->add($spec_id, $spec_value)) | ||
151 | + return $this->success('', '', [ | ||
152 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
153 | + ]); | ||
154 | + return $this->error(); | ||
155 | + } | ||
156 | + | ||
157 | + /** | ||
158 | + * 添加 | ||
159 | + */ | ||
160 | + public function add() | ||
161 | + { | ||
162 | + if ($this->request->isPost()) { | ||
163 | + $params = $this->request->post("row/a"); | ||
164 | + if ($params) { | ||
165 | + if ($this->dataLimit && $this->dataLimitFieldAutoFill) { | ||
166 | + $params[$this->dataLimitField] = $this->auth->id; | ||
167 | + } | ||
168 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
169 | + $this->error('请添加规格'); | ||
170 | + } | ||
171 | + try { | ||
172 | + //是否采用模型验证 | ||
173 | + if ($this->modelValidate) { | ||
174 | + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model)); | ||
175 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate; | ||
176 | + $this->model->validate($validate); | ||
177 | + } | ||
178 | + $result = $this->model->allowField(true)->save($params); | ||
179 | + if ($result !== false) { | ||
180 | + //成功之后 存储商品规格 | ||
181 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
182 | + $this->model->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a")); | ||
183 | + $this->success(); | ||
184 | + } else { | ||
185 | + $this->error($this->model->getError()); | ||
186 | + } | ||
187 | + } catch (\think\exception\PDOException $e) { | ||
188 | + $this->error($e->getMessage()); | ||
189 | + } catch (\think\Exception $e) { | ||
190 | + $this->error($e->getMessage()); | ||
191 | + } | ||
192 | + } | ||
193 | + $this->error(__('Parameter %s can not be empty', '')); | ||
194 | + } | ||
195 | + return $this->view->fetch(); | ||
196 | + } | ||
197 | + | ||
198 | + /** | ||
199 | + * 删除 | ||
200 | + */ | ||
201 | + public function del($ids = "") | ||
202 | + { | ||
203 | + if ($ids) { | ||
204 | + $pk = $this->model->getPk(); | ||
205 | + $adminIds = $this->getDataLimitAdminIds(); | ||
206 | + if (is_array($adminIds)) { | ||
207 | + $count = $this->model->where($this->dataLimitField, 'in', $adminIds); | ||
208 | + } | ||
209 | + $list = $this->model->where($pk, 'in', $ids)->select(); | ||
210 | + $count = 0; | ||
211 | + foreach ($list as $k => $v) { | ||
212 | + // 删除商品sku | ||
213 | + $v->removesku(); | ||
214 | + | ||
215 | + $count += $v->delete(); | ||
216 | + } | ||
217 | + if ($count) { | ||
218 | + $this->success(); | ||
219 | + } else { | ||
220 | + $this->error(__('No rows were deleted')); | ||
221 | + } | ||
222 | + } | ||
223 | + $this->error(__('Parameter %s can not be empty', 'ids')); | ||
224 | + } | ||
225 | + | ||
226 | + /** | ||
227 | + * 编辑 | ||
228 | + */ | ||
229 | + public function edit($ids = NULL) | ||
230 | + { | ||
231 | + $row = $this->model->get($ids, ['specRel', 'spec', 'spec_rel.spec']); | ||
232 | + if (!$row) | ||
233 | + $this->error(__('No Results were found')); | ||
234 | + $adminIds = $this->getDataLimitAdminIds(); | ||
235 | + if (is_array($adminIds)) { | ||
236 | + if (!in_array($row[$this->dataLimitField], $adminIds)) { | ||
237 | + $this->error(__('You have no permission')); | ||
238 | + } | ||
239 | + } | ||
240 | + if ($this->request->isPost()) { | ||
241 | + $params = $this->request->post("row/a"); | ||
242 | + if ($params) { | ||
243 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
244 | + $this->error('请添加规格'); | ||
245 | + } | ||
246 | + try { | ||
247 | + //是否采用模型验证 | ||
248 | + if ($this->modelValidate) { | ||
249 | + $name = basename(str_replace('\\', '/', get_class($this->model))); | ||
250 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : true) : $this->modelValidate; | ||
251 | + $row->validate($validate); | ||
252 | + } | ||
253 | + $result = $row->allowField(true)->save($params); | ||
254 | + if ($result !== false) { | ||
255 | + //成功之后 存储商品规格 | ||
256 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
257 | + $row->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a"), true); | ||
258 | + // 删除购物车 | ||
259 | + Db::name('cart')->where('goods_id', $row->goods_id)->delete(); | ||
260 | + //删除我常买 | ||
261 | + Db::name('user_buylist')->where('goods_id', $row->goods_id)->delete(); | ||
262 | + $this->success(); | ||
263 | + } else { | ||
264 | + $this->error($row->getError()); | ||
265 | + } | ||
266 | + } catch (\think\exception\PDOException $e) { | ||
267 | + $this->error($e->getMessage()); | ||
268 | + } catch (\think\Exception $e) { | ||
269 | + $this->error($e->getMessage()); | ||
270 | + } | ||
271 | + } | ||
272 | + $this->error(__('Parameter %s can not be empty', '')); | ||
273 | + } | ||
274 | + // 多规格信息 | ||
275 | + $specData = 'null'; | ||
276 | + if ($row['spec_type'] === '20') { | ||
277 | + $specData = json_encode($this->model->getManySpecData($row['spec_rel'], $row['spec'])); | ||
278 | + } | ||
279 | + $row['specData'] = $specData; | ||
280 | + $this->view->assign("row", $row); | ||
281 | + return $this->view->fetch(); | ||
282 | + } | ||
283 | + | ||
284 | + | ||
285 | + /** | ||
286 | + * 导出 | ||
287 | + */ | ||
288 | + public function export() | ||
289 | + { | ||
290 | + //1.从数据库中导出需要进行要导出的数据 | ||
291 | + $list = Db::name('litestore_goods_spec')->alias('c') | ||
292 | + ->join('fa_litestore_goods g', 'g.goods_id = c.goods_id', 'LEFT') | ||
293 | + ->select(); | ||
294 | + $list = collection($list)->toArray(); | ||
295 | + foreach ($list as &$item) { | ||
296 | + $item['category_name'] = Db::name('litestore_category')->where('id', $item['category_id'])->value('name'); | ||
297 | + if (!empty($item['spec_sku_id'])) { | ||
298 | + $sku_value = explode('_', $item['spec_sku_id']); | ||
299 | + if (count($sku_value) > 1) { | ||
300 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
301 | + $value = Db::name('litestore_spec_value')->where('id', $sku_value[1])->value('spec_value'); | ||
302 | + $item['sku_value'] = $key . '_' . $value; | ||
303 | + } else { | ||
304 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
305 | + $item['sku_value'] = $key; | ||
306 | + } | ||
307 | + } else { | ||
308 | + $item['sku_value'] = ''; | ||
309 | + } | ||
310 | + } | ||
311 | + if (empty($list)) { | ||
312 | + $this->error('没有可导出的数据'); | ||
313 | + } | ||
314 | + //重要补助 | ||
315 | + //2.加载PHPExcle类库 | ||
316 | + vendor('PHPExcel.PHPExcel'); | ||
317 | + //3.实例化PHPExcel类 | ||
318 | + $objPHPExcel = new \PHPExcel(); | ||
319 | + //4.激活当前的sheet表 | ||
320 | + $objPHPExcel->setActiveSheetIndex(0); | ||
321 | + //5.设置表格头(即excel表格的第一行) | ||
322 | + $objPHPExcel->setActiveSheetIndex(0) | ||
323 | + ->setCellValue('A1', '商品ID') | ||
324 | + ->setCellValue('B1', '商品名称') | ||
325 | + ->setCellValue('C1', '搜索关键词') | ||
326 | + ->setCellValue('D1', '分类名称') | ||
327 | + ->setCellValue('E1', '活动名称(新人用户=1,限时秒杀=2,进口商品=4)') | ||
328 | + ->setCellValue('F1', '商品规格(10=单规格,20=多规格)') | ||
329 | + ->setCellValue('G1', '库存') | ||
330 | + ->setCellValue('H1', '商品规格') | ||
331 | + ->setCellValue('I1', '商品原价') | ||
332 | + ->setCellValue('J1', '折扣') | ||
333 | + ->setCellValue('K1', '商品现价') | ||
334 | + ->setCellValue('L1', '已销数量') | ||
335 | + ->setCellValue('M1', '商品状态(10=上架,20=下架)') | ||
336 | + ->setCellValue('N1', '首页展示(0=未展示,1=已展示)') | ||
337 | + ->setCellValue('O1', '导出时间'); | ||
338 | + //设置A列水平居中 | ||
339 | + $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment() | ||
340 | + ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); | ||
341 | + //设置单元格宽度 | ||
342 | + //6.循环刚取出来的数组,将数据逐一添加到excel表格。 | ||
343 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('A')->setWidth(10); | ||
344 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('B')->setWidth(20); | ||
345 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('C')->setWidth(20); | ||
346 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('D')->setWidth(20); | ||
347 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('E')->setWidth(20); | ||
348 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('F')->setWidth(20); | ||
349 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('G')->setWidth(20); | ||
350 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('H')->setWidth(20); | ||
351 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('I')->setWidth(20); | ||
352 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('J')->setWidth(20); | ||
353 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('K')->setWidth(20); | ||
354 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('L')->setWidth(20); | ||
355 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('M')->setWidth(20); | ||
356 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('N')->setWidth(20); | ||
357 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('O')->setWidth(20); | ||
358 | + | ||
359 | + | ||
360 | + for ($i = 0; $i < count($list); $i++) { | ||
361 | + $objPHPExcel->getActiveSheet()->setCellValue('A' . ($i + 2), $list[$i]['goods_id']);//ID | ||
362 | + $objPHPExcel->getActiveSheet()->setCellValue('B' . ($i + 2), $list[$i]['goods_name']);//商品名称 | ||
363 | + $objPHPExcel->getActiveSheet()->setCellValue('C' . ($i + 2), $list[$i]['keywords']);//商品规格 | ||
364 | + $objPHPExcel->getActiveSheet()->setCellValue('D' . ($i + 2), $list[$i]['category_name']);//原价 | ||
365 | + $objPHPExcel->getActiveSheet()->setCellValue('E' . ($i + 2), $list[$i]['activity_id']);//ID | ||
366 | + $objPHPExcel->getActiveSheet()->setCellValue('F' . ($i + 2), $list[$i]['spec_type']);//标签码 | ||
367 | + $objPHPExcel->getActiveSheet()->setCellValue('G' . ($i + 2), $list[$i]['stock_num']);//ID | ||
368 | + $objPHPExcel->getActiveSheet()->setCellValue('H' . ($i + 2), $list[$i]['sku_value']);//ID | ||
369 | + $objPHPExcel->getActiveSheet()->setCellValue('I' . ($i + 2), $list[$i]['line_price']);//ID | ||
370 | + $objPHPExcel->getActiveSheet()->setCellValue('J' . ($i + 2), $list[$i]['discount']);//ID | ||
371 | + $objPHPExcel->getActiveSheet()->setCellValue('K' . ($i + 2), $list[$i]['goods_price']);//ID | ||
372 | + $objPHPExcel->getActiveSheet()->setCellValue('L' . ($i + 2), $list[$i]['goods_sales']);//ID | ||
373 | + $objPHPExcel->getActiveSheet()->setCellValue('M' . ($i + 2), $list[$i]['goods_status']);//ID | ||
374 | + $objPHPExcel->getActiveSheet()->setCellValue('N' . ($i + 2), $list[$i]['is_index']);//标签码 | ||
375 | + $objPHPExcel->getActiveSheet()->setCellValue('O' . ($i + 2), datetime(time()));//标签码 | ||
376 | + } | ||
377 | + ob_end_clean(); | ||
378 | + ob_start(); | ||
379 | + $title = '商品列表'; | ||
380 | + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); | ||
381 | + header('Content-Disposition:attachment;filename="' . $title . '.xlsx"'); | ||
382 | + header('Cache-Control: max-age=0'); | ||
383 | + header('Cache-Control: max-age=1'); | ||
384 | + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past | ||
385 | + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified | ||
386 | + header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 | ||
387 | + header('Pragma: public'); // HTTP/1.0 | ||
388 | + $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); | ||
389 | + $objWriter->save('php://output'); //文件通过浏览器下载 | ||
390 | + exit(); | ||
391 | + } | ||
392 | + | ||
393 | + /** | ||
394 | + *导入 | ||
395 | + * | ||
396 | + * */ | ||
397 | + public function import() | ||
398 | + { | ||
399 | + $file = $this->request->request('file'); | ||
400 | + if (!$file) { | ||
401 | + $this->error(__('Parameter %s can not be empty', 'file')); | ||
402 | + } | ||
403 | + $filePath = ROOT_PATH . DS . 'public' . DS . $file; | ||
404 | + if (!is_file($filePath)) { | ||
405 | + $this->error(__('No results were found')); | ||
406 | + } | ||
407 | + //实例化reader | ||
408 | + $ext = pathinfo($filePath, PATHINFO_EXTENSION); | ||
409 | + if (!in_array($ext, ['csv', 'xls', 'xlsx'])) { | ||
410 | + $this->error(__('Unknown data format')); | ||
411 | + } | ||
412 | + if ($ext === 'csv') { | ||
413 | + $file = fopen($filePath, 'r'); | ||
414 | + $filePath = tempnam(sys_get_temp_dir(), 'import_csv'); | ||
415 | + $fp = fopen($filePath, "w"); | ||
416 | + $n = 0; | ||
417 | + while ($line = fgets($file)) { | ||
418 | + $line = rtrim($line, "\n\r\0"); | ||
419 | + $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']); | ||
420 | + if ($encoding != 'utf-8') { | ||
421 | + $line = mb_convert_encoding($line, 'utf-8', $encoding); | ||
422 | + } | ||
423 | + if ($n == 0 || preg_match('/^".*"$/', $line)) { | ||
424 | + fwrite($fp, $line . "\n"); | ||
425 | + } else { | ||
426 | + fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n"); | ||
427 | + } | ||
428 | + $n++; | ||
429 | + } | ||
430 | + fclose($file) || fclose($fp); | ||
431 | + $reader = new Csv(); | ||
432 | + } elseif ($ext === 'xls') { | ||
433 | + $reader = new Xls(); | ||
434 | + } else { | ||
435 | + $reader = new Xlsx(); | ||
436 | + } | ||
437 | + set_time_limit(0); | ||
438 | + //加载文件 | ||
439 | + $insert = []; | ||
440 | + try { | ||
441 | + if (!$PHPExcel = $reader->load($filePath)) { | ||
442 | + $this->error(__('Unknown data format')); | ||
443 | + } | ||
444 | + $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 | ||
445 | + $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 | ||
446 | + $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 | ||
447 | + $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); // 一共多少列 | ||
448 | + for ($i = 2; $i <= $allRow; $i++) { | ||
449 | + if (!empty($PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue())) { | ||
450 | + $insert[$i]['goods_name'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();//商品名称 | ||
451 | + $insert[$i]['keywords'] = $PHPExcel->getActiveSheet()->getCell("B" . $i)->getValue();//关键词 | ||
452 | + $category = $PHPExcel->getActiveSheet()->getCell("C" . $i)->getValue() ?? '';//类别 | ||
453 | + $insert[$i]['category_id'] = Db::name('litestore_category')->where('name', $category)->value('id') ?? ''; | ||
454 | + $insert[$i]['activity_id'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue() ?? '';//活动类型 | ||
455 | + $insert[$i]['is_index'] = $PHPExcel->getActiveSheet()->getCell("I" . $i)->getValue() ?? '';//是否首页 | ||
456 | + $insert[$i]['goods_status'] = $PHPExcel->getActiveSheet()->getCell("H" . $i)->getValue() ?? '';//商品状态 | ||
457 | + $spec_insert[$i]['stock_num'] = $PHPExcel->getActiveSheet()->getCell("E" . $i)->getValue() ?? '';//库存 | ||
458 | + $spec_insert[$i]['goods_price'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue() ?? '';//现价 | ||
459 | + $spec_insert[$i]['line_price'] = $PHPExcel->getActiveSheet()->getCell("F" . $i)->getValue() ?? '';//原价 | ||
460 | + } | ||
461 | + } | ||
462 | + } catch (\Exception $exception) { | ||
463 | + $this->error($exception->getMessage()); | ||
464 | + } | ||
465 | + if (!$insert) { | ||
466 | + $this->error(__('No rows were updated')); | ||
467 | + } | ||
468 | + try { | ||
469 | + | ||
470 | + $res_goods = $this->model->saveAll($insert); | ||
471 | + foreach ($spec_insert as $key => &$v) { | ||
472 | + $v['goods_id'] = $res_goods[$key]['goods_id']; | ||
473 | + } | ||
474 | + unset($v); | ||
475 | + $this->spec_model->saveAll($spec_insert); | ||
476 | + } catch (PDOException $exception) { | ||
477 | + $msg = $exception->getMessage(); | ||
478 | + if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) { | ||
479 | + $msg = "导入失败,包含【{$matches[1]}】的记录已存在"; | ||
480 | + }; | ||
481 | + $this->error($msg); | ||
482 | + } catch (\Exception $e) { | ||
483 | + $this->error($e->getMessage()); | ||
484 | + } | ||
485 | + $this->success(); | ||
486 | + } | ||
487 | + | ||
488 | + | ||
489 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace app\admin\controller\activity_goods; | ||
4 | + | ||
5 | +use app\admin\model\litestore\Litestoregoodsspec; | ||
6 | +use app\common\controller\Backend; | ||
7 | +use app\admin\model\litestore\Litestorespec as SpecModel; | ||
8 | +use app\admin\model\litestore\Litestorespecvalue as SpecValueModel; | ||
9 | +use PhpOffice\PhpSpreadsheet\Cell\Coordinate; | ||
10 | +use PhpOffice\PhpSpreadsheet\Reader\Csv; | ||
11 | +use PhpOffice\PhpSpreadsheet\Reader\Xls; | ||
12 | +use PhpOffice\PhpSpreadsheet\Reader\Xlsx; | ||
13 | +use think\Db; | ||
14 | +use think\exception\PDOException; | ||
15 | + | ||
16 | + | ||
17 | +/** | ||
18 | + * | ||
19 | + * | ||
20 | + * @icon fa fa-circle-o | ||
21 | + */ | ||
22 | +class NewGoods extends Backend | ||
23 | +{ | ||
24 | + private $SpecModel; | ||
25 | + private $SpecValueModel; | ||
26 | + /** | ||
27 | + * Litestoregoods模型对象 | ||
28 | + * @var \app\admin\model\litestore\Litestoregoods | ||
29 | + */ | ||
30 | + protected $model = null; | ||
31 | + protected $spec_model = null; | ||
32 | +// protected $searchFields = 'category.name'; | ||
33 | + | ||
34 | + public function _initialize() | ||
35 | + { | ||
36 | + parent::_initialize(); | ||
37 | + $this->SpecModel = new SpecModel; | ||
38 | + $this->SpecValueModel = new SpecValueModel; | ||
39 | + | ||
40 | + $this->model = new \app\admin\model\litestore\Litestoregoods; | ||
41 | + $this->spec_model = new \app\admin\model\litestore\Litestoregoodsspec(); | ||
42 | + $this->view->assign("specTypeList", $this->model->getSpecTypeList()); | ||
43 | + $this->view->assign("deductStockTypeList", $this->model->getDeductStockTypeList()); | ||
44 | + $this->view->assign("goodsStatusList", $this->model->getGoodsStatusList()); | ||
45 | + $this->view->assign("isDeleteList", $this->model->getIsDeleteList()); | ||
46 | + $this->view->assign("makeforList", $this->model->getMakeforList()); | ||
47 | + $this->view->assign("isIndexList", $this->model->getIsIndexList()); | ||
48 | + | ||
49 | + $this->view->assign("spec_attr", ''); | ||
50 | + $this->view->assign("spec_list", ''); | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 | ||
55 | + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 | ||
56 | + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 | ||
57 | + */ | ||
58 | + | ||
59 | + | ||
60 | + /** | ||
61 | + * 查看 | ||
62 | + */ | ||
63 | + public function index() | ||
64 | + { | ||
65 | + //当前是否为关联查询 | ||
66 | + $this->relationSearch = true; | ||
67 | + //设置过滤方法 | ||
68 | + $this->request->filter(['strip_tags']); | ||
69 | + if ($this->request->isAjax()) { | ||
70 | + //如果发送的来源是Selectpage,则转发到Selectpage | ||
71 | + if ($this->request->request('keyField')) { | ||
72 | + return $this->selectpage(); | ||
73 | + } | ||
74 | + list($where, $sort, $order, $offset, $limit) = $this->buildparams("category.name",true); | ||
75 | + $total = $this->model | ||
76 | + ->with(['category', 'activity']) | ||
77 | + ->where($where) | ||
78 | + ->where('activity_id',1) | ||
79 | + ->order($sort, $order) | ||
80 | + ->count(); | ||
81 | + | ||
82 | + $list = $this->model | ||
83 | + ->with(['category', 'activity']) | ||
84 | + ->where($where) | ||
85 | + ->where('activity_id',1) | ||
86 | + ->order($sort, $order) | ||
87 | + ->limit($offset, $limit) | ||
88 | + ->select(); | ||
89 | + | ||
90 | + foreach ($list as $row) { | ||
91 | + | ||
92 | + $row->getRelation('category')->visible(['name']); | ||
93 | + $row->getRelation('activity')->visible(['name']); | ||
94 | +// $row->getRelation('freight')->visible(['name']); | ||
95 | + $row->stock_num = Litestoregoodsspec::where('goods_id', $row['goods_id'])->sum('stock_num'); | ||
96 | + } | ||
97 | + $list = collection($list)->toArray(); | ||
98 | + $result = array("total" => $total, "rows" => $list); | ||
99 | + | ||
100 | + return json($result); | ||
101 | + } | ||
102 | + $this->assign('template', $this->request->domain() . '/static/template/商品导入模板.xlsx'); | ||
103 | + | ||
104 | + return $this->view->fetch(); | ||
105 | + } | ||
106 | + | ||
107 | + public function addSpec($spec_name, $spec_value) | ||
108 | + { | ||
109 | + // 判断规格组是否存在 | ||
110 | + if (!$specId = $this->SpecModel->getSpecIdByName($spec_name)) { | ||
111 | + // 新增规格组and规则值 | ||
112 | + if ($this->SpecModel->add($spec_name) | ||
113 | + && $this->SpecValueModel->add($this->SpecModel['id'], $spec_value)) | ||
114 | + return $this->success('', '', [ | ||
115 | + 'spec_id' => (int)$this->SpecModel['id'], | ||
116 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
117 | + ]); | ||
118 | + return $this->error(); | ||
119 | + } | ||
120 | + //return ; | ||
121 | + // 判断规格值是否存在 | ||
122 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($specId, $spec_value)) { | ||
123 | + return $this->success('', '', [ | ||
124 | + 'spec_id' => (int)$specId, | ||
125 | + 'spec_value_id' => (int)$specValueId, | ||
126 | + ]); | ||
127 | + } | ||
128 | + // 添加规则值 | ||
129 | + if ($this->SpecValueModel->add($specId, $spec_value)) | ||
130 | + return $this->success('', '', [ | ||
131 | + 'spec_id' => (int)$specId, | ||
132 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
133 | + ]); | ||
134 | + return $this->error(); | ||
135 | + } | ||
136 | + | ||
137 | + | ||
138 | + /** | ||
139 | + * 添加规格值 | ||
140 | + */ | ||
141 | + public function addSpecValue($spec_id, $spec_value) | ||
142 | + { | ||
143 | + // 判断规格值是否存在 | ||
144 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($spec_id, $spec_value)) { | ||
145 | + return $this->success('', '', [ | ||
146 | + 'spec_value_id' => (int)$specValueId, | ||
147 | + ]); | ||
148 | + } | ||
149 | + // 添加规则值 | ||
150 | + if ($this->SpecValueModel->add($spec_id, $spec_value)) | ||
151 | + return $this->success('', '', [ | ||
152 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
153 | + ]); | ||
154 | + return $this->error(); | ||
155 | + } | ||
156 | + | ||
157 | + /** | ||
158 | + * 添加 | ||
159 | + */ | ||
160 | + public function add() | ||
161 | + { | ||
162 | + if ($this->request->isPost()) { | ||
163 | + $params = $this->request->post("row/a"); | ||
164 | + if ($params) { | ||
165 | + if ($this->dataLimit && $this->dataLimitFieldAutoFill) { | ||
166 | + $params[$this->dataLimitField] = $this->auth->id; | ||
167 | + } | ||
168 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
169 | + $this->error('请添加规格'); | ||
170 | + } | ||
171 | + try { | ||
172 | + //是否采用模型验证 | ||
173 | + if ($this->modelValidate) { | ||
174 | + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model)); | ||
175 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate; | ||
176 | + $this->model->validate($validate); | ||
177 | + } | ||
178 | + $result = $this->model->allowField(true)->save($params); | ||
179 | + if ($result !== false) { | ||
180 | + //成功之后 存储商品规格 | ||
181 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
182 | + $this->model->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a")); | ||
183 | + $this->success(); | ||
184 | + } else { | ||
185 | + $this->error($this->model->getError()); | ||
186 | + } | ||
187 | + } catch (\think\exception\PDOException $e) { | ||
188 | + $this->error($e->getMessage()); | ||
189 | + } catch (\think\Exception $e) { | ||
190 | + $this->error($e->getMessage()); | ||
191 | + } | ||
192 | + } | ||
193 | + $this->error(__('Parameter %s can not be empty', '')); | ||
194 | + } | ||
195 | + return $this->view->fetch(); | ||
196 | + } | ||
197 | + | ||
198 | + /** | ||
199 | + * 删除 | ||
200 | + */ | ||
201 | + public function del($ids = "") | ||
202 | + { | ||
203 | + if ($ids) { | ||
204 | + $pk = $this->model->getPk(); | ||
205 | + $adminIds = $this->getDataLimitAdminIds(); | ||
206 | + if (is_array($adminIds)) { | ||
207 | + $count = $this->model->where($this->dataLimitField, 'in', $adminIds); | ||
208 | + } | ||
209 | + $list = $this->model->where($pk, 'in', $ids)->select(); | ||
210 | + $count = 0; | ||
211 | + foreach ($list as $k => $v) { | ||
212 | + // 删除商品sku | ||
213 | + $v->removesku(); | ||
214 | + | ||
215 | + $count += $v->delete(); | ||
216 | + } | ||
217 | + if ($count) { | ||
218 | + $this->success(); | ||
219 | + } else { | ||
220 | + $this->error(__('No rows were deleted')); | ||
221 | + } | ||
222 | + } | ||
223 | + $this->error(__('Parameter %s can not be empty', 'ids')); | ||
224 | + } | ||
225 | + | ||
226 | + /** | ||
227 | + * 编辑 | ||
228 | + */ | ||
229 | + public function edit($ids = NULL) | ||
230 | + { | ||
231 | + $row = $this->model->get($ids, ['specRel', 'spec', 'spec_rel.spec']); | ||
232 | + if (!$row) | ||
233 | + $this->error(__('No Results were found')); | ||
234 | + $adminIds = $this->getDataLimitAdminIds(); | ||
235 | + if (is_array($adminIds)) { | ||
236 | + if (!in_array($row[$this->dataLimitField], $adminIds)) { | ||
237 | + $this->error(__('You have no permission')); | ||
238 | + } | ||
239 | + } | ||
240 | + if ($this->request->isPost()) { | ||
241 | + $params = $this->request->post("row/a"); | ||
242 | + if ($params) { | ||
243 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
244 | + $this->error('请添加规格'); | ||
245 | + } | ||
246 | + try { | ||
247 | + //是否采用模型验证 | ||
248 | + if ($this->modelValidate) { | ||
249 | + $name = basename(str_replace('\\', '/', get_class($this->model))); | ||
250 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : true) : $this->modelValidate; | ||
251 | + $row->validate($validate); | ||
252 | + } | ||
253 | + $result = $row->allowField(true)->save($params); | ||
254 | + if ($result !== false) { | ||
255 | + //成功之后 存储商品规格 | ||
256 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
257 | + $row->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a"), true); | ||
258 | + // 删除购物车 | ||
259 | + Db::name('cart')->where('goods_id', $row->goods_id)->delete(); | ||
260 | + //删除我常买 | ||
261 | + Db::name('user_buylist')->where('goods_id', $row->goods_id)->delete(); | ||
262 | + $this->success(); | ||
263 | + } else { | ||
264 | + $this->error($row->getError()); | ||
265 | + } | ||
266 | + } catch (\think\exception\PDOException $e) { | ||
267 | + $this->error($e->getMessage()); | ||
268 | + } catch (\think\Exception $e) { | ||
269 | + $this->error($e->getMessage()); | ||
270 | + } | ||
271 | + } | ||
272 | + $this->error(__('Parameter %s can not be empty', '')); | ||
273 | + } | ||
274 | + // 多规格信息 | ||
275 | + $specData = 'null'; | ||
276 | + if ($row['spec_type'] === '20') { | ||
277 | + $specData = json_encode($this->model->getManySpecData($row['spec_rel'], $row['spec'])); | ||
278 | + } | ||
279 | + $row['specData'] = $specData; | ||
280 | + $this->view->assign("row", $row); | ||
281 | + return $this->view->fetch(); | ||
282 | + } | ||
283 | + | ||
284 | + | ||
285 | + /** | ||
286 | + * 导出 | ||
287 | + */ | ||
288 | + public function export() | ||
289 | + { | ||
290 | + //1.从数据库中导出需要进行要导出的数据 | ||
291 | + $list = Db::name('litestore_goods_spec')->alias('c') | ||
292 | + ->join('fa_litestore_goods g', 'g.goods_id = c.goods_id', 'LEFT') | ||
293 | + ->select(); | ||
294 | + $list = collection($list)->toArray(); | ||
295 | + foreach ($list as &$item) { | ||
296 | + $item['category_name'] = Db::name('litestore_category')->where('id', $item['category_id'])->value('name'); | ||
297 | + if (!empty($item['spec_sku_id'])) { | ||
298 | + $sku_value = explode('_', $item['spec_sku_id']); | ||
299 | + if (count($sku_value) > 1) { | ||
300 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
301 | + $value = Db::name('litestore_spec_value')->where('id', $sku_value[1])->value('spec_value'); | ||
302 | + $item['sku_value'] = $key . '_' . $value; | ||
303 | + } else { | ||
304 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
305 | + $item['sku_value'] = $key; | ||
306 | + } | ||
307 | + } else { | ||
308 | + $item['sku_value'] = ''; | ||
309 | + } | ||
310 | + } | ||
311 | + if (empty($list)) { | ||
312 | + $this->error('没有可导出的数据'); | ||
313 | + } | ||
314 | + //重要补助 | ||
315 | + //2.加载PHPExcle类库 | ||
316 | + vendor('PHPExcel.PHPExcel'); | ||
317 | + //3.实例化PHPExcel类 | ||
318 | + $objPHPExcel = new \PHPExcel(); | ||
319 | + //4.激活当前的sheet表 | ||
320 | + $objPHPExcel->setActiveSheetIndex(0); | ||
321 | + //5.设置表格头(即excel表格的第一行) | ||
322 | + $objPHPExcel->setActiveSheetIndex(0) | ||
323 | + ->setCellValue('A1', '商品ID') | ||
324 | + ->setCellValue('B1', '商品名称') | ||
325 | + ->setCellValue('C1', '搜索关键词') | ||
326 | + ->setCellValue('D1', '分类名称') | ||
327 | + ->setCellValue('E1', '活动名称(新人用户=1,限时秒杀=2,进口商品=4)') | ||
328 | + ->setCellValue('F1', '商品规格(10=单规格,20=多规格)') | ||
329 | + ->setCellValue('G1', '库存') | ||
330 | + ->setCellValue('H1', '商品规格') | ||
331 | + ->setCellValue('I1', '商品原价') | ||
332 | + ->setCellValue('J1', '折扣') | ||
333 | + ->setCellValue('K1', '商品现价') | ||
334 | + ->setCellValue('L1', '已销数量') | ||
335 | + ->setCellValue('M1', '商品状态(10=上架,20=下架)') | ||
336 | + ->setCellValue('N1', '首页展示(0=未展示,1=已展示)') | ||
337 | + ->setCellValue('O1', '导出时间'); | ||
338 | + //设置A列水平居中 | ||
339 | + $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment() | ||
340 | + ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); | ||
341 | + //设置单元格宽度 | ||
342 | + //6.循环刚取出来的数组,将数据逐一添加到excel表格。 | ||
343 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('A')->setWidth(10); | ||
344 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('B')->setWidth(20); | ||
345 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('C')->setWidth(20); | ||
346 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('D')->setWidth(20); | ||
347 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('E')->setWidth(20); | ||
348 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('F')->setWidth(20); | ||
349 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('G')->setWidth(20); | ||
350 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('H')->setWidth(20); | ||
351 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('I')->setWidth(20); | ||
352 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('J')->setWidth(20); | ||
353 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('K')->setWidth(20); | ||
354 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('L')->setWidth(20); | ||
355 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('M')->setWidth(20); | ||
356 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('N')->setWidth(20); | ||
357 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('O')->setWidth(20); | ||
358 | + | ||
359 | + | ||
360 | + for ($i = 0; $i < count($list); $i++) { | ||
361 | + $objPHPExcel->getActiveSheet()->setCellValue('A' . ($i + 2), $list[$i]['goods_id']);//ID | ||
362 | + $objPHPExcel->getActiveSheet()->setCellValue('B' . ($i + 2), $list[$i]['goods_name']);//商品名称 | ||
363 | + $objPHPExcel->getActiveSheet()->setCellValue('C' . ($i + 2), $list[$i]['keywords']);//商品规格 | ||
364 | + $objPHPExcel->getActiveSheet()->setCellValue('D' . ($i + 2), $list[$i]['category_name']);//原价 | ||
365 | + $objPHPExcel->getActiveSheet()->setCellValue('E' . ($i + 2), $list[$i]['activity_id']);//ID | ||
366 | + $objPHPExcel->getActiveSheet()->setCellValue('F' . ($i + 2), $list[$i]['spec_type']);//标签码 | ||
367 | + $objPHPExcel->getActiveSheet()->setCellValue('G' . ($i + 2), $list[$i]['stock_num']);//ID | ||
368 | + $objPHPExcel->getActiveSheet()->setCellValue('H' . ($i + 2), $list[$i]['sku_value']);//ID | ||
369 | + $objPHPExcel->getActiveSheet()->setCellValue('I' . ($i + 2), $list[$i]['line_price']);//ID | ||
370 | + $objPHPExcel->getActiveSheet()->setCellValue('J' . ($i + 2), $list[$i]['discount']);//ID | ||
371 | + $objPHPExcel->getActiveSheet()->setCellValue('K' . ($i + 2), $list[$i]['goods_price']);//ID | ||
372 | + $objPHPExcel->getActiveSheet()->setCellValue('L' . ($i + 2), $list[$i]['goods_sales']);//ID | ||
373 | + $objPHPExcel->getActiveSheet()->setCellValue('M' . ($i + 2), $list[$i]['goods_status']);//ID | ||
374 | + $objPHPExcel->getActiveSheet()->setCellValue('N' . ($i + 2), $list[$i]['is_index']);//标签码 | ||
375 | + $objPHPExcel->getActiveSheet()->setCellValue('O' . ($i + 2), datetime(time()));//标签码 | ||
376 | + } | ||
377 | + ob_end_clean(); | ||
378 | + ob_start(); | ||
379 | + $title = '商品列表'; | ||
380 | + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); | ||
381 | + header('Content-Disposition:attachment;filename="' . $title . '.xlsx"'); | ||
382 | + header('Cache-Control: max-age=0'); | ||
383 | + header('Cache-Control: max-age=1'); | ||
384 | + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past | ||
385 | + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified | ||
386 | + header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 | ||
387 | + header('Pragma: public'); // HTTP/1.0 | ||
388 | + $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); | ||
389 | + $objWriter->save('php://output'); //文件通过浏览器下载 | ||
390 | + exit(); | ||
391 | + } | ||
392 | + | ||
393 | + /** | ||
394 | + *导入 | ||
395 | + * | ||
396 | + * */ | ||
397 | + public function import() | ||
398 | + { | ||
399 | + $file = $this->request->request('file'); | ||
400 | + if (!$file) { | ||
401 | + $this->error(__('Parameter %s can not be empty', 'file')); | ||
402 | + } | ||
403 | + $filePath = ROOT_PATH . DS . 'public' . DS . $file; | ||
404 | + if (!is_file($filePath)) { | ||
405 | + $this->error(__('No results were found')); | ||
406 | + } | ||
407 | + //实例化reader | ||
408 | + $ext = pathinfo($filePath, PATHINFO_EXTENSION); | ||
409 | + if (!in_array($ext, ['csv', 'xls', 'xlsx'])) { | ||
410 | + $this->error(__('Unknown data format')); | ||
411 | + } | ||
412 | + if ($ext === 'csv') { | ||
413 | + $file = fopen($filePath, 'r'); | ||
414 | + $filePath = tempnam(sys_get_temp_dir(), 'import_csv'); | ||
415 | + $fp = fopen($filePath, "w"); | ||
416 | + $n = 0; | ||
417 | + while ($line = fgets($file)) { | ||
418 | + $line = rtrim($line, "\n\r\0"); | ||
419 | + $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']); | ||
420 | + if ($encoding != 'utf-8') { | ||
421 | + $line = mb_convert_encoding($line, 'utf-8', $encoding); | ||
422 | + } | ||
423 | + if ($n == 0 || preg_match('/^".*"$/', $line)) { | ||
424 | + fwrite($fp, $line . "\n"); | ||
425 | + } else { | ||
426 | + fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n"); | ||
427 | + } | ||
428 | + $n++; | ||
429 | + } | ||
430 | + fclose($file) || fclose($fp); | ||
431 | + $reader = new Csv(); | ||
432 | + } elseif ($ext === 'xls') { | ||
433 | + $reader = new Xls(); | ||
434 | + } else { | ||
435 | + $reader = new Xlsx(); | ||
436 | + } | ||
437 | + set_time_limit(0); | ||
438 | + //加载文件 | ||
439 | + $insert = []; | ||
440 | + try { | ||
441 | + if (!$PHPExcel = $reader->load($filePath)) { | ||
442 | + $this->error(__('Unknown data format')); | ||
443 | + } | ||
444 | + $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 | ||
445 | + $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 | ||
446 | + $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 | ||
447 | + $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); // 一共多少列 | ||
448 | + for ($i = 2; $i <= $allRow; $i++) { | ||
449 | + if (!empty($PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue())) { | ||
450 | + $insert[$i]['goods_name'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();//商品名称 | ||
451 | + $insert[$i]['keywords'] = $PHPExcel->getActiveSheet()->getCell("B" . $i)->getValue();//关键词 | ||
452 | + $category = $PHPExcel->getActiveSheet()->getCell("C" . $i)->getValue() ?? '';//类别 | ||
453 | + $insert[$i]['category_id'] = Db::name('litestore_category')->where('name', $category)->value('id') ?? ''; | ||
454 | + $insert[$i]['activity_id'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue() ?? '';//活动类型 | ||
455 | + $insert[$i]['is_index'] = $PHPExcel->getActiveSheet()->getCell("I" . $i)->getValue() ?? '';//是否首页 | ||
456 | + $insert[$i]['goods_status'] = $PHPExcel->getActiveSheet()->getCell("H" . $i)->getValue() ?? '';//商品状态 | ||
457 | + $spec_insert[$i]['stock_num'] = $PHPExcel->getActiveSheet()->getCell("E" . $i)->getValue() ?? '';//库存 | ||
458 | + $spec_insert[$i]['goods_price'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue() ?? '';//现价 | ||
459 | + $spec_insert[$i]['line_price'] = $PHPExcel->getActiveSheet()->getCell("F" . $i)->getValue() ?? '';//原价 | ||
460 | + } | ||
461 | + } | ||
462 | + } catch (\Exception $exception) { | ||
463 | + $this->error($exception->getMessage()); | ||
464 | + } | ||
465 | + if (!$insert) { | ||
466 | + $this->error(__('No rows were updated')); | ||
467 | + } | ||
468 | + try { | ||
469 | + | ||
470 | + $res_goods = $this->model->saveAll($insert); | ||
471 | + foreach ($spec_insert as $key => &$v) { | ||
472 | + $v['goods_id'] = $res_goods[$key]['goods_id']; | ||
473 | + } | ||
474 | + unset($v); | ||
475 | + $this->spec_model->saveAll($spec_insert); | ||
476 | + } catch (PDOException $exception) { | ||
477 | + $msg = $exception->getMessage(); | ||
478 | + if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) { | ||
479 | + $msg = "导入失败,包含【{$matches[1]}】的记录已存在"; | ||
480 | + }; | ||
481 | + $this->error($msg); | ||
482 | + } catch (\Exception $e) { | ||
483 | + $this->error($e->getMessage()); | ||
484 | + } | ||
485 | + $this->success(); | ||
486 | + } | ||
487 | + | ||
488 | + | ||
489 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace app\admin\controller\activity_goods; | ||
4 | + | ||
5 | +use app\admin\model\litestore\Litestoregoodsspec; | ||
6 | +use app\common\controller\Backend; | ||
7 | +use app\admin\model\litestore\Litestorespec as SpecModel; | ||
8 | +use app\admin\model\litestore\Litestorespecvalue as SpecValueModel; | ||
9 | +use PhpOffice\PhpSpreadsheet\Cell\Coordinate; | ||
10 | +use PhpOffice\PhpSpreadsheet\Reader\Csv; | ||
11 | +use PhpOffice\PhpSpreadsheet\Reader\Xls; | ||
12 | +use PhpOffice\PhpSpreadsheet\Reader\Xlsx; | ||
13 | +use think\Db; | ||
14 | +use think\exception\PDOException; | ||
15 | + | ||
16 | + | ||
17 | +/** | ||
18 | + * | ||
19 | + * | ||
20 | + * @icon fa fa-circle-o | ||
21 | + */ | ||
22 | +class SeckillGoods extends Backend | ||
23 | +{ | ||
24 | + private $SpecModel; | ||
25 | + private $SpecValueModel; | ||
26 | + /** | ||
27 | + * Litestoregoods模型对象 | ||
28 | + * @var \app\admin\model\litestore\Litestoregoods | ||
29 | + */ | ||
30 | + protected $model = null; | ||
31 | + protected $spec_model = null; | ||
32 | + | ||
33 | +// protected $searchFields = 'category.name'; | ||
34 | + | ||
35 | + public function _initialize() | ||
36 | + { | ||
37 | + parent::_initialize(); | ||
38 | + $this->SpecModel = new SpecModel; | ||
39 | + $this->SpecValueModel = new SpecValueModel; | ||
40 | + | ||
41 | + $this->model = new \app\admin\model\litestore\Litestoregoods; | ||
42 | + $this->spec_model = new \app\admin\model\litestore\Litestoregoodsspec(); | ||
43 | + $this->view->assign("specTypeList", $this->model->getSpecTypeList()); | ||
44 | + $this->view->assign("deductStockTypeList", $this->model->getDeductStockTypeList()); | ||
45 | + $this->view->assign("goodsStatusList", $this->model->getGoodsStatusList()); | ||
46 | + $this->view->assign("isDeleteList", $this->model->getIsDeleteList()); | ||
47 | + $this->view->assign("makeforList", $this->model->getMakeforList()); | ||
48 | + $this->view->assign("isIndexList", $this->model->getIsIndexList()); | ||
49 | + | ||
50 | + $this->view->assign("spec_attr", ''); | ||
51 | + $this->view->assign("spec_list", ''); | ||
52 | + } | ||
53 | + | ||
54 | + /** | ||
55 | + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 | ||
56 | + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 | ||
57 | + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 | ||
58 | + */ | ||
59 | + | ||
60 | + | ||
61 | + /** | ||
62 | + * 查看 | ||
63 | + */ | ||
64 | + public function index() | ||
65 | + { | ||
66 | + //当前是否为关联查询 | ||
67 | + $this->relationSearch = true; | ||
68 | + //设置过滤方法 | ||
69 | + $this->request->filter(['strip_tags']); | ||
70 | + if ($this->request->isAjax()) { | ||
71 | + //如果发送的来源是Selectpage,则转发到Selectpage | ||
72 | + if ($this->request->request('keyField')) { | ||
73 | + return $this->selectpage(); | ||
74 | + } | ||
75 | + list($where, $sort, $order, $offset, $limit) = $this->buildparams("category.name", true); | ||
76 | + $total = $this->model | ||
77 | + ->with(['category', 'activity']) | ||
78 | + ->where($where) | ||
79 | + ->where('activity_id',2) | ||
80 | + ->order($sort, $order) | ||
81 | + ->count(); | ||
82 | + | ||
83 | + $list = $this->model | ||
84 | + ->with(['category', 'activity']) | ||
85 | + ->where($where) | ||
86 | + ->where('activity_id',2) | ||
87 | + ->order($sort, $order) | ||
88 | + ->limit($offset, $limit) | ||
89 | + ->select(); | ||
90 | + | ||
91 | + foreach ($list as $row) { | ||
92 | + | ||
93 | + $row->getRelation('category')->visible(['name']); | ||
94 | + $row->getRelation('activity')->visible(['name']); | ||
95 | +// $row->getRelation('freight')->visible(['name']); | ||
96 | + $row->stock_num = Litestoregoodsspec::where('goods_id', $row['goods_id'])->sum('stock_num'); | ||
97 | + } | ||
98 | + $list = collection($list)->toArray(); | ||
99 | + $result = array("total" => $total, "rows" => $list); | ||
100 | + | ||
101 | + return json($result); | ||
102 | + } | ||
103 | + $this->assign('template', $this->request->domain() . '/static/template/商品导入模板.xlsx'); | ||
104 | + | ||
105 | + return $this->view->fetch(); | ||
106 | + } | ||
107 | + | ||
108 | + public function addSpec($spec_name, $spec_value) | ||
109 | + { | ||
110 | + // 判断规格组是否存在 | ||
111 | + if (!$specId = $this->SpecModel->getSpecIdByName($spec_name)) { | ||
112 | + // 新增规格组and规则值 | ||
113 | + if ($this->SpecModel->add($spec_name) | ||
114 | + && $this->SpecValueModel->add($this->SpecModel['id'], $spec_value)) | ||
115 | + return $this->success('', '', [ | ||
116 | + 'spec_id' => (int)$this->SpecModel['id'], | ||
117 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
118 | + ]); | ||
119 | + return $this->error(); | ||
120 | + } | ||
121 | + //return ; | ||
122 | + // 判断规格值是否存在 | ||
123 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($specId, $spec_value)) { | ||
124 | + return $this->success('', '', [ | ||
125 | + 'spec_id' => (int)$specId, | ||
126 | + 'spec_value_id' => (int)$specValueId, | ||
127 | + ]); | ||
128 | + } | ||
129 | + // 添加规则值 | ||
130 | + if ($this->SpecValueModel->add($specId, $spec_value)) | ||
131 | + return $this->success('', '', [ | ||
132 | + 'spec_id' => (int)$specId, | ||
133 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
134 | + ]); | ||
135 | + return $this->error(); | ||
136 | + } | ||
137 | + | ||
138 | + | ||
139 | + /** | ||
140 | + * 添加规格值 | ||
141 | + */ | ||
142 | + public function addSpecValue($spec_id, $spec_value) | ||
143 | + { | ||
144 | + // 判断规格值是否存在 | ||
145 | + if ($specValueId = $this->SpecValueModel->getSpecValueIdByName($spec_id, $spec_value)) { | ||
146 | + return $this->success('', '', [ | ||
147 | + 'spec_value_id' => (int)$specValueId, | ||
148 | + ]); | ||
149 | + } | ||
150 | + // 添加规则值 | ||
151 | + if ($this->SpecValueModel->add($spec_id, $spec_value)) | ||
152 | + return $this->success('', '', [ | ||
153 | + 'spec_value_id' => (int)$this->SpecValueModel['id'], | ||
154 | + ]); | ||
155 | + return $this->error(); | ||
156 | + } | ||
157 | + | ||
158 | + /** | ||
159 | + * 添加 | ||
160 | + */ | ||
161 | + public function add() | ||
162 | + { | ||
163 | + if ($this->request->isPost()) { | ||
164 | + $params = $this->request->post("row/a"); | ||
165 | + if ($params) { | ||
166 | + if ($this->dataLimit && $this->dataLimitFieldAutoFill) { | ||
167 | + $params[$this->dataLimitField] = $this->auth->id; | ||
168 | + } | ||
169 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
170 | + $this->error('请添加规格'); | ||
171 | + } | ||
172 | + try { | ||
173 | + //是否采用模型验证 | ||
174 | + if ($this->modelValidate) { | ||
175 | + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model)); | ||
176 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate; | ||
177 | + $this->model->validate($validate); | ||
178 | + } | ||
179 | + $result = $this->model->allowField(true)->save($params); | ||
180 | + if ($result !== false) { | ||
181 | + //成功之后 存储商品规格 | ||
182 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
183 | + $this->model->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a")); | ||
184 | + $this->success(); | ||
185 | + } else { | ||
186 | + $this->error($this->model->getError()); | ||
187 | + } | ||
188 | + } catch (\think\exception\PDOException $e) { | ||
189 | + $this->error($e->getMessage()); | ||
190 | + } catch (\think\Exception $e) { | ||
191 | + $this->error($e->getMessage()); | ||
192 | + } | ||
193 | + } | ||
194 | + $this->error(__('Parameter %s can not be empty', '')); | ||
195 | + } | ||
196 | + return $this->view->fetch(); | ||
197 | + } | ||
198 | + | ||
199 | + /** | ||
200 | + * 删除 | ||
201 | + */ | ||
202 | + public function del($ids = "") | ||
203 | + { | ||
204 | + if ($ids) { | ||
205 | + $pk = $this->model->getPk(); | ||
206 | + $adminIds = $this->getDataLimitAdminIds(); | ||
207 | + if (is_array($adminIds)) { | ||
208 | + $count = $this->model->where($this->dataLimitField, 'in', $adminIds); | ||
209 | + } | ||
210 | + $list = $this->model->where($pk, 'in', $ids)->select(); | ||
211 | + $count = 0; | ||
212 | + foreach ($list as $k => $v) { | ||
213 | + // 删除商品sku | ||
214 | + $v->removesku(); | ||
215 | + | ||
216 | + $count += $v->delete(); | ||
217 | + } | ||
218 | + if ($count) { | ||
219 | + $this->success(); | ||
220 | + } else { | ||
221 | + $this->error(__('No rows were deleted')); | ||
222 | + } | ||
223 | + } | ||
224 | + $this->error(__('Parameter %s can not be empty', 'ids')); | ||
225 | + } | ||
226 | + | ||
227 | + /** | ||
228 | + * 编辑 | ||
229 | + */ | ||
230 | + public function edit($ids = NULL) | ||
231 | + { | ||
232 | + $row = $this->model->get($ids, ['specRel', 'spec', 'spec_rel.spec']); | ||
233 | + if (!$row) | ||
234 | + $this->error(__('No Results were found')); | ||
235 | + $adminIds = $this->getDataLimitAdminIds(); | ||
236 | + if (is_array($adminIds)) { | ||
237 | + if (!in_array($row[$this->dataLimitField], $adminIds)) { | ||
238 | + $this->error(__('You have no permission')); | ||
239 | + } | ||
240 | + } | ||
241 | + if ($this->request->isPost()) { | ||
242 | + $params = $this->request->post("row/a"); | ||
243 | + if ($params) { | ||
244 | + if ($params['spec_type'] == '20' && !$this->request->post("spec_many/a")) { | ||
245 | + $this->error('请添加规格'); | ||
246 | + } | ||
247 | + try { | ||
248 | + //是否采用模型验证 | ||
249 | + if ($this->modelValidate) { | ||
250 | + $name = basename(str_replace('\\', '/', get_class($this->model))); | ||
251 | + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : true) : $this->modelValidate; | ||
252 | + $row->validate($validate); | ||
253 | + } | ||
254 | + $result = $row->allowField(true)->save($params); | ||
255 | + if ($result !== false) { | ||
256 | + //成功之后 存储商品规格 | ||
257 | + $spec_many_params = $this->request->post("spec_many/a"); | ||
258 | + $row->addGoodsSpec($params, $spec_many_params, $this->request->post("spec/a"), true); | ||
259 | + // 删除购物车 | ||
260 | + Db::name('cart')->where('goods_id', $row->goods_id)->delete(); | ||
261 | + //删除我常买 | ||
262 | + Db::name('user_buylist')->where('goods_id', $row->goods_id)->delete(); | ||
263 | + $this->success(); | ||
264 | + } else { | ||
265 | + $this->error($row->getError()); | ||
266 | + } | ||
267 | + } catch (\think\exception\PDOException $e) { | ||
268 | + $this->error($e->getMessage()); | ||
269 | + } catch (\think\Exception $e) { | ||
270 | + $this->error($e->getMessage()); | ||
271 | + } | ||
272 | + } | ||
273 | + $this->error(__('Parameter %s can not be empty', '')); | ||
274 | + } | ||
275 | + // 多规格信息 | ||
276 | + $specData = 'null'; | ||
277 | + if ($row['spec_type'] === '20') { | ||
278 | + $specData = json_encode($this->model->getManySpecData($row['spec_rel'], $row['spec'])); | ||
279 | + } | ||
280 | + $row['specData'] = $specData; | ||
281 | + $this->view->assign("row", $row); | ||
282 | + return $this->view->fetch(); | ||
283 | + } | ||
284 | + | ||
285 | + | ||
286 | + /** | ||
287 | + * 导出 | ||
288 | + */ | ||
289 | + public function export() | ||
290 | + { | ||
291 | + //1.从数据库中导出需要进行要导出的数据 | ||
292 | + $list = Db::name('litestore_goods_spec')->alias('c') | ||
293 | + ->join('fa_litestore_goods g', 'g.goods_id = c.goods_id', 'LEFT') | ||
294 | + ->select(); | ||
295 | + $list = collection($list)->toArray(); | ||
296 | + foreach ($list as &$item) { | ||
297 | + $item['category_name'] = Db::name('litestore_category')->where('id', $item['category_id'])->value('name'); | ||
298 | + if (!empty($item['spec_sku_id'])) { | ||
299 | + $sku_value = explode('_', $item['spec_sku_id']); | ||
300 | + if (count($sku_value) > 1) { | ||
301 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
302 | + $value = Db::name('litestore_spec_value')->where('id', $sku_value[1])->value('spec_value'); | ||
303 | + $item['sku_value'] = $key . '_' . $value; | ||
304 | + } else { | ||
305 | + $key = Db::name('litestore_spec_value')->where('id', $sku_value[0])->value('spec_value'); | ||
306 | + $item['sku_value'] = $key; | ||
307 | + } | ||
308 | + } else { | ||
309 | + $item['sku_value'] = ''; | ||
310 | + } | ||
311 | + } | ||
312 | + if (empty($list)) { | ||
313 | + $this->error('没有可导出的数据'); | ||
314 | + } | ||
315 | + //重要补助 | ||
316 | + //2.加载PHPExcle类库 | ||
317 | + vendor('PHPExcel.PHPExcel'); | ||
318 | + //3.实例化PHPExcel类 | ||
319 | + $objPHPExcel = new \PHPExcel(); | ||
320 | + //4.激活当前的sheet表 | ||
321 | + $objPHPExcel->setActiveSheetIndex(0); | ||
322 | + //5.设置表格头(即excel表格的第一行) | ||
323 | + $objPHPExcel->setActiveSheetIndex(0) | ||
324 | + ->setCellValue('A1', '商品ID') | ||
325 | + ->setCellValue('B1', '商品名称') | ||
326 | + ->setCellValue('C1', '搜索关键词') | ||
327 | + ->setCellValue('D1', '分类名称') | ||
328 | + ->setCellValue('E1', '活动名称(新人用户=1,限时秒杀=2,进口商品=4)') | ||
329 | + ->setCellValue('F1', '商品规格(10=单规格,20=多规格)') | ||
330 | + ->setCellValue('G1', '库存') | ||
331 | + ->setCellValue('H1', '商品规格') | ||
332 | + ->setCellValue('I1', '商品原价') | ||
333 | + ->setCellValue('J1', '折扣') | ||
334 | + ->setCellValue('K1', '商品现价') | ||
335 | + ->setCellValue('L1', '已销数量') | ||
336 | + ->setCellValue('M1', '商品状态(10=上架,20=下架)') | ||
337 | + ->setCellValue('N1', '首页展示(0=未展示,1=已展示)') | ||
338 | + ->setCellValue('O1', '导出时间'); | ||
339 | + //设置A列水平居中 | ||
340 | + $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment() | ||
341 | + ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); | ||
342 | + //设置单元格宽度 | ||
343 | + //6.循环刚取出来的数组,将数据逐一添加到excel表格。 | ||
344 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('A')->setWidth(10); | ||
345 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('B')->setWidth(20); | ||
346 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('C')->setWidth(20); | ||
347 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('D')->setWidth(20); | ||
348 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('E')->setWidth(20); | ||
349 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('F')->setWidth(20); | ||
350 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('G')->setWidth(20); | ||
351 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('H')->setWidth(20); | ||
352 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('I')->setWidth(20); | ||
353 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('J')->setWidth(20); | ||
354 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('K')->setWidth(20); | ||
355 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('L')->setWidth(20); | ||
356 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('M')->setWidth(20); | ||
357 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('N')->setWidth(20); | ||
358 | + $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('O')->setWidth(20); | ||
359 | + | ||
360 | + | ||
361 | + for ($i = 0; $i < count($list); $i++) { | ||
362 | + $objPHPExcel->getActiveSheet()->setCellValue('A' . ($i + 2), $list[$i]['goods_id']);//ID | ||
363 | + $objPHPExcel->getActiveSheet()->setCellValue('B' . ($i + 2), $list[$i]['goods_name']);//商品名称 | ||
364 | + $objPHPExcel->getActiveSheet()->setCellValue('C' . ($i + 2), $list[$i]['keywords']);//商品规格 | ||
365 | + $objPHPExcel->getActiveSheet()->setCellValue('D' . ($i + 2), $list[$i]['category_name']);//原价 | ||
366 | + $objPHPExcel->getActiveSheet()->setCellValue('E' . ($i + 2), $list[$i]['activity_id']);//ID | ||
367 | + $objPHPExcel->getActiveSheet()->setCellValue('F' . ($i + 2), $list[$i]['spec_type']);//标签码 | ||
368 | + $objPHPExcel->getActiveSheet()->setCellValue('G' . ($i + 2), $list[$i]['stock_num']);//ID | ||
369 | + $objPHPExcel->getActiveSheet()->setCellValue('H' . ($i + 2), $list[$i]['sku_value']);//ID | ||
370 | + $objPHPExcel->getActiveSheet()->setCellValue('I' . ($i + 2), $list[$i]['line_price']);//ID | ||
371 | + $objPHPExcel->getActiveSheet()->setCellValue('J' . ($i + 2), $list[$i]['discount']);//ID | ||
372 | + $objPHPExcel->getActiveSheet()->setCellValue('K' . ($i + 2), $list[$i]['goods_price']);//ID | ||
373 | + $objPHPExcel->getActiveSheet()->setCellValue('L' . ($i + 2), $list[$i]['goods_sales']);//ID | ||
374 | + $objPHPExcel->getActiveSheet()->setCellValue('M' . ($i + 2), $list[$i]['goods_status']);//ID | ||
375 | + $objPHPExcel->getActiveSheet()->setCellValue('N' . ($i + 2), $list[$i]['is_index']);//标签码 | ||
376 | + $objPHPExcel->getActiveSheet()->setCellValue('O' . ($i + 2), datetime(time()));//标签码 | ||
377 | + } | ||
378 | + ob_end_clean(); | ||
379 | + ob_start(); | ||
380 | + $title = '商品列表'; | ||
381 | + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); | ||
382 | + header('Content-Disposition:attachment;filename="' . $title . '.xlsx"'); | ||
383 | + header('Cache-Control: max-age=0'); | ||
384 | + header('Cache-Control: max-age=1'); | ||
385 | + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past | ||
386 | + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified | ||
387 | + header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 | ||
388 | + header('Pragma: public'); // HTTP/1.0 | ||
389 | + $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); | ||
390 | + $objWriter->save('php://output'); //文件通过浏览器下载 | ||
391 | + exit(); | ||
392 | + } | ||
393 | + | ||
394 | + /** | ||
395 | + *导入 | ||
396 | + * | ||
397 | + * */ | ||
398 | + public function import() | ||
399 | + { | ||
400 | + $file = $this->request->request('file'); | ||
401 | + if (!$file) { | ||
402 | + $this->error(__('Parameter %s can not be empty', 'file')); | ||
403 | + } | ||
404 | + $filePath = ROOT_PATH . DS . 'public' . DS . $file; | ||
405 | + if (!is_file($filePath)) { | ||
406 | + $this->error(__('No results were found')); | ||
407 | + } | ||
408 | + //实例化reader | ||
409 | + $ext = pathinfo($filePath, PATHINFO_EXTENSION); | ||
410 | + if (!in_array($ext, ['csv', 'xls', 'xlsx'])) { | ||
411 | + $this->error(__('Unknown data format')); | ||
412 | + } | ||
413 | + if ($ext === 'csv') { | ||
414 | + $file = fopen($filePath, 'r'); | ||
415 | + $filePath = tempnam(sys_get_temp_dir(), 'import_csv'); | ||
416 | + $fp = fopen($filePath, "w"); | ||
417 | + $n = 0; | ||
418 | + while ($line = fgets($file)) { | ||
419 | + $line = rtrim($line, "\n\r\0"); | ||
420 | + $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']); | ||
421 | + if ($encoding != 'utf-8') { | ||
422 | + $line = mb_convert_encoding($line, 'utf-8', $encoding); | ||
423 | + } | ||
424 | + if ($n == 0 || preg_match('/^".*"$/', $line)) { | ||
425 | + fwrite($fp, $line . "\n"); | ||
426 | + } else { | ||
427 | + fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n"); | ||
428 | + } | ||
429 | + $n++; | ||
430 | + } | ||
431 | + fclose($file) || fclose($fp); | ||
432 | + $reader = new Csv(); | ||
433 | + } elseif ($ext === 'xls') { | ||
434 | + $reader = new Xls(); | ||
435 | + } else { | ||
436 | + $reader = new Xlsx(); | ||
437 | + } | ||
438 | + set_time_limit(0); | ||
439 | + //加载文件 | ||
440 | + $insert = []; | ||
441 | + try { | ||
442 | + if (!$PHPExcel = $reader->load($filePath)) { | ||
443 | + $this->error(__('Unknown data format')); | ||
444 | + } | ||
445 | + $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 | ||
446 | + $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 | ||
447 | + $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 | ||
448 | + $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); // 一共多少列 | ||
449 | + for ($i = 2; $i <= $allRow; $i++) { | ||
450 | + if (!empty($PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue())) { | ||
451 | + $insert[$i]['goods_name'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();//商品名称 | ||
452 | + $insert[$i]['keywords'] = $PHPExcel->getActiveSheet()->getCell("B" . $i)->getValue();//关键词 | ||
453 | + $category = $PHPExcel->getActiveSheet()->getCell("C" . $i)->getValue() ?? '';//类别 | ||
454 | + $insert[$i]['category_id'] = Db::name('litestore_category')->where('name', $category)->value('id') ?? ''; | ||
455 | + $insert[$i]['activity_id'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue() ?? '';//活动类型 | ||
456 | + $insert[$i]['is_index'] = $PHPExcel->getActiveSheet()->getCell("I" . $i)->getValue() ?? '';//是否首页 | ||
457 | + $insert[$i]['goods_status'] = $PHPExcel->getActiveSheet()->getCell("H" . $i)->getValue() ?? '';//商品状态 | ||
458 | + $spec_insert[$i]['stock_num'] = $PHPExcel->getActiveSheet()->getCell("E" . $i)->getValue() ?? '';//库存 | ||
459 | + $spec_insert[$i]['goods_price'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue() ?? '';//现价 | ||
460 | + $spec_insert[$i]['line_price'] = $PHPExcel->getActiveSheet()->getCell("F" . $i)->getValue() ?? '';//原价 | ||
461 | + } | ||
462 | + } | ||
463 | + } catch (\Exception $exception) { | ||
464 | + $this->error($exception->getMessage()); | ||
465 | + } | ||
466 | + if (!$insert) { | ||
467 | + $this->error(__('No rows were updated')); | ||
468 | + } | ||
469 | + try { | ||
470 | + | ||
471 | + $res_goods = $this->model->saveAll($insert); | ||
472 | + foreach ($spec_insert as $key => &$v) { | ||
473 | + $v['goods_id'] = $res_goods[$key]['goods_id']; | ||
474 | + } | ||
475 | + unset($v); | ||
476 | + $this->spec_model->saveAll($spec_insert); | ||
477 | + } catch (PDOException $exception) { | ||
478 | + $msg = $exception->getMessage(); | ||
479 | + if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) { | ||
480 | + $msg = "导入失败,包含【{$matches[1]}】的记录已存在"; | ||
481 | + }; | ||
482 | + $this->error($msg); | ||
483 | + } catch (\Exception $e) { | ||
484 | + $this->error($e->getMessage()); | ||
485 | + } | ||
486 | + $this->success(); | ||
487 | + } | ||
488 | + | ||
489 | + | ||
490 | +} |
@@ -29,6 +29,7 @@ class Litestoregoods extends Backend | @@ -29,6 +29,7 @@ class Litestoregoods extends Backend | ||
29 | */ | 29 | */ |
30 | protected $model = null; | 30 | protected $model = null; |
31 | protected $spec_model = null; | 31 | protected $spec_model = null; |
32 | + | ||
32 | // protected $searchFields = 'category.name'; | 33 | // protected $searchFields = 'category.name'; |
33 | 34 | ||
34 | public function _initialize() | 35 | public function _initialize() |
@@ -71,7 +72,7 @@ class Litestoregoods extends Backend | @@ -71,7 +72,7 @@ class Litestoregoods extends Backend | ||
71 | if ($this->request->request('keyField')) { | 72 | if ($this->request->request('keyField')) { |
72 | return $this->selectpage(); | 73 | return $this->selectpage(); |
73 | } | 74 | } |
74 | - list($where, $sort, $order, $offset, $limit) = $this->buildparams("category.name",true); | 75 | + list($where, $sort, $order, $offset, $limit) = $this->buildparams("category.name", true); |
75 | $total = $this->model | 76 | $total = $this->model |
76 | ->with(['category', 'activity']) | 77 | ->with(['category', 'activity']) |
77 | ->where($where) | 78 | ->where($where) |
@@ -483,5 +484,19 @@ class Litestoregoods extends Backend | @@ -483,5 +484,19 @@ class Litestoregoods extends Backend | ||
483 | $this->success(); | 484 | $this->success(); |
484 | } | 485 | } |
485 | 486 | ||
486 | - | 487 | + /** |
488 | + * 批量设置折扣 | ||
489 | + */ | ||
490 | + public function discount() | ||
491 | + { | ||
492 | + //接收所选商品id集 | ||
493 | + $goods_ids = $this->request->get('id'); | ||
494 | + $goods_ids = explode(',', $goods_ids); | ||
495 | + //接收所设置的折扣 | ||
496 | + $discount = $this->request->get('discount'); | ||
497 | + foreach ($goods_ids as &$v) { | ||
498 | + Db::name('litestore_goods_spec')->where('goods_id', $v)->update(['discount' => $discount]); | ||
499 | + } | ||
500 | + $this->success('设置成功'); | ||
501 | + } | ||
487 | } | 502 | } |
1 | +<?php | ||
2 | + | ||
3 | +return [ | ||
4 | + 'Goods_id' => 'ID', | ||
5 | + 'Goods_name' => '商品名称', | ||
6 | + 'Category_id' => '商品类别', | ||
7 | + 'Image' => '商品封面', | ||
8 | + 'Images' => '商品轮播图片', | ||
9 | + 'Spec_type' => '商品规格', | ||
10 | + 'Spec_type 10' => '单规格', | ||
11 | + 'Spec_type 20' => '多规格', | ||
12 | + 'Deduct_stock_type' => '库存计算方式', | ||
13 | + 'Deduct_stock_type 10' => '下单减库存', | ||
14 | + 'Deduct_stock_type 20' => '付款减库存', | ||
15 | + 'Content' => '描述详情', | ||
16 | + 'Sales_initial' => '初始销量', | ||
17 | + 'Sales_actual' => '实际销量', | ||
18 | + 'Goods_sort' => '权重', | ||
19 | + 'Delivery_id' => '运费模板ID', | ||
20 | + 'Goods_status' => '商品状态', | ||
21 | + 'Goods_status 10' => '上架', | ||
22 | + 'Goods_status 20' => '下架', | ||
23 | + 'Is_delete' => '是否删除', | ||
24 | + 'Is_delete 0' => '未删除', | ||
25 | + 'Is_delete 1' => '已删除', | ||
26 | + 'Createtime' => '创建时间', | ||
27 | + 'Updatetime' => '更新时间', | ||
28 | + 'Category.name' => '分类名称', | ||
29 | + 'Activity.name' => '活动名称', | ||
30 | + 'Freight.name' => '运费模版名称', | ||
31 | + 'Makefor' => '产地', | ||
32 | + 'Makefor 1' => '国产', | ||
33 | + 'Makefor 2' => '进口', | ||
34 | + 'Number' => '编号', | ||
35 | + 'Keep' => '保存条件', | ||
36 | + 'Packing' => '包装方式', | ||
37 | + 'Brand' => '品牌', | ||
38 | + 'Four_images' => '四宫格图', | ||
39 | + 'Down_image' => '底部图', | ||
40 | + 'Detail_images' => '详情图', | ||
41 | + 'Is_index' => '首页展示', | ||
42 | + 'Is_index 1' => '已展示', | ||
43 | + 'Is_index 0' => '未展示', | ||
44 | + 'Activity_id' => '活动类型', | ||
45 | + 'Price_description' => '价格说明', | ||
46 | + 'Keywords' => '搜索关键词', | ||
47 | +]; |
1 | +<?php | ||
2 | + | ||
3 | +return [ | ||
4 | + 'Goods_id' => 'ID', | ||
5 | + 'Goods_name' => '商品名称', | ||
6 | + 'Category_id' => '商品类别', | ||
7 | + 'Image' => '商品封面', | ||
8 | + 'Images' => '商品轮播图片', | ||
9 | + 'Spec_type' => '商品规格', | ||
10 | + 'Spec_type 10' => '单规格', | ||
11 | + 'Spec_type 20' => '多规格', | ||
12 | + 'Deduct_stock_type' => '库存计算方式', | ||
13 | + 'Deduct_stock_type 10' => '下单减库存', | ||
14 | + 'Deduct_stock_type 20' => '付款减库存', | ||
15 | + 'Content' => '描述详情', | ||
16 | + 'Sales_initial' => '初始销量', | ||
17 | + 'Sales_actual' => '实际销量', | ||
18 | + 'Goods_sort' => '权重', | ||
19 | + 'Delivery_id' => '运费模板ID', | ||
20 | + 'Goods_status' => '商品状态', | ||
21 | + 'Goods_status 10' => '上架', | ||
22 | + 'Goods_status 20' => '下架', | ||
23 | + 'Is_delete' => '是否删除', | ||
24 | + 'Is_delete 0' => '未删除', | ||
25 | + 'Is_delete 1' => '已删除', | ||
26 | + 'Createtime' => '创建时间', | ||
27 | + 'Updatetime' => '更新时间', | ||
28 | + 'Category.name' => '分类名称', | ||
29 | + 'Activity.name' => '活动名称', | ||
30 | + 'Freight.name' => '运费模版名称', | ||
31 | + 'Makefor' => '产地', | ||
32 | + 'Makefor 1' => '国产', | ||
33 | + 'Makefor 2' => '进口', | ||
34 | + 'Number' => '编号', | ||
35 | + 'Keep' => '保存条件', | ||
36 | + 'Packing' => '包装方式', | ||
37 | + 'Brand' => '品牌', | ||
38 | + 'Four_images' => '四宫格图', | ||
39 | + 'Down_image' => '底部图', | ||
40 | + 'Detail_images' => '详情图', | ||
41 | + 'Is_index' => '首页展示', | ||
42 | + 'Is_index 1' => '已展示', | ||
43 | + 'Is_index 0' => '未展示', | ||
44 | + 'Activity_id' => '活动类型', | ||
45 | + 'Price_description' => '价格说明', | ||
46 | + 'Keywords' => '搜索关键词', | ||
47 | +]; |
1 | +<?php | ||
2 | + | ||
3 | +return [ | ||
4 | + 'Goods_id' => 'ID', | ||
5 | + 'Goods_name' => '商品名称', | ||
6 | + 'Category_id' => '商品类别', | ||
7 | + 'Image' => '商品封面', | ||
8 | + 'Images' => '商品轮播图片', | ||
9 | + 'Spec_type' => '商品规格', | ||
10 | + 'Spec_type 10' => '单规格', | ||
11 | + 'Spec_type 20' => '多规格', | ||
12 | + 'Deduct_stock_type' => '库存计算方式', | ||
13 | + 'Deduct_stock_type 10' => '下单减库存', | ||
14 | + 'Deduct_stock_type 20' => '付款减库存', | ||
15 | + 'Content' => '描述详情', | ||
16 | + 'Sales_initial' => '初始销量', | ||
17 | + 'Sales_actual' => '实际销量', | ||
18 | + 'Goods_sort' => '权重', | ||
19 | + 'Delivery_id' => '运费模板ID', | ||
20 | + 'Goods_status' => '商品状态', | ||
21 | + 'Goods_status 10' => '上架', | ||
22 | + 'Goods_status 20' => '下架', | ||
23 | + 'Is_delete' => '是否删除', | ||
24 | + 'Is_delete 0' => '未删除', | ||
25 | + 'Is_delete 1' => '已删除', | ||
26 | + 'Createtime' => '创建时间', | ||
27 | + 'Updatetime' => '更新时间', | ||
28 | + 'Category.name' => '分类名称', | ||
29 | + 'Activity.name' => '活动名称', | ||
30 | + 'Freight.name' => '运费模版名称', | ||
31 | + 'Makefor' => '产地', | ||
32 | + 'Makefor 1' => '国产', | ||
33 | + 'Makefor 2' => '进口', | ||
34 | + 'Number' => '编号', | ||
35 | + 'Keep' => '保存条件', | ||
36 | + 'Packing' => '包装方式', | ||
37 | + 'Brand' => '品牌', | ||
38 | + 'Four_images' => '四宫格图', | ||
39 | + 'Down_image' => '底部图', | ||
40 | + 'Detail_images' => '详情图', | ||
41 | + 'Is_index' => '首页展示', | ||
42 | + 'Is_index 1' => '已展示', | ||
43 | + 'Is_index 0' => '未展示', | ||
44 | + 'Activity_id' => '活动类型', | ||
45 | + 'Price_description' => '价格说明', | ||
46 | + 'Keywords' => '搜索关键词', | ||
47 | +]; |
@@ -153,8 +153,8 @@ class Litestoregoods extends Model | @@ -153,8 +153,8 @@ class Litestoregoods extends Model | ||
153 | $isUpdate && $model->removeAll($this['goods_id']); | 153 | $isUpdate && $model->removeAll($this['goods_id']); |
154 | // 添加规格数据 | 154 | // 添加规格数据 |
155 | if ($data['spec_type'] === '10') { | 155 | if ($data['spec_type'] === '10') { |
156 | - // 单规格 | ||
157 | - $specparams['discount'] = (round($specparams['goods_price'] / $specparams['line_price'], 2) * 10) . '折'; | 156 | +// // 单规格 |
157 | +// $specparams['discount'] = (round($specparams['goods_price'] / $specparams['line_price'], 2) * 10) . '折'; | ||
158 | $this->spec()->save($specparams); | 158 | $this->spec()->save($specparams); |
159 | } else if ($data['spec_type'] === '20') { | 159 | } else if ($data['spec_type'] === '20') { |
160 | // 添加商品与规格关系记录 | 160 | // 添加商品与规格关系记录 |
@@ -31,7 +31,7 @@ class Litestoregoodsspec extends Model | @@ -31,7 +31,7 @@ class Litestoregoodsspec extends Model | ||
31 | $data[] = array_merge($item['form'], [ | 31 | $data[] = array_merge($item['form'], [ |
32 | 'spec_sku_id' => $item['spec_sku_id'], | 32 | 'spec_sku_id' => $item['spec_sku_id'], |
33 | 'goods_id' => $goods_id, | 33 | 'goods_id' => $goods_id, |
34 | - 'discount' => (round($item['form']['goods_price'] / $item['form']['line_price'], 2) * 10) . '折', | 34 | +// 'discount' => (round($item['form']['goods_price'] / $item['form']['line_price'], 2) * 10) . '折', |
35 | 35 | ||
36 | ]); | 36 | ]); |
37 | } | 37 | } |
1 | +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value=""> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value=""> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value=""> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value=""> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="10"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | +<!-- 商品规格属性 start --> | ||
71 | +<div class="goods-spec-many form-group"> | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <!--<div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div>--> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | +</div> | ||
136 | + | ||
137 | +<div class="goods-spec-single"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value=""> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="0"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value=""> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="100"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="1"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | +</div> | ||
169 | +<!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="20"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50"></textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="0">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="0">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="100">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]"></textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value=""> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="1"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value=""> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value=""> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value=""> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" class="form-control form-control" size="50" name="row[detail_images]" placeholder="图片最多添加十张" type="text"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" data-maxcount="10" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" data-maxcount="10" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="10"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
343 | + | ||
344 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> |
1 | +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value="{$row.goods_name}"> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value="{$row.keywords}"> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value="{$row.category_id}"> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value="{$row.activity_id}"> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text" value="{$row.image}"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text" value="{$row.images}"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="$row.spec_type"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | + <!-- 商品规格属性 start --> | ||
71 | + <div class="goods-spec-many form-group" style="display: <?= $row['spec_type'] === '20' ? 'block' : 'none' ?>;" > | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | + </div> | ||
136 | + | ||
137 | + <div class="goods-spec-single" style="display: <?= $row['spec_type'] === '10' ? 'block' : 'none' ?>;"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value="{$row.spec.0.goods_no}"> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="{$row.spec.0.goods_price}"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value="{$row.spec.0.line_price}"> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="{$row.spec.0.stock_num}"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="{$row.spec.0.goods_weight}"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | + </div> | ||
169 | + <!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="$row.deduct_stock_type"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50">{$row.content}</textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="{$row.sales_initial}">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="{$row.sales_actual}">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="{$row.goods_sort}">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="{$row.delivery_id}">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]">{$row.price_description}</textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value="{$row.brand}"> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="$row.makefor"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value="{$row.packing}"> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value="{$row.keep}"> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value="{$row.number}"> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text" value="{$row.down_image}">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text" value="{$row.four_images}">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" placeholder="图片最多添加十张" class="form-control form-control" size="50" name="row[detail_images]" type="text" value="{$row.detail_images}"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="$row.goods_status"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="$row.is_delete"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="$row.is_index"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | + | ||
343 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
344 | + | ||
345 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> | ||
346 | + | ||
347 | +<script type="text/javascript"> | ||
348 | + var from_specData = <?= $row['specData'] ?>; | ||
349 | +</script> |
1 | +<div class="panel panel-default panel-intro"> | ||
2 | + {:build_heading()} | ||
3 | + | ||
4 | + <div class="panel-body"> | ||
5 | + <div id="myTabContent" class="tab-content"> | ||
6 | + <div class="tab-pane fade active in" id="one"> | ||
7 | + <div class="widget-body no-padding"> | ||
8 | + <div id="toolbar" class="toolbar"> | ||
9 | + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}"><i | ||
10 | + class="fa fa-refresh"></i> </a> | ||
11 | +<!-- <a href="javascript:;"--> | ||
12 | +<!-- class="btn btn-success btn-add {:$auth->check('litestore/litestoregoods/add')?'':'hide'}"--> | ||
13 | +<!-- title="{:__('Add')}"><i class="fa fa-plus"></i> {:__('Add')}</a>--> | ||
14 | +<!-- <a href="javascript:;"--> | ||
15 | +<!-- class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('litestore/litestoregoods/edit')?'':'hide'}"--> | ||
16 | +<!-- title="{:__('Edit')}"><i class="fa fa-pencil"></i> {:__('Edit')}</a>--> | ||
17 | + <a href="javascript:;" | ||
18 | + class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('litestore/litestoregoods/del')?'':'hide'}" | ||
19 | + title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a> | ||
20 | + <div class="dropdown btn-group {:$auth->check('litestore/litestoregoods/multi')?'':'hide'}"> | ||
21 | + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-check-square-o"></i> {:__('批量添加活动商品')}</a> | ||
22 | + <ul class="dropdown-menu text-left" role="menu"> | ||
23 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=1"><i class="fa fa-free-code-camp"></i> {:__('新人用户')}</a></li> | ||
24 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=2"><i class="fa fa-clock-o"></i> {:__('限时秒杀')}</a></li> | ||
25 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=3"><i class="fa fa-location-arrow"></i> {:__('进口商品')}</a></li> | ||
26 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=0"><i class="fa fa-eye-slash"></i> {:__('不参与活动')}</a></li> | ||
27 | + </ul> | ||
28 | + </div> | ||
29 | + </div> | ||
30 | + <table id="table" class="table table-striped table-bordered table-hover table-nowrap" | ||
31 | + data-operate-edit="{:$auth->check('litestore/litestoregoods/edit')}" | ||
32 | + data-operate-del="{:$auth->check('litestore/litestoregoods/del')}" | ||
33 | + width="100%"> | ||
34 | + </table> | ||
35 | + </div> | ||
36 | + </div> | ||
37 | + | ||
38 | + </div> | ||
39 | + </div> | ||
40 | +</div> |
1 | +<!-- 商品规格属性模板 --> | ||
2 | +<script id="tpl_spec_attr" type="text/template"> | ||
3 | + <% for(var j=0;j< spec_attr.length;j++){ %> | ||
4 | + <div class="spec-group-item" data-index="<%=j%>" data-group-id="<%=spec_attr[j].group_id%>"> | ||
5 | + <div class="spec-group-name"> | ||
6 | + <span><%=spec_attr[j].group_name%></span> | ||
7 | + <i class="spec-group-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
8 | + </div> | ||
9 | + <div class="spec-list am-cf"> | ||
10 | + <% for(var k=0;k<spec_attr[j].spec_items.length;k++){ %> | ||
11 | + <div class="spec-item am-fl" data-item-index="<%=k%>"> | ||
12 | + <span><%=spec_attr[j].spec_items[k].spec_value%></span> | ||
13 | + <i class="spec-item-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
14 | + </div> | ||
15 | + <% } %> | ||
16 | + <div class="spec-item-add am-cf am-fl"> | ||
17 | + <input type="text" class="ipt-specItem am-fl am-field-valid"> | ||
18 | + <button type="button" class="btn-addSpecItem btn btn-xs btn-success am-fl">添加</button> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + <% } %> | ||
23 | +</script> | ||
24 | + | ||
25 | +<!-- 商品规格table模板 --> | ||
26 | +<script id="tpl_spec_table" type="text/template"> | ||
27 | + <tbody> | ||
28 | + <tr> | ||
29 | + <th>单sku隐藏</th> | ||
30 | + <% for(var i=0;i< spec_attr.length;i++){ %> | ||
31 | + <th><%=spec_attr[i].group_name%></th> | ||
32 | + <% } %> | ||
33 | + <th>商品编码</th> | ||
34 | + <th>销售价</th> | ||
35 | + <th>划线价</th> | ||
36 | + <th>库存(-1隐藏)</th> | ||
37 | + <!--<th>重量(kg)</th>--> | ||
38 | + <th>规格封面</th> | ||
39 | + <th>封面编辑</th> | ||
40 | + </tr> | ||
41 | + <% for(var i=0;i<spec_list.length;i++){ %> | ||
42 | + <tr data-index="<%=i%>" data-sku-id="<%=spec_list[i].spec_sku_id %>"> | ||
43 | + <td> | ||
44 | + <button type="button" class="am-text-middle btn delsku-bt"><% if(spec_list[i].form.stock_num===-1) {%> 显示 <%}else{%> 隐藏 <%} %></button> | ||
45 | + </td> | ||
46 | + <% for(var k=0;k<spec_list[i].rows.length;k++){ %> | ||
47 | + <td class="td-spec-value am-text-middle" rowspan="<%=spec_list[i].rows[k].rowspan%>"> | ||
48 | + <%=spec_list[i].rows[k].spec_value%> | ||
49 | + </td> | ||
50 | + <% } %> | ||
51 | + <td> | ||
52 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="text" name="goods_no" data-rule="required" value="<%=spec_list[i].form.goods_no%>" class="ipt-goods-no am-field-valid"> | ||
53 | + </td> | ||
54 | + <td> | ||
55 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="goods_price" data-rule="required" value="<%=spec_list[i].form.goods_price%>" class="am-field-valid ipt-w80" | ||
56 | + required> | ||
57 | + </td> | ||
58 | + <td> | ||
59 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="line_price" data-rule="required" value="<%=spec_list[i].form.line_price%>" class="am-field-valid ipt-w80"> | ||
60 | + </td> | ||
61 | + <td> | ||
62 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="stock_num" data-rule="required" value="<%=spec_list[i].form.stock_num%>" class="am-field-valid ipt-w80" | ||
63 | + required> | ||
64 | + </td> | ||
65 | + <!--<td> | ||
66 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="goods_weight" data-rule="required" value="<%=spec_list[i].form.goods_weight%>" class="am-field-valid ipt-w80" | ||
67 | + required> | ||
68 | + </td>--> | ||
69 | + <td> | ||
70 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="c-image<%=i%>" class="form-control form-control" style="display: none!important;" name="spec_image" type="text" value="<%=spec_list[i].form.spec_image%>"> | ||
71 | + <div class="row list-inline plupload-preview spe_img_one" id="p-image<%=i%>"></div> | ||
72 | + </td> | ||
73 | + <td> | ||
74 | + <div class="input-group-addon no-border no-padding"> | ||
75 | + <span><button type="button" id="plupload-image<%=i%>" style="display: none!important;" class="btn btn-danger plupload" data-input-id="c-image<%=i%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image<%=i%>"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
76 | + <span><button type="button" <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="fachoose-image<%=i%>" class="btn btn-primary fachoose" data-input-id="c-image<%=i%>" data-mimetype="image/*" data-preview-id="p-image<%=i%>" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
77 | + </div> | ||
78 | + </td> | ||
79 | + </tr> | ||
80 | + <% } %> | ||
81 | + </tbody> | ||
82 | +</script> |
1 | +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value=""> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value=""> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value=""> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value=""> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="10"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | +<!-- 商品规格属性 start --> | ||
71 | +<div class="goods-spec-many form-group"> | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <!--<div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div>--> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | +</div> | ||
136 | + | ||
137 | +<div class="goods-spec-single"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value=""> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="0"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value=""> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="100"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="1"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | +</div> | ||
169 | +<!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="20"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50"></textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="0">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="0">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="100">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]"></textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value=""> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="1"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value=""> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value=""> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value=""> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" class="form-control form-control" size="50" name="row[detail_images]" placeholder="图片最多添加十张" type="text"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" data-maxcount="10" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" data-maxcount="10" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="10"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
343 | + | ||
344 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> |
1 | +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value="{$row.goods_name}"> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value="{$row.keywords}"> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value="{$row.category_id}"> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value="{$row.activity_id}"> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text" value="{$row.image}"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text" value="{$row.images}"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="$row.spec_type"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | + <!-- 商品规格属性 start --> | ||
71 | + <div class="goods-spec-many form-group" style="display: <?= $row['spec_type'] === '20' ? 'block' : 'none' ?>;" > | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | + </div> | ||
136 | + | ||
137 | + <div class="goods-spec-single" style="display: <?= $row['spec_type'] === '10' ? 'block' : 'none' ?>;"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value="{$row.spec.0.goods_no}"> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="{$row.spec.0.goods_price}"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value="{$row.spec.0.line_price}"> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="{$row.spec.0.stock_num}"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="{$row.spec.0.goods_weight}"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | + </div> | ||
169 | + <!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="$row.deduct_stock_type"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50">{$row.content}</textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="{$row.sales_initial}">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="{$row.sales_actual}">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="{$row.goods_sort}">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="{$row.delivery_id}">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]">{$row.price_description}</textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value="{$row.brand}"> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="$row.makefor"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value="{$row.packing}"> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value="{$row.keep}"> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value="{$row.number}"> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text" value="{$row.down_image}">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text" value="{$row.four_images}">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" placeholder="图片最多添加十张" class="form-control form-control" size="50" name="row[detail_images]" type="text" value="{$row.detail_images}"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="$row.goods_status"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="$row.is_delete"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="$row.is_index"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | + | ||
343 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
344 | + | ||
345 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> | ||
346 | + | ||
347 | +<script type="text/javascript"> | ||
348 | + var from_specData = <?= $row['specData'] ?>; | ||
349 | +</script> |
1 | +<div class="panel panel-default panel-intro"> | ||
2 | + {:build_heading()} | ||
3 | + | ||
4 | + <div class="panel-body"> | ||
5 | + <div id="myTabContent" class="tab-content"> | ||
6 | + <div class="tab-pane fade active in" id="one"> | ||
7 | + <div class="widget-body no-padding"> | ||
8 | + <div id="toolbar" class="toolbar"> | ||
9 | + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}"><i | ||
10 | + class="fa fa-refresh"></i> </a> | ||
11 | +<!-- <a href="javascript:;"--> | ||
12 | +<!-- class="btn btn-success btn-add {:$auth->check('litestore/litestoregoods/add')?'':'hide'}"--> | ||
13 | +<!-- title="{:__('Add')}"><i class="fa fa-plus"></i> {:__('Add')}</a>--> | ||
14 | +<!-- <a href="javascript:;"--> | ||
15 | +<!-- class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('litestore/litestoregoods/edit')?'':'hide'}"--> | ||
16 | +<!-- title="{:__('Edit')}"><i class="fa fa-pencil"></i> {:__('Edit')}</a>--> | ||
17 | + <a href="javascript:;" | ||
18 | + class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('litestore/litestoregoods/del')?'':'hide'}" | ||
19 | + title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a> | ||
20 | + <div class="dropdown btn-group {:$auth->check('litestore/litestoregoods/multi')?'':'hide'}"> | ||
21 | + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-check-square-o"></i> {:__('批量添加活动商品')}</a> | ||
22 | + <ul class="dropdown-menu text-left" role="menu"> | ||
23 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=1"><i class="fa fa-free-code-camp"></i> {:__('新人用户')}</a></li> | ||
24 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=2"><i class="fa fa-clock-o"></i> {:__('限时秒杀')}</a></li> | ||
25 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=3"><i class="fa fa-location-arrow"></i> {:__('进口商品')}</a></li> | ||
26 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=0"><i class="fa fa-eye-slash"></i> {:__('不参与活动')}</a></li> | ||
27 | + </ul> | ||
28 | + </div> | ||
29 | + </div> | ||
30 | + <table id="table" class="table table-striped table-bordered table-hover table-nowrap" | ||
31 | + data-operate-edit="{:$auth->check('litestore/litestoregoods/edit')}" | ||
32 | + data-operate-del="{:$auth->check('litestore/litestoregoods/del')}" | ||
33 | + width="100%"> | ||
34 | + </table> | ||
35 | + </div> | ||
36 | + </div> | ||
37 | + | ||
38 | + </div> | ||
39 | + </div> | ||
40 | +</div> |
1 | +<!-- 商品规格属性模板 --> | ||
2 | +<script id="tpl_spec_attr" type="text/template"> | ||
3 | + <% for(var j=0;j< spec_attr.length;j++){ %> | ||
4 | + <div class="spec-group-item" data-index="<%=j%>" data-group-id="<%=spec_attr[j].group_id%>"> | ||
5 | + <div class="spec-group-name"> | ||
6 | + <span><%=spec_attr[j].group_name%></span> | ||
7 | + <i class="spec-group-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
8 | + </div> | ||
9 | + <div class="spec-list am-cf"> | ||
10 | + <% for(var k=0;k<spec_attr[j].spec_items.length;k++){ %> | ||
11 | + <div class="spec-item am-fl" data-item-index="<%=k%>"> | ||
12 | + <span><%=spec_attr[j].spec_items[k].spec_value%></span> | ||
13 | + <i class="spec-item-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
14 | + </div> | ||
15 | + <% } %> | ||
16 | + <div class="spec-item-add am-cf am-fl"> | ||
17 | + <input type="text" class="ipt-specItem am-fl am-field-valid"> | ||
18 | + <button type="button" class="btn-addSpecItem btn btn-xs btn-success am-fl">添加</button> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + <% } %> | ||
23 | +</script> | ||
24 | + | ||
25 | +<!-- 商品规格table模板 --> | ||
26 | +<script id="tpl_spec_table" type="text/template"> | ||
27 | + <tbody> | ||
28 | + <tr> | ||
29 | + <th>单sku隐藏</th> | ||
30 | + <% for(var i=0;i< spec_attr.length;i++){ %> | ||
31 | + <th><%=spec_attr[i].group_name%></th> | ||
32 | + <% } %> | ||
33 | + <th>商品编码</th> | ||
34 | + <th>销售价</th> | ||
35 | + <th>划线价</th> | ||
36 | + <th>库存(-1隐藏)</th> | ||
37 | + <!--<th>重量(kg)</th>--> | ||
38 | + <th>规格封面</th> | ||
39 | + <th>封面编辑</th> | ||
40 | + </tr> | ||
41 | + <% for(var i=0;i<spec_list.length;i++){ %> | ||
42 | + <tr data-index="<%=i%>" data-sku-id="<%=spec_list[i].spec_sku_id %>"> | ||
43 | + <td> | ||
44 | + <button type="button" class="am-text-middle btn delsku-bt"><% if(spec_list[i].form.stock_num===-1) {%> 显示 <%}else{%> 隐藏 <%} %></button> | ||
45 | + </td> | ||
46 | + <% for(var k=0;k<spec_list[i].rows.length;k++){ %> | ||
47 | + <td class="td-spec-value am-text-middle" rowspan="<%=spec_list[i].rows[k].rowspan%>"> | ||
48 | + <%=spec_list[i].rows[k].spec_value%> | ||
49 | + </td> | ||
50 | + <% } %> | ||
51 | + <td> | ||
52 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="text" name="goods_no" data-rule="required" value="<%=spec_list[i].form.goods_no%>" class="ipt-goods-no am-field-valid"> | ||
53 | + </td> | ||
54 | + <td> | ||
55 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="goods_price" data-rule="required" value="<%=spec_list[i].form.goods_price%>" class="am-field-valid ipt-w80" | ||
56 | + required> | ||
57 | + </td> | ||
58 | + <td> | ||
59 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="line_price" data-rule="required" value="<%=spec_list[i].form.line_price%>" class="am-field-valid ipt-w80"> | ||
60 | + </td> | ||
61 | + <td> | ||
62 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="stock_num" data-rule="required" value="<%=spec_list[i].form.stock_num%>" class="am-field-valid ipt-w80" | ||
63 | + required> | ||
64 | + </td> | ||
65 | + <!--<td> | ||
66 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="goods_weight" data-rule="required" value="<%=spec_list[i].form.goods_weight%>" class="am-field-valid ipt-w80" | ||
67 | + required> | ||
68 | + </td>--> | ||
69 | + <td> | ||
70 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="c-image<%=i%>" class="form-control form-control" style="display: none!important;" name="spec_image" type="text" value="<%=spec_list[i].form.spec_image%>"> | ||
71 | + <div class="row list-inline plupload-preview spe_img_one" id="p-image<%=i%>"></div> | ||
72 | + </td> | ||
73 | + <td> | ||
74 | + <div class="input-group-addon no-border no-padding"> | ||
75 | + <span><button type="button" id="plupload-image<%=i%>" style="display: none!important;" class="btn btn-danger plupload" data-input-id="c-image<%=i%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image<%=i%>"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
76 | + <span><button type="button" <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="fachoose-image<%=i%>" class="btn btn-primary fachoose" data-input-id="c-image<%=i%>" data-mimetype="image/*" data-preview-id="p-image<%=i%>" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
77 | + </div> | ||
78 | + </td> | ||
79 | + </tr> | ||
80 | + <% } %> | ||
81 | + </tbody> | ||
82 | +</script> |
1 | +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value=""> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value=""> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value=""> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value=""> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="10"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | +<!-- 商品规格属性 start --> | ||
71 | +<div class="goods-spec-many form-group"> | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <!--<div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div>--> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | +</div> | ||
136 | + | ||
137 | +<div class="goods-spec-single"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value=""> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="0"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value=""> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="100"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="1"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | +</div> | ||
169 | +<!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="20"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50"></textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="0">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="0">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="100">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]"></textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value=""> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="1"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value=""> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value=""> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value=""> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" class="form-control form-control" size="50" name="row[detail_images]" placeholder="图片最多添加十张" type="text"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" data-maxcount="10" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" data-maxcount="10" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="10"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
343 | + | ||
344 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> |
1 | +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> | ||
2 | + | ||
3 | + <div class="form-group"> | ||
4 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_name')}:</label> | ||
5 | + <div class="col-xs-12 col-sm-8"> | ||
6 | + <input id="c-goods_name" data-rule="required" class="form-control form-control" name="row[goods_name]" type="text" value="{$row.goods_name}"> | ||
7 | + </div> | ||
8 | + </div> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label> | ||
11 | + <div class="col-xs-12 col-sm-8"> | ||
12 | + <input id="c-keywords" data-rule="required" class="form-control form-control" name="row[keywords]" type="text" value="{$row.keywords}"> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | ||
17 | + <div class="col-xs-12 col-sm-8"> | ||
18 | + <input id="c-category_id" data-rule="required" data-source="litestore/litestorecategory/selectpage" class="form-control selectpage form-control" name="row[category_id]" type="text" value="{$row.category_id}"> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + <div class="form-group"> | ||
22 | + <label class="control-label col-xs-12 col-sm-2">{:__('Activity_id')}:</label> | ||
23 | + <div class="col-xs-12 col-sm-8"> | ||
24 | + <input id="c-activity_id" data-source="activity/index" class="form-control selectpage" name="row[activity_id]" type="text" value="{$row.activity_id}"> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="form-group"> | ||
28 | + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label> | ||
29 | + <div class="col-xs-12 col-sm-8"> | ||
30 | + <div class="input-group"> | ||
31 | + <input id="c-image" data-rule="required" class="form-control form-control" size="50" name="row[image]" type="text" value="{$row.image}"> | ||
32 | + <div class="input-group-addon no-border no-padding"> | ||
33 | + <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
34 | + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
35 | + </div> | ||
36 | + <span class="msg-box n-right" for="c-image"></span> | ||
37 | + </div> | ||
38 | + <ul class="row list-inline plupload-preview" id="p-image"></ul> | ||
39 | + <span class="help-block">建议尺寸:宽110,高110</span> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label> | ||
44 | + <div class="col-xs-12 col-sm-8"> | ||
45 | + <div class="input-group"> | ||
46 | + <input id="c-images" data-rule="required" class="form-control form-control" size="50" name="row[images]" type="text" value="{$row.images}"> | ||
47 | + <div class="input-group-addon no-border no-padding"> | ||
48 | + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
49 | + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
50 | + </div> | ||
51 | + <span class="msg-box n-right" for="c-images"></span> | ||
52 | + </div> | ||
53 | + <ul class="row list-inline plupload-preview" id="p-images"></ul> | ||
54 | + <span class="help-block">建议尺寸:宽375,高375</span> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | + <div class="form-group"> | ||
58 | + <label class="control-label col-xs-12 col-sm-2">{:__('Spec_type')}:</label> | ||
59 | + <div class="col-xs-12 col-sm-8"> | ||
60 | + | ||
61 | + <select id="c-spec_type" data-rule="required" class="form-control selectpicker" name="row[spec_type]"> | ||
62 | + {foreach name="specTypeList" item="vo"} | ||
63 | + <option value="{$key}" {in name="key" value="$row.spec_type"}selected{/in}>{$vo}</option> | ||
64 | + {/foreach} | ||
65 | + </select> | ||
66 | + | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + | ||
70 | + <!-- 商品规格属性 start --> | ||
71 | + <div class="goods-spec-many form-group" style="display: <?= $row['spec_type'] === '20' ? 'block' : 'none' ?>;" > | ||
72 | + <!-- <label class="control-label col-xs-12 col-sm-2"></label>--> | ||
73 | + <div class="goods-spec-box col-xs-12 col-sm-11" style="background-color: white;"> | ||
74 | + <!-- 规格属性 --> | ||
75 | + <div class="spec-attr"></div> | ||
76 | + | ||
77 | + <!-- 添加规格:按钮 --> | ||
78 | + <div class="spec-group-button"> | ||
79 | + <button type="button" class="btn-addSpecGroup btn btn-xs btn-success">添加规格</button> | ||
80 | + </div> | ||
81 | + | ||
82 | + <!-- 添加规格:表单 --> | ||
83 | + <div class="spec-group-add"> | ||
84 | + <div class="spec-group-add-item form-group"> | ||
85 | + <label class="control-label form-require">规格名 </label> | ||
86 | + <input type="text" class="input-specName tpl-form-input" | ||
87 | + placeholder="请输入规格名称"> | ||
88 | + </div> | ||
89 | + <div class="spec-group-add-item form-group"> | ||
90 | + <label class="control-label form-require">规格值 </label> | ||
91 | + <input type="text" class="input-specValue tpl-form-input" | ||
92 | + placeholder="请输入规格值"> | ||
93 | + </div> | ||
94 | + <div class="spec-group-add-item margin-top"> | ||
95 | + <button type="button" class="btn-addSpecName btn btn-xs btn-success"> 确定 | ||
96 | + </button> | ||
97 | + <button type="button" class="btn-cancleAddSpecName btn btn-xs btn-default"> 取消 | ||
98 | + </button> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <!-- 商品多规格sku信息 --> | ||
102 | + <div class="goods-sku scrollable-horizontal"> | ||
103 | + <!-- 分割线 --> | ||
104 | + <div class="goods-spec-line"></div> | ||
105 | + <!-- sku 批量设置 --> | ||
106 | + <div class="spec-batch form-inline"> | ||
107 | + <div class="form-group"> | ||
108 | + <label class="control-label">批量设置</label> | ||
109 | + </div> | ||
110 | + <div class="form-group"> | ||
111 | + <input type="text" data-type="goods_no" placeholder="商家编码"> | ||
112 | + </div> | ||
113 | + <div class="form-group"> | ||
114 | + <input type="number" data-type="goods_price" placeholder="销售价"> | ||
115 | + </div> | ||
116 | + <div class="form-group"> | ||
117 | + <input type="number" data-type="line_price" placeholder="划线价"> | ||
118 | + </div> | ||
119 | + <div class="form-group"> | ||
120 | + <input type="number" data-type="stock_num" placeholder="库存数量"> | ||
121 | + </div> | ||
122 | + <div class="form-group"> | ||
123 | + <input type="number" data-type="goods_weight" placeholder="重量"> | ||
124 | + </div> | ||
125 | + <div class="form-group"> | ||
126 | + <button type="button" class="btn-specBatchBtn btn btn-sm btn-secondary | ||
127 | + radius">确定 | ||
128 | + </button> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <!-- sku table --> | ||
132 | + <table class="spec-sku-tabel table table-bordered table-centered margin-bottom-xs text-nowrap"></table> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | + </div> | ||
136 | + | ||
137 | + <div class="goods-spec-single" style="display: <?= $row['spec_type'] === '10' ? 'block' : 'none' ?>;"> | ||
138 | + <div class="form-group"> | ||
139 | + <label class="control-label col-xs-12 col-sm-2">商品编码:</label> | ||
140 | + <div class="col-xs-12 col-sm-8"> | ||
141 | + <input id="c-goods_no" class="form-control form-control" name="spec[goods_no]" type="text" value="{$row.spec.0.goods_no}"> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + <div class="form-group"> | ||
145 | + <label class="control-label col-xs-12 col-sm-2">商品价格:</label> | ||
146 | + <div class="col-xs-12 col-sm-8"> | ||
147 | + <input id="c-goods_price" data-rule="required" class="form-control form-control" name="spec[goods_price]" type="number" value="{$row.spec.0.goods_price}"> | ||
148 | + </div> | ||
149 | + </div> | ||
150 | + <div class="form-group"> | ||
151 | + <label class="control-label col-xs-12 col-sm-2">商品划线价:</label> | ||
152 | + <div class="col-xs-12 col-sm-8"> | ||
153 | + <input id="c-line_price" class="form-control form-control" name="spec[line_price]" type="number" value="{$row.spec.0.line_price}"> | ||
154 | + </div> | ||
155 | + </div> | ||
156 | + <div class="form-group"> | ||
157 | + <label class="control-label col-xs-12 col-sm-2">当前库存数量:</label> | ||
158 | + <div class="col-xs-12 col-sm-8"> | ||
159 | + <input id="c-stock_num" class="form-control form-control" name="spec[stock_num]" type="number" value="{$row.spec.0.stock_num}"> | ||
160 | + </div> | ||
161 | + </div> | ||
162 | + <!--<div class="form-group"> | ||
163 | + <label class="control-label col-xs-12 col-sm-2">商品重量(Kg):</label> | ||
164 | + <div class="col-xs-12 col-sm-8"> | ||
165 | + <input id="c-goods_weight" class="form-control form-control" name="spec[goods_weight]" type="number" value="{$row.spec.0.goods_weight}"> | ||
166 | + </div> | ||
167 | + </div>--> | ||
168 | + </div> | ||
169 | + <!-- 商品规格属性 end --> | ||
170 | + | ||
171 | + <div class="form-group"> | ||
172 | + <label class="control-label col-xs-12 col-sm-2">{:__('Deduct_stock_type')}:</label> | ||
173 | + <div class="col-xs-12 col-sm-8"> | ||
174 | + | ||
175 | + <select id="c-deduct_stock_type" data-rule="required" class="form-control selectpicker" name="row[deduct_stock_type]"> | ||
176 | + {foreach name="deductStockTypeList" item="vo"} | ||
177 | + <option value="{$key}" {in name="key" value="$row.deduct_stock_type"}selected{/in}>{$vo}</option> | ||
178 | + {/foreach} | ||
179 | + </select> | ||
180 | + | ||
181 | + </div> | ||
182 | + </div> | ||
183 | +<!-- <div class="form-group">--> | ||
184 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>--> | ||
185 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
186 | +<!-- <textarea id="c-content" data-rule="required" class="form-control editor form-control" rows="5" name="row[content]" cols="50">{$row.content}</textarea>--> | ||
187 | +<!-- </div>--> | ||
188 | +<!-- </div>--> | ||
189 | +<!-- <div class="form-group">--> | ||
190 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_initial')}:</label>--> | ||
191 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
192 | +<!-- <input id="c-sales_initial" data-rule="required" class="form-control form-control" name="row[sales_initial]" type="number" value="{$row.sales_initial}">--> | ||
193 | +<!-- </div>--> | ||
194 | +<!-- </div>--> | ||
195 | +<!-- <div class="form-group">--> | ||
196 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sales_actual')}:</label>--> | ||
197 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
198 | +<!-- <input id="c-sales_actual" data-rule="required" class="form-control form-control" name="row[sales_actual]" type="number" value="{$row.sales_actual}">--> | ||
199 | +<!-- </div>--> | ||
200 | +<!-- </div>--> | ||
201 | +<!-- <div class="form-group">--> | ||
202 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Goods_sort')}:</label>--> | ||
203 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
204 | +<!-- <input id="c-goods_sort" data-rule="required" class="form-control form-control" name="row[goods_sort]" type="number" value="{$row.goods_sort}">--> | ||
205 | +<!-- </div>--> | ||
206 | +<!-- </div>--> | ||
207 | +<!-- <div class="form-group">--> | ||
208 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Delivery_id')}:</label>--> | ||
209 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
210 | +<!-- <input id="c-delivery_id" data-rule="required" data-source="litestore/litestorefreight/index" class="form-control selectpage form-control" name="row[delivery_id]" type="text" value="{$row.delivery_id}">--> | ||
211 | +<!-- </div>--> | ||
212 | +<!-- </div>--> | ||
213 | + <div class="form-group"> | ||
214 | + <label class="control-label col-xs-12 col-sm-2">{:__('Price_description')}:</label> | ||
215 | + <div class="col-xs-12 col-sm-8"> | ||
216 | + <textarea id="c-price_description" data-rule="required" class="form-control" name="row[price_description]">{$row.price_description}</textarea> | ||
217 | + </div> | ||
218 | + </div> | ||
219 | + <div class="form-group"> | ||
220 | + <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label> | ||
221 | + <div class="col-xs-12 col-sm-8"> | ||
222 | + <input id="c-brand" data-rule="required" class="form-control form-control" name="row[brand]" type="text" value="{$row.brand}"> | ||
223 | + </div> | ||
224 | + </div> | ||
225 | + <div class="form-group"> | ||
226 | + <label class="control-label col-xs-12 col-sm-2">{:__('Makefor')}:</label> | ||
227 | + <div class="col-xs-12 col-sm-8"> | ||
228 | + <div class="radio"> | ||
229 | + {foreach name="makeforList" item="vo"} | ||
230 | + <label for="row[makefor]-{$key}"><input id="row[makefor]-{$key}" name="row[makefor]" type="radio" value="{$key}" {in name="key" value="$row.makefor"}checked{/in} /> {$vo}</label> | ||
231 | + {/foreach} | ||
232 | + </div> | ||
233 | + </div> | ||
234 | + </div> | ||
235 | + <div class="form-group"> | ||
236 | + <label class="control-label col-xs-12 col-sm-2">{:__('Packing')}:</label> | ||
237 | + <div class="col-xs-12 col-sm-8"> | ||
238 | + <input id="c-packing" data-rule="required" class="form-control form-control" name="row[packing]" type="text" value="{$row.packing}"> | ||
239 | + </div> | ||
240 | + </div> | ||
241 | + <div class="form-group"> | ||
242 | + <label class="control-label col-xs-12 col-sm-2">{:__('Keep')}:</label> | ||
243 | + <div class="col-xs-12 col-sm-8"> | ||
244 | + <input id="c-keep" data-rule="required" class="form-control form-control" name="row[keep]" type="text" value="{$row.keep}"> | ||
245 | + </div> | ||
246 | + </div> | ||
247 | + <div class="form-group"> | ||
248 | + <label class="control-label col-xs-12 col-sm-2">{:__('Number')}:</label> | ||
249 | + <div class="col-xs-12 col-sm-8"> | ||
250 | + <input id="c-number" data-rule="required" class="form-control form-control" name="row[number]" type="text" value="{$row.number}"> | ||
251 | + </div> | ||
252 | + </div> | ||
253 | +<!-- <div class="form-group">--> | ||
254 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Down_image')}:</label>--> | ||
255 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
256 | +<!-- <div class="input-group">--> | ||
257 | +<!-- <input id="c-down_image" data-rule="required" class="form-control form-control" size="50" name="row[down_image]" type="text" value="{$row.down_image}">--> | ||
258 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
259 | +<!-- <span><button type="button" id="plupload-down_image" class="btn btn-danger plupload" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false" data-preview-id="p-down_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
260 | +<!-- <span><button type="button" id="fachoose-down_image" class="btn btn-primary fachoose" data-input-id="c-down_image" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
261 | +<!-- </div>--> | ||
262 | +<!-- <span class="msg-box n-right" for="c-down_image"></span>--> | ||
263 | +<!-- </div>--> | ||
264 | +<!-- <ul class="row list-inline plupload-preview" id="p-down_image"></ul>--> | ||
265 | +<!-- <span class="help-block">建议尺寸:宽375,高267</span>--> | ||
266 | +<!-- </div>--> | ||
267 | +<!-- </div>--> | ||
268 | +<!-- <div class="form-group">--> | ||
269 | +<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Four_images')}:</label>--> | ||
270 | +<!-- <div class="col-xs-12 col-sm-8">--> | ||
271 | +<!-- <div class="input-group">--> | ||
272 | +<!-- <input id="c-four_images" data-rule="required" class="form-control form-control" size="50" name="row[four_images]" type="text" value="{$row.four_images}">--> | ||
273 | +<!-- <div class="input-group-addon no-border no-padding">--> | ||
274 | +<!-- <span><button type="button" id="plupload-four_images" class="btn btn-danger plupload" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true" data-preview-id="p-four_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>--> | ||
275 | +<!-- <span><button type="button" id="fachoose-four_images" class="btn btn-primary fachoose" data-input-id="c-four_images" data-mimetype="image/jpeg,image/png,image/jpg" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>--> | ||
276 | +<!-- </div>--> | ||
277 | +<!-- <span class="msg-box n-right" for="c-four_images"></span>--> | ||
278 | +<!-- </div>--> | ||
279 | +<!-- <ul class="row list-inline plupload-preview" id="p-four_images"></ul>--> | ||
280 | +<!-- <span class="help-block">建议尺寸:宽185,高185</span>--> | ||
281 | +<!-- </div>--> | ||
282 | +<!-- </div>--> | ||
283 | + <div class="form-group"> | ||
284 | + <label class="control-label col-xs-12 col-sm-2">{:__('Detail_images')}:</label> | ||
285 | + <div class="col-xs-12 col-sm-8"> | ||
286 | + <div class="input-group"> | ||
287 | + <input id="c-detail_images" data-rule="required" placeholder="图片最多添加十张" class="form-control form-control" size="50" name="row[detail_images]" type="text" value="{$row.detail_images}"> | ||
288 | + <div class="input-group-addon no-border no-padding"> | ||
289 | + <span><button type="button" id="plupload-detail_images" class="btn btn-danger plupload" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true" data-preview-id="p-detail_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
290 | + <span><button type="button" id="fachoose-detail_images" class="btn btn-primary fachoose" data-input-id="c-detail_images" data-mimetype="image/jpeg,image/png,image/jpg" data-maxcount="10" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
291 | + </div> | ||
292 | + <span class="msg-box n-right" for="c-detail_images"></span> | ||
293 | + </div> | ||
294 | + <ul class="row list-inline plupload-preview" id="p-detail_images"></ul> | ||
295 | + <span class="help-block">建议尺寸:宽185,高185</span> | ||
296 | + </div> | ||
297 | + </div> | ||
298 | + <div class="form-group"> | ||
299 | + <label class="control-label col-xs-12 col-sm-2">{:__('Goods_status')}:</label> | ||
300 | + <div class="col-xs-12 col-sm-8"> | ||
301 | + | ||
302 | + <div class="radio"> | ||
303 | + {foreach name="goodsStatusList" item="vo"} | ||
304 | + <label for="row[goods_status]-{$key}"><input id="row[goods_status]-{$key}" name="row[goods_status]" type="radio" value="{$key}" {in name="key" value="$row.goods_status"}checked{/in} /> {$vo}</label> | ||
305 | + {/foreach} | ||
306 | + </div> | ||
307 | + | ||
308 | + </div> | ||
309 | + </div> | ||
310 | + <div class="form-group"> | ||
311 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_delete')}:</label> | ||
312 | + <div class="col-xs-12 col-sm-8"> | ||
313 | + | ||
314 | + <select id="c-is_delete" data-rule="required" class="form-control selectpicker" name="row[is_delete]"> | ||
315 | + {foreach name="isDeleteList" item="vo"} | ||
316 | + <option value="{$key}" {in name="key" value="$row.is_delete"}selected{/in}>{$vo}</option> | ||
317 | + {/foreach} | ||
318 | + </select> | ||
319 | + | ||
320 | + </div> | ||
321 | + </div> | ||
322 | + <div class="form-group"> | ||
323 | + <label class="control-label col-xs-12 col-sm-2">{:__('Is_index')}:</label> | ||
324 | + <div class="col-xs-12 col-sm-8"> | ||
325 | + | ||
326 | + <select id="c-is_index" data-rule="required" class="form-control selectpicker" name="row[is_index]"> | ||
327 | + {foreach name="isIndexList" item="vo"} | ||
328 | + <option value="{$key}" {in name="key" value="$row.is_index"}selected{/in}>{$vo}</option> | ||
329 | + {/foreach} | ||
330 | + </select> | ||
331 | + | ||
332 | + </div> | ||
333 | + </div> | ||
334 | + <div class="form-group layer-footer"> | ||
335 | + <label class="control-label col-xs-12 col-sm-2"></label> | ||
336 | + <div class="col-xs-12 col-sm-8"> | ||
337 | + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button> | ||
338 | + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> | ||
339 | + </div> | ||
340 | + </div> | ||
341 | +</form> | ||
342 | + | ||
343 | +{include file="litestore/litestoregoods/spec_many_template" /} | ||
344 | + | ||
345 | +<link rel="stylesheet" href="__CDN__/assets/addons/litestore/css/litestoregoods.css"> | ||
346 | + | ||
347 | +<script type="text/javascript"> | ||
348 | + var from_specData = <?= $row['specData'] ?>; | ||
349 | +</script> |
1 | +<div class="panel panel-default panel-intro"> | ||
2 | + {:build_heading()} | ||
3 | + | ||
4 | + <div class="panel-body"> | ||
5 | + <div id="myTabContent" class="tab-content"> | ||
6 | + <div class="tab-pane fade active in" id="one"> | ||
7 | + <div class="widget-body no-padding"> | ||
8 | + <div id="toolbar" class="toolbar"> | ||
9 | + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}"><i | ||
10 | + class="fa fa-refresh"></i> </a> | ||
11 | +<!-- <a href="javascript:;"--> | ||
12 | +<!-- class="btn btn-success btn-add {:$auth->check('litestore/litestoregoods/add')?'':'hide'}"--> | ||
13 | +<!-- title="{:__('Add')}"><i class="fa fa-plus"></i> {:__('Add')}</a>--> | ||
14 | +<!-- <a href="javascript:;"--> | ||
15 | +<!-- class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('litestore/litestoregoods/edit')?'':'hide'}"--> | ||
16 | +<!-- title="{:__('Edit')}"><i class="fa fa-pencil"></i> {:__('Edit')}</a>--> | ||
17 | + <a href="javascript:;" | ||
18 | + class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('litestore/litestoregoods/del')?'':'hide'}" | ||
19 | + title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a> | ||
20 | + <div class="dropdown btn-group {:$auth->check('litestore/litestoregoods/multi')?'':'hide'}"> | ||
21 | + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-check-square-o"></i> {:__('批量添加活动商品')}</a> | ||
22 | + <ul class="dropdown-menu text-left" role="menu"> | ||
23 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=1"><i class="fa fa-free-code-camp"></i> {:__('新人用户')}</a></li> | ||
24 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=2"><i class="fa fa-clock-o"></i> {:__('限时秒杀')}</a></li> | ||
25 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=3"><i class="fa fa-location-arrow"></i> {:__('进口商品')}</a></li> | ||
26 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=0"><i class="fa fa-eye-slash"></i> {:__('不参与活动')}</a></li> | ||
27 | + </ul> | ||
28 | + </div> | ||
29 | + </div> | ||
30 | + <table id="table" class="table table-striped table-bordered table-hover table-nowrap" | ||
31 | + data-operate-edit="{:$auth->check('litestore/litestoregoods/edit')}" | ||
32 | + data-operate-del="{:$auth->check('litestore/litestoregoods/del')}" | ||
33 | + width="100%"> | ||
34 | + </table> | ||
35 | + </div> | ||
36 | + </div> | ||
37 | + | ||
38 | + </div> | ||
39 | + </div> | ||
40 | +</div> |
1 | +<!-- 商品规格属性模板 --> | ||
2 | +<script id="tpl_spec_attr" type="text/template"> | ||
3 | + <% for(var j=0;j< spec_attr.length;j++){ %> | ||
4 | + <div class="spec-group-item" data-index="<%=j%>" data-group-id="<%=spec_attr[j].group_id%>"> | ||
5 | + <div class="spec-group-name"> | ||
6 | + <span><%=spec_attr[j].group_name%></span> | ||
7 | + <i class="spec-group-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
8 | + </div> | ||
9 | + <div class="spec-list am-cf"> | ||
10 | + <% for(var k=0;k<spec_attr[j].spec_items.length;k++){ %> | ||
11 | + <div class="spec-item am-fl" data-item-index="<%=k%>"> | ||
12 | + <span><%=spec_attr[j].spec_items[k].spec_value%></span> | ||
13 | + <i class="spec-item-delete fa fa-trash icon-shanchu1" title="点击删除"></i> | ||
14 | + </div> | ||
15 | + <% } %> | ||
16 | + <div class="spec-item-add am-cf am-fl"> | ||
17 | + <input type="text" class="ipt-specItem am-fl am-field-valid"> | ||
18 | + <button type="button" class="btn-addSpecItem btn btn-xs btn-success am-fl">添加</button> | ||
19 | + </div> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + <% } %> | ||
23 | +</script> | ||
24 | + | ||
25 | +<!-- 商品规格table模板 --> | ||
26 | +<script id="tpl_spec_table" type="text/template"> | ||
27 | + <tbody> | ||
28 | + <tr> | ||
29 | + <th>单sku隐藏</th> | ||
30 | + <% for(var i=0;i< spec_attr.length;i++){ %> | ||
31 | + <th><%=spec_attr[i].group_name%></th> | ||
32 | + <% } %> | ||
33 | + <th>商品编码</th> | ||
34 | + <th>销售价</th> | ||
35 | + <th>划线价</th> | ||
36 | + <th>库存(-1隐藏)</th> | ||
37 | + <!--<th>重量(kg)</th>--> | ||
38 | + <th>规格封面</th> | ||
39 | + <th>封面编辑</th> | ||
40 | + </tr> | ||
41 | + <% for(var i=0;i<spec_list.length;i++){ %> | ||
42 | + <tr data-index="<%=i%>" data-sku-id="<%=spec_list[i].spec_sku_id %>"> | ||
43 | + <td> | ||
44 | + <button type="button" class="am-text-middle btn delsku-bt"><% if(spec_list[i].form.stock_num===-1) {%> 显示 <%}else{%> 隐藏 <%} %></button> | ||
45 | + </td> | ||
46 | + <% for(var k=0;k<spec_list[i].rows.length;k++){ %> | ||
47 | + <td class="td-spec-value am-text-middle" rowspan="<%=spec_list[i].rows[k].rowspan%>"> | ||
48 | + <%=spec_list[i].rows[k].spec_value%> | ||
49 | + </td> | ||
50 | + <% } %> | ||
51 | + <td> | ||
52 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="text" name="goods_no" data-rule="required" value="<%=spec_list[i].form.goods_no%>" class="ipt-goods-no am-field-valid"> | ||
53 | + </td> | ||
54 | + <td> | ||
55 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="goods_price" data-rule="required" value="<%=spec_list[i].form.goods_price%>" class="am-field-valid ipt-w80" | ||
56 | + required> | ||
57 | + </td> | ||
58 | + <td> | ||
59 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> type="number" name="line_price" data-rule="required" value="<%=spec_list[i].form.line_price%>" class="am-field-valid ipt-w80"> | ||
60 | + </td> | ||
61 | + <td> | ||
62 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="stock_num" data-rule="required" value="<%=spec_list[i].form.stock_num%>" class="am-field-valid ipt-w80" | ||
63 | + required> | ||
64 | + </td> | ||
65 | + <!--<td> | ||
66 | + <input <% if(spec_list[i].form.stock_num===-1) {%>disabled <%}else{%> <%} %> type="number" name="goods_weight" data-rule="required" value="<%=spec_list[i].form.goods_weight%>" class="am-field-valid ipt-w80" | ||
67 | + required> | ||
68 | + </td>--> | ||
69 | + <td> | ||
70 | + <input <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="c-image<%=i%>" class="form-control form-control" style="display: none!important;" name="spec_image" type="text" value="<%=spec_list[i].form.spec_image%>"> | ||
71 | + <div class="row list-inline plupload-preview spe_img_one" id="p-image<%=i%>"></div> | ||
72 | + </td> | ||
73 | + <td> | ||
74 | + <div class="input-group-addon no-border no-padding"> | ||
75 | + <span><button type="button" id="plupload-image<%=i%>" style="display: none!important;" class="btn btn-danger plupload" data-input-id="c-image<%=i%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image<%=i%>"><i class="fa fa-upload"></i> {:__('Upload')}</button></span> | ||
76 | + <span><button type="button" <% if(spec_list[i].form.stock_num===-1) {%> disabled <%}else{%> <%} %> id="fachoose-image<%=i%>" class="btn btn-primary fachoose" data-input-id="c-image<%=i%>" data-mimetype="image/*" data-preview-id="p-image<%=i%>" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span> | ||
77 | + </div> | ||
78 | + </td> | ||
79 | + </tr> | ||
80 | + <% } %> | ||
81 | + </tbody> | ||
82 | +</script> |
@@ -11,12 +11,15 @@ | @@ -11,12 +11,15 @@ | ||
11 | <a href="javascript:;" | 11 | <a href="javascript:;" |
12 | class="btn btn-success btn-add {:$auth->check('litestore/litestoregoods/add')?'':'hide'}" | 12 | class="btn btn-success btn-add {:$auth->check('litestore/litestoregoods/add')?'':'hide'}" |
13 | title="{:__('Add')}"><i class="fa fa-plus"></i> {:__('Add')}</a> | 13 | title="{:__('Add')}"><i class="fa fa-plus"></i> {:__('Add')}</a> |
14 | +<!-- <a href="javascript:;"--> | ||
15 | +<!-- class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('litestore/litestoregoods/edit')?'':'hide'}"--> | ||
16 | +<!-- title="{:__('Edit')}"><i class="fa fa-pencil"></i> {:__('Edit')}</a>--> | ||
14 | <a href="javascript:;" | 17 | <a href="javascript:;" |
15 | - class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('litestore/litestoregoods/edit')?'':'hide'}" | ||
16 | - title="{:__('Edit')}"><i class="fa fa-pencil"></i> {:__('Edit')}</a> | ||
17 | - <a href="javascript:;" | ||
18 | - class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('litestore/litestoregoods/del')?'':'hide'}" | ||
19 | - title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a> | 18 | + class="btn btn-success btn-discount btn-disabled disabled {:$auth->check('litestore/litestoregoods/discount')?'':'hide'}" |
19 | + title="{:__('设置折扣')}"><i class="fa fa-pencil"></i> {:__('批量设置折扣')}</a> | ||
20 | +<!-- <a href="javascript:;"--> | ||
21 | +<!-- class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('litestore/litestoregoods/del')?'':'hide'}"--> | ||
22 | +<!-- title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a>--> | ||
20 | <a href="javascript:;" | 23 | <a href="javascript:;" |
21 | class="btn btn-danger btn-import {:$auth->check('litestore/litestoregoods/import')?'':'hide'}" | 24 | class="btn btn-danger btn-import {:$auth->check('litestore/litestoregoods/import')?'':'hide'}" |
22 | title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" | 25 | title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" |
@@ -26,18 +29,18 @@ | @@ -26,18 +29,18 @@ | ||
26 | <!-- class="btn btn-info btn-change btn-export btn-disable" data-params="action=export"--> | 29 | <!-- class="btn btn-info btn-change btn-export btn-disable" data-params="action=export"--> |
27 | <!-- data-url="litestore/litestoregoods/export"--> | 30 | <!-- data-url="litestore/litestoregoods/export"--> |
28 | <!-- title="{:__('批量导出')}"><i class="fa fa-download"></i>{:__('批量导出')}</a>--> | 31 | <!-- title="{:__('批量导出')}"><i class="fa fa-download"></i>{:__('批量导出')}</a>--> |
29 | - <a href="javascript:;" | ||
30 | - class="btn btn-info btn-export {:$auth->check('litestore/litestoregoods/export')?'':'hide'}" | ||
31 | - title="{:__('Export')}" id="btn-export-file"><i class="fa fa-download"></i> 批量导出</a> | 32 | + <a href="javascript:;" class="btn btn-info btn-export {:$auth->check('litestore/litestoregoods/export')?'':'hide'}" title="{:__('Export')}" id="btn-export-file"><i class="fa fa-download"></i> 批量导出</a> |
32 | <a href="{$template}" class="btn btn-info"><i class="fa fa-folder-open"></i> {:__('导入模板下载')}</a> | 33 | <a href="{$template}" class="btn btn-info"><i class="fa fa-folder-open"></i> {:__('导入模板下载')}</a> |
33 | 34 | ||
34 | - <!-- <div class="dropdown btn-group {:$auth->check('litestore/litestoregoods/multi')?'':'hide'}">--> | ||
35 | - <!-- <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>--> | ||
36 | - <!-- <ul class="dropdown-menu text-left" role="menu">--> | ||
37 | - <!-- <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>--> | ||
38 | - <!-- <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>--> | ||
39 | - <!-- </ul>--> | ||
40 | - <!-- </div>--> | 35 | + <div class="dropdown btn-group {:$auth->check('litestore/litestoregoods/multi')?'':'hide'}"> |
36 | + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-check-square-o"></i> {:__('批量添加活动商品')}</a> | ||
37 | + <ul class="dropdown-menu text-left" role="menu"> | ||
38 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=1"><i class="fa fa-free-code-camp"></i> {:__('新人用户')}</a></li> | ||
39 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=2"><i class="fa fa-clock-o"></i> {:__('限时秒杀')}</a></li> | ||
40 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=3"><i class="fa fa-location-arrow"></i> {:__('进口商品')}</a></li> | ||
41 | + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="activity_id=0"><i class="fa fa-eye-slash"></i> {:__('不参与活动')}</a></li> | ||
42 | + </ul> | ||
43 | + </div> | ||
41 | </div> | 44 | </div> |
42 | <table id="table" class="table table-striped table-bordered table-hover table-nowrap" | 45 | <table id="table" class="table table-striped table-bordered table-hover table-nowrap" |
43 | data-operate-edit="{:$auth->check('litestore/litestoregoods/edit')}" | 46 | data-operate-edit="{:$auth->check('litestore/litestoregoods/edit')}" |
@@ -418,7 +418,7 @@ class Classification extends Api | @@ -418,7 +418,7 @@ class Classification extends Api | ||
418 | $item['line_price'] = round($goods_spec['line_price'], 2); | 418 | $item['line_price'] = round($goods_spec['line_price'], 2); |
419 | //判断是否打折 | 419 | //判断是否打折 |
420 | $item['is_discount'] = 'is'; | 420 | $item['is_discount'] = 'is'; |
421 | - if ($goods_spec['goods_price'] == $goods_spec['line_price']) { | 421 | + if (empty($goods_spec['discount'])) { |
422 | $item['is_discount'] = 'no'; | 422 | $item['is_discount'] = 'no'; |
423 | } | 423 | } |
424 | $item['discount'] = $goods_spec['discount']; | 424 | $item['discount'] = $goods_spec['discount']; |
@@ -459,7 +459,7 @@ class Classification extends Api | @@ -459,7 +459,7 @@ class Classification extends Api | ||
459 | $spec_value['cart_number'] = $number ?? 0; | 459 | $spec_value['cart_number'] = $number ?? 0; |
460 | //判断是否打折 | 460 | //判断是否打折 |
461 | $spec_value['is_discount'] = 'is'; | 461 | $spec_value['is_discount'] = 'is'; |
462 | - if ($spec_value['goods_price'] == $spec_value['line_price']) { | 462 | + if (empty($spec_value['discount'])) { |
463 | $spec_value['is_discount'] = 'no'; | 463 | $spec_value['is_discount'] = 'no'; |
464 | } | 464 | } |
465 | } | 465 | } |
@@ -488,7 +488,7 @@ class Classification extends Api | @@ -488,7 +488,7 @@ class Classification extends Api | ||
488 | $item['line_price'] = round($goods_spec['line_price'], 2); | 488 | $item['line_price'] = round($goods_spec['line_price'], 2); |
489 | //判断是否打折 | 489 | //判断是否打折 |
490 | $item['is_discount'] = 'is'; | 490 | $item['is_discount'] = 'is'; |
491 | - if ($goods_spec['goods_price'] == $goods_spec['line_price']) { | 491 | + if (empty($goods_spec['discount'])) { |
492 | $item['is_discount'] = 'no'; | 492 | $item['is_discount'] = 'no'; |
493 | } | 493 | } |
494 | $item['discount'] = $goods_spec['discount']; | 494 | $item['discount'] = $goods_spec['discount']; |
@@ -530,7 +530,7 @@ class Classification extends Api | @@ -530,7 +530,7 @@ class Classification extends Api | ||
530 | $spec_value['cart_number'] = $number ?? 0; | 530 | $spec_value['cart_number'] = $number ?? 0; |
531 | //判断是否打折 | 531 | //判断是否打折 |
532 | $spec_value['is_discount'] = 'is'; | 532 | $spec_value['is_discount'] = 'is'; |
533 | - if ($spec_value['goods_price'] == $spec_value['line_price']) { | 533 | + if (empty($spec_value['discount'])) { |
534 | $spec_value['is_discount'] = 'no'; | 534 | $spec_value['is_discount'] = 'no'; |
535 | } | 535 | } |
536 | } | 536 | } |
@@ -62,7 +62,7 @@ class Goods extends Api | @@ -62,7 +62,7 @@ class Goods extends Api | ||
62 | $goods['line_price'] = $goods_spec['line_price']; | 62 | $goods['line_price'] = $goods_spec['line_price']; |
63 | //判断是否打折 | 63 | //判断是否打折 |
64 | $goods['is_discount'] = 'is'; | 64 | $goods['is_discount'] = 'is'; |
65 | - if ($goods_spec['goods_price'] == $goods_spec['line_price']) { | 65 | + if (empty($goods_spec['discount'])) { |
66 | $goods['is_discount'] = 'no'; | 66 | $goods['is_discount'] = 'no'; |
67 | } | 67 | } |
68 | $goods['discount'] = $goods_spec['discount']; | 68 | $goods['discount'] = $goods_spec['discount']; |
@@ -161,7 +161,7 @@ class Goods extends Api | @@ -161,7 +161,7 @@ class Goods extends Api | ||
161 | } | 161 | } |
162 | //判断是否打折 | 162 | //判断是否打折 |
163 | $value['is_discount'] = 'is'; | 163 | $value['is_discount'] = 'is'; |
164 | - if ($value['goods_price'] == $value['line_price']) { | 164 | + if (empty($value['discount'])) { |
165 | $value['is_discount'] = 'no'; | 165 | $value['is_discount'] = 'no'; |
166 | } | 166 | } |
167 | } | 167 | } |
1 | +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template', 'litestoregoods'], function ($, undefined, Backend, Table, Form, Template, litestoregoods) { | ||
2 | + | ||
3 | + var Controller = { | ||
4 | + index: function () { | ||
5 | + $(".btn-add").data("area", ["1000px", "800px"]); | ||
6 | + // 初始化表格参数配置 | ||
7 | + Table.api.init({ | ||
8 | + extend: { | ||
9 | + index_url: 'activity_goods/import_goods/index', | ||
10 | + add_url: 'litestore/litestoregoods/add', | ||
11 | + edit_url: 'litestore/litestoregoods/edit', | ||
12 | + del_url: 'litestore/litestoregoods/del', | ||
13 | + discount_url: 'litestore/litestoregoods/discount', | ||
14 | + multi_url: 'litestore/litestoregoods/multi', | ||
15 | + import_url: 'litestore/litestoregoods/import', | ||
16 | + table: 'litestore_goods', | ||
17 | + } | ||
18 | + }); | ||
19 | + | ||
20 | + var table = $("#table"); | ||
21 | + | ||
22 | + // 初始化表格 | ||
23 | + table.bootstrapTable({ | ||
24 | + url: $.fn.bootstrapTable.defaults.extend.index_url, | ||
25 | + pk: 'goods_id', | ||
26 | + sortName: 'goods_sort', | ||
27 | + search: false, | ||
28 | + showExport: false, | ||
29 | + columns: [ | ||
30 | + [ | ||
31 | + {checkbox: true}, | ||
32 | + {field: 'goods_id', title: __('Goods_id')}, | ||
33 | + {field: 'goods_name', title: __('Goods_name'), operate: 'LIKE'}, | ||
34 | + {field: 'keywords', title: __('Keywords'), operate: 'LIKE'}, | ||
35 | + {field: 'category.name', title: __('Category.name'), operate: 'LIKE'}, | ||
36 | + {field: 'activity.name', title: __('Activity.name'), operate: 'LIKE'}, | ||
37 | + // {field: 'category_id', visible: false, title: __('Category_id')}, | ||
38 | + {field: 'image', title: __('Image'), formatter: Table.api.formatter.image}, | ||
39 | + {field: 'images', title: __('Images'), formatter: Table.api.formatter.images}, | ||
40 | + { | ||
41 | + field: 'spec_type', | ||
42 | + title: __('Spec_type'), | ||
43 | + searchList: {"10": __('Spec_type 10'), "20": __('Spec_type 20')}, | ||
44 | + formatter: Table.api.formatter.normal | ||
45 | + }, | ||
46 | + {field: 'stock_num', title: __('库存'), operate: false}, | ||
47 | + // {field: 'deduct_stock_type', title: __('Deduct_stock_type'), searchList: {"10":__('Deduct_stock_type 10'),"20":__('Deduct_stock_type 20')}, formatter: Table.api.formatter.normal}, | ||
48 | + // {field: 'freight.name', title: __('Freight.name')}, | ||
49 | + // {field: 'sales_initial', title: __('Sales_initial')}, | ||
50 | + {field: 'sales_actual', title: __('Sales_actual')}, | ||
51 | + // {field: 'goods_sort', title: __('Goods_sort')}, | ||
52 | + // {field: 'delivery_id', title: __('Delivery_id')}, | ||
53 | + { | ||
54 | + field: 'goods_status', | ||
55 | + title: __('Goods_status'), | ||
56 | + searchList: {"10": __('Goods_status 10'), "20": __('Goods_status 20')}, | ||
57 | + formatter: Table.api.formatter.status | ||
58 | + }, | ||
59 | + { | ||
60 | + field: 'is_delete', | ||
61 | + title: __('Is_delete'), | ||
62 | + searchList: {"0": __('Is_delete 0'), "1": __('Is_delete 1')}, | ||
63 | + formatter: Table.api.formatter.normal | ||
64 | + }, | ||
65 | + { | ||
66 | + field: 'is_index', | ||
67 | + title: __('Is_index'), | ||
68 | + searchList: {"0": __('Is_index 0'), "1": __('Is_index 1')}, | ||
69 | + formatter: Table.api.formatter.normal | ||
70 | + }, | ||
71 | + { | ||
72 | + field: 'createtime', | ||
73 | + title: __('Createtime'), | ||
74 | + operate: 'RANGE', | ||
75 | + addclass: 'datetimerange', | ||
76 | + formatter: Table.api.formatter.datetime | ||
77 | + }, | ||
78 | + { | ||
79 | + field: 'updatetime', | ||
80 | + title: __('Updatetime'), | ||
81 | + operate: 'RANGE', | ||
82 | + addclass: 'datetimerange', | ||
83 | + formatter: Table.api.formatter.datetime | ||
84 | + }, | ||
85 | + { | ||
86 | + field: 'operate', | ||
87 | + title: __('Operate'), | ||
88 | + table: table, | ||
89 | + events: Table.api.events.operate, | ||
90 | + formatter: Table.api.formatter.operate | ||
91 | + } | ||
92 | + ] | ||
93 | + ] | ||
94 | + }); | ||
95 | + | ||
96 | + | ||
97 | + | ||
98 | + | ||
99 | + | ||
100 | + table.on('.btn-discount', function (e, settings, json, xhr) { | ||
101 | + Fast.api.open() | ||
102 | + }); | ||
103 | + //*************************** 自定义export开始 | ||
104 | + var submitForm = function (ids, layero) { | ||
105 | + var options = table.bootstrapTable('getOptions'); | ||
106 | + console.log(options); | ||
107 | + var columns = []; | ||
108 | + $.each(options.columns[0], function (i, j) { | ||
109 | + if (j.field && !j.checkbox && j.visible && j.field != 'operate') { | ||
110 | + columns.push(j.field); | ||
111 | + } | ||
112 | + }); | ||
113 | + var search = options.queryParams({}); | ||
114 | + $("input[name=search]", layero).val(options.searchText); | ||
115 | + $("input[name=ids]", layero).val(ids); | ||
116 | + $("input[name=filter]", layero).val(search.filter); | ||
117 | + $("input[name=op]", layero).val(search.op); | ||
118 | + $("input[name=columns]", layero).val(columns.join(',')); | ||
119 | + $("form", layero).submit(); | ||
120 | + }; | ||
121 | + $(document).on("click", ".btn-export", function () { | ||
122 | + var ids = Table.api.selectedids(table); | ||
123 | + var page = table.bootstrapTable('getData'); | ||
124 | + var all = table.bootstrapTable('getOptions').totalRows; | ||
125 | + console.log(ids, page, all); | ||
126 | + Layer.confirm("请选择导出的选项<form action='" + Fast.api.fixurl("litestore/litestoregoods/export") + "' method='post' target='_blank'><input type='hidden' name='ids' value='' /><input type='hidden' name='filter' ><input type='hidden' name='op'><input type='hidden' name='search'><input type='hidden' name='columns'></form>", { | ||
127 | + title: '导出数据', | ||
128 | + btn: ["导出(" + all + "条)"], | ||
129 | + // btn: ["选中项(" + ids.length + "条)"], | ||
130 | + success: function (layero, index) { | ||
131 | + $(".layui-layer-btn a", layero).addClass("layui-layer-btn0"); | ||
132 | + } | ||
133 | + , yes: function (index, layero) { | ||
134 | + submitForm(ids.join(","), layero); | ||
135 | + return false; | ||
136 | + } | ||
137 | + , | ||
138 | + btn2: function (index, layero) { | ||
139 | + var ids = []; | ||
140 | + $.each(page, function (i, j) { | ||
141 | + ids.push(j.id); | ||
142 | + }); | ||
143 | + submitForm(ids.join(","), layero); | ||
144 | + return false; | ||
145 | + } | ||
146 | + , | ||
147 | + btn3: function (index, layero) { | ||
148 | + submitForm("all", layero); | ||
149 | + return false; | ||
150 | + } | ||
151 | + }) | ||
152 | + }); | ||
153 | + //*************************** 自定义export结束 | ||
154 | + // 为表格绑定事件 | ||
155 | + Table.api.bindevent(table); | ||
156 | + table.on('load-success.bs.table', function (data) { | ||
157 | + $(".btn-editone").data("area", ["1000px", "800px"]); | ||
158 | + }); | ||
159 | + | ||
160 | + }, | ||
161 | + add: function () { | ||
162 | + Form.api.bindevent($("form[role=form]"), function (data, ret) { | ||
163 | + Fast.api.close(data); | ||
164 | + Toastr.success("商品提交成功"); | ||
165 | + }, function (data, ret) { | ||
166 | + Toastr.success("商品提交失败"); | ||
167 | + }, function (success, error) { | ||
168 | + //注意如果我们需要阻止表单,可以在此使用return false;即可 | ||
169 | + //如果我们处理完成需要再次提交表单则可以使用submit提交,如下 | ||
170 | + console.log(this); | ||
171 | + var form = this; | ||
172 | + if (form.size() === 0) { | ||
173 | + Toastr.error("表单未初始化完成,无法提交"); | ||
174 | + return false; | ||
175 | + } | ||
176 | + var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET'; | ||
177 | + type = type && (type === 'GET' || type === 'POST') ? type : 'GET'; | ||
178 | + url = form.attr("action"); | ||
179 | + url = url ? url : location.href; | ||
180 | + //修复当存在多选项元素时提交的BUG | ||
181 | + var params = {}; | ||
182 | + var multipleList = $("[name$='[]']", form); | ||
183 | + if (multipleList.size() > 0) { | ||
184 | + var postFields = form.serializeArray().map(function (obj) { | ||
185 | + return $(obj).prop("name"); | ||
186 | + }); | ||
187 | + $.each(multipleList, function (i, j) { | ||
188 | + if (postFields.indexOf($(this).prop("name")) < 0) { | ||
189 | + params[$(this).prop("name")] = ''; | ||
190 | + } | ||
191 | + }); | ||
192 | + } | ||
193 | + var dataParam = {spec_many: specMany.getData()}; | ||
194 | + console.log(dataParam); | ||
195 | + Fast.api.ajax({ | ||
196 | + type: type, | ||
197 | + url: url, | ||
198 | + data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : '') + (Object.keys(dataParam).length > 0 ? '&' + $.param(dataParam) : ''), | ||
199 | + dataType: 'json', | ||
200 | + complete: function (xhr) { | ||
201 | + var token = xhr.getResponseHeader('__token__'); | ||
202 | + if (token) { | ||
203 | + $("input[name='__token__']", form).val(token); | ||
204 | + } | ||
205 | + if (xhr.responseJSON.code == 1) { | ||
206 | + //关闭弹窗 | ||
207 | + var index = parent.Layer.getFrameIndex(window.name); | ||
208 | + var callback = parent.$("#layui-layer" + index).data("callback"); | ||
209 | + parent.Layer.close(index); | ||
210 | + //刷新列表 | ||
211 | + parent.$("#table").bootstrapTable('refresh'); | ||
212 | + } | ||
213 | + } | ||
214 | + }, function (data, ret) { | ||
215 | + $('.form-group', form).removeClass('has-feedback has-success has-error'); | ||
216 | + if (data && typeof data === 'object') { | ||
217 | + if (typeof data.token !== 'undefined') { | ||
218 | + $("input[name='__token__']", form).val(data.token); | ||
219 | + } | ||
220 | + if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') { | ||
221 | + data.callback.call(form, data); | ||
222 | + } | ||
223 | + } | ||
224 | + }, function (data, ret) { | ||
225 | + if (data && typeof data === 'object' && typeof data.token !== 'undefined') { | ||
226 | + $("input[name='__token__']", form).val(data.token); | ||
227 | + } | ||
228 | + }); | ||
229 | + return false; | ||
230 | + }); | ||
231 | + | ||
232 | + // 注册商品多规格组件 | ||
233 | + var specMany = new GoodsSpec({ | ||
234 | + container: '.goods-spec-many', | ||
235 | + OutForm: Form | ||
236 | + }); | ||
237 | + | ||
238 | + // 切换单/多规格 | ||
239 | + $('select[name="row[spec_type]"').change(function (e) { | ||
240 | + var $goodsSpecMany = $('.goods-spec-many') | ||
241 | + , $goodsSpecSingle = $('.goods-spec-single'); | ||
242 | + if (e.currentTarget.value === '10') { | ||
243 | + $goodsSpecMany.hide() && $goodsSpecSingle.show(); | ||
244 | + } else { | ||
245 | + $goodsSpecMany.show() && $goodsSpecSingle.hide(); | ||
246 | + } | ||
247 | + }); | ||
248 | + | ||
249 | + | ||
250 | + }, | ||
251 | + edit: function () { | ||
252 | + //Controller.api.bindevent(); | ||
253 | + | ||
254 | + Form.api.bindevent($("form[role=form]"), function (data, ret) { | ||
255 | + //Fast.api.close(data); | ||
256 | + Toastr.success("商品提交成功"); | ||
257 | + }, function (data, ret) { | ||
258 | + Toastr.success("商品提交失败"); | ||
259 | + }, function (success, error) { | ||
260 | + //注意如果我们需要阻止表单,可以在此使用return false;即可 | ||
261 | + //如果我们处理完成需要再次提交表单则可以使用submit提交,如下 | ||
262 | + console.log(this); | ||
263 | + var form = this; | ||
264 | + if (form.size() === 0) { | ||
265 | + Toastr.error("表单未初始化完成,无法提交"); | ||
266 | + return false; | ||
267 | + } | ||
268 | + var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET'; | ||
269 | + type = type && (type === 'GET' || type === 'POST') ? type : 'GET'; | ||
270 | + url = form.attr("action"); | ||
271 | + url = url ? url : location.href; | ||
272 | + //修复当存在多选项元素时提交的BUG | ||
273 | + var params = {}; | ||
274 | + var multipleList = $("[name$='[]']", form); | ||
275 | + if (multipleList.size() > 0) { | ||
276 | + var postFields = form.serializeArray().map(function (obj) { | ||
277 | + return $(obj).prop("name"); | ||
278 | + }); | ||
279 | + $.each(multipleList, function (i, j) { | ||
280 | + if (postFields.indexOf($(this).prop("name")) < 0) { | ||
281 | + params[$(this).prop("name")] = ''; | ||
282 | + } | ||
283 | + }); | ||
284 | + } | ||
285 | + var dataParam = {spec_many: specMany.getData()}; | ||
286 | + console.log(dataParam); | ||
287 | + Fast.api.ajax({ | ||
288 | + type: type, | ||
289 | + url: url, | ||
290 | + data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : '') + (Object.keys(dataParam).length > 0 ? '&' + $.param(dataParam) : ''), | ||
291 | + dataType: 'json', | ||
292 | + complete: function (xhr) { | ||
293 | + var token = xhr.getResponseHeader('__token__'); | ||
294 | + if (token) { | ||
295 | + $("input[name='__token__']", form).val(token); | ||
296 | + } | ||
297 | + if (xhr.responseJSON.code == 1) { | ||
298 | + //关闭弹窗 | ||
299 | + var index = parent.Layer.getFrameIndex(window.name); | ||
300 | + var callback = parent.$("#layui-layer" + index).data("callback"); | ||
301 | + parent.Layer.close(index); | ||
302 | + //刷新列表 | ||
303 | + parent.$("#table").bootstrapTable('refresh'); | ||
304 | + } | ||
305 | + } | ||
306 | + }, function (data, ret) { | ||
307 | + $('.form-group', form).removeClass('has-feedback has-success has-error'); | ||
308 | + if (data && typeof data === 'object') { | ||
309 | + if (typeof data.token !== 'undefined') { | ||
310 | + $("input[name='__token__']", form).val(data.token); | ||
311 | + } | ||
312 | + if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') { | ||
313 | + data.callback.call(form, data); | ||
314 | + } | ||
315 | + } | ||
316 | + }, function (data, ret) { | ||
317 | + if (data && typeof data === 'object' && typeof data.token !== 'undefined') { | ||
318 | + $("input[name='__token__']", form).val(data.token); | ||
319 | + } | ||
320 | + }); | ||
321 | + return false; | ||
322 | + }); | ||
323 | + // 注册商品多规格组件 | ||
324 | + var specMany = new GoodsSpec({ | ||
325 | + container: '.goods-spec-many', | ||
326 | + OutForm: Form | ||
327 | + }, from_specData); | ||
328 | + | ||
329 | + // 切换单/多规格 | ||
330 | + $('select[name="row[spec_type]"').change(function (e) { | ||
331 | + var $goodsSpecMany = $('.goods-spec-many') | ||
332 | + , $goodsSpecSingle = $('.goods-spec-single'); | ||
333 | + if (e.currentTarget.value === '10') { | ||
334 | + $goodsSpecMany.hide() && $goodsSpecSingle.show(); | ||
335 | + } else { | ||
336 | + $goodsSpecMany.show() && $goodsSpecSingle.hide(); | ||
337 | + } | ||
338 | + }); | ||
339 | + }, | ||
340 | + api: { | ||
341 | + bindevent: function () { | ||
342 | + Form.api.bindevent($("form[role=form]")); | ||
343 | + } | ||
344 | + } | ||
345 | + }; | ||
346 | + return Controller; | ||
347 | +}); |
1 | +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template', 'litestoregoods'], function ($, undefined, Backend, Table, Form, Template, litestoregoods) { | ||
2 | + | ||
3 | + var Controller = { | ||
4 | + index: function () { | ||
5 | + $(".btn-add").data("area", ["1000px", "800px"]); | ||
6 | + // 初始化表格参数配置 | ||
7 | + Table.api.init({ | ||
8 | + extend: { | ||
9 | + index_url: 'activity_goods/new_goods/index', | ||
10 | + add_url: 'litestore/litestoregoods/add', | ||
11 | + edit_url: 'litestore/litestoregoods/edit', | ||
12 | + del_url: 'litestore/litestoregoods/del', | ||
13 | + discount_url: 'litestore/litestoregoods/discount', | ||
14 | + multi_url: 'litestore/litestoregoods/multi', | ||
15 | + import_url: 'litestore/litestoregoods/import', | ||
16 | + table: 'litestore_goods', | ||
17 | + } | ||
18 | + }); | ||
19 | + | ||
20 | + var table = $("#table"); | ||
21 | + | ||
22 | + // 初始化表格 | ||
23 | + table.bootstrapTable({ | ||
24 | + url: $.fn.bootstrapTable.defaults.extend.index_url, | ||
25 | + pk: 'goods_id', | ||
26 | + sortName: 'goods_sort', | ||
27 | + search: false, | ||
28 | + showExport: false, | ||
29 | + columns: [ | ||
30 | + [ | ||
31 | + {checkbox: true}, | ||
32 | + {field: 'goods_id', title: __('Goods_id')}, | ||
33 | + {field: 'goods_name', title: __('Goods_name'), operate: 'LIKE'}, | ||
34 | + {field: 'keywords', title: __('Keywords'), operate: 'LIKE'}, | ||
35 | + {field: 'category.name', title: __('Category.name'), operate: 'LIKE'}, | ||
36 | + {field: 'activity.name', title: __('Activity.name'), operate: 'LIKE'}, | ||
37 | + // {field: 'category_id', visible: false, title: __('Category_id')}, | ||
38 | + {field: 'image', title: __('Image'), formatter: Table.api.formatter.image}, | ||
39 | + {field: 'images', title: __('Images'), formatter: Table.api.formatter.images}, | ||
40 | + { | ||
41 | + field: 'spec_type', | ||
42 | + title: __('Spec_type'), | ||
43 | + searchList: {"10": __('Spec_type 10'), "20": __('Spec_type 20')}, | ||
44 | + formatter: Table.api.formatter.normal | ||
45 | + }, | ||
46 | + {field: 'stock_num', title: __('库存'), operate: false}, | ||
47 | + // {field: 'deduct_stock_type', title: __('Deduct_stock_type'), searchList: {"10":__('Deduct_stock_type 10'),"20":__('Deduct_stock_type 20')}, formatter: Table.api.formatter.normal}, | ||
48 | + // {field: 'freight.name', title: __('Freight.name')}, | ||
49 | + // {field: 'sales_initial', title: __('Sales_initial')}, | ||
50 | + {field: 'sales_actual', title: __('Sales_actual')}, | ||
51 | + // {field: 'goods_sort', title: __('Goods_sort')}, | ||
52 | + // {field: 'delivery_id', title: __('Delivery_id')}, | ||
53 | + { | ||
54 | + field: 'goods_status', | ||
55 | + title: __('Goods_status'), | ||
56 | + searchList: {"10": __('Goods_status 10'), "20": __('Goods_status 20')}, | ||
57 | + formatter: Table.api.formatter.status | ||
58 | + }, | ||
59 | + { | ||
60 | + field: 'is_delete', | ||
61 | + title: __('Is_delete'), | ||
62 | + searchList: {"0": __('Is_delete 0'), "1": __('Is_delete 1')}, | ||
63 | + formatter: Table.api.formatter.normal | ||
64 | + }, | ||
65 | + { | ||
66 | + field: 'is_index', | ||
67 | + title: __('Is_index'), | ||
68 | + searchList: {"0": __('Is_index 0'), "1": __('Is_index 1')}, | ||
69 | + formatter: Table.api.formatter.normal | ||
70 | + }, | ||
71 | + { | ||
72 | + field: 'createtime', | ||
73 | + title: __('Createtime'), | ||
74 | + operate: 'RANGE', | ||
75 | + addclass: 'datetimerange', | ||
76 | + formatter: Table.api.formatter.datetime | ||
77 | + }, | ||
78 | + { | ||
79 | + field: 'updatetime', | ||
80 | + title: __('Updatetime'), | ||
81 | + operate: 'RANGE', | ||
82 | + addclass: 'datetimerange', | ||
83 | + formatter: Table.api.formatter.datetime | ||
84 | + }, | ||
85 | + { | ||
86 | + field: 'operate', | ||
87 | + title: __('Operate'), | ||
88 | + table: table, | ||
89 | + events: Table.api.events.operate, | ||
90 | + formatter: Table.api.formatter.operate | ||
91 | + } | ||
92 | + ] | ||
93 | + ] | ||
94 | + }); | ||
95 | + | ||
96 | + | ||
97 | + | ||
98 | + | ||
99 | + | ||
100 | + table.on('.btn-discount', function (e, settings, json, xhr) { | ||
101 | + Fast.api.open() | ||
102 | + }); | ||
103 | + //*************************** 自定义export开始 | ||
104 | + var submitForm = function (ids, layero) { | ||
105 | + var options = table.bootstrapTable('getOptions'); | ||
106 | + console.log(options); | ||
107 | + var columns = []; | ||
108 | + $.each(options.columns[0], function (i, j) { | ||
109 | + if (j.field && !j.checkbox && j.visible && j.field != 'operate') { | ||
110 | + columns.push(j.field); | ||
111 | + } | ||
112 | + }); | ||
113 | + var search = options.queryParams({}); | ||
114 | + $("input[name=search]", layero).val(options.searchText); | ||
115 | + $("input[name=ids]", layero).val(ids); | ||
116 | + $("input[name=filter]", layero).val(search.filter); | ||
117 | + $("input[name=op]", layero).val(search.op); | ||
118 | + $("input[name=columns]", layero).val(columns.join(',')); | ||
119 | + $("form", layero).submit(); | ||
120 | + }; | ||
121 | + $(document).on("click", ".btn-export", function () { | ||
122 | + var ids = Table.api.selectedids(table); | ||
123 | + var page = table.bootstrapTable('getData'); | ||
124 | + var all = table.bootstrapTable('getOptions').totalRows; | ||
125 | + console.log(ids, page, all); | ||
126 | + Layer.confirm("请选择导出的选项<form action='" + Fast.api.fixurl("litestore/litestoregoods/export") + "' method='post' target='_blank'><input type='hidden' name='ids' value='' /><input type='hidden' name='filter' ><input type='hidden' name='op'><input type='hidden' name='search'><input type='hidden' name='columns'></form>", { | ||
127 | + title: '导出数据', | ||
128 | + btn: ["导出(" + all + "条)"], | ||
129 | + // btn: ["选中项(" + ids.length + "条)"], | ||
130 | + success: function (layero, index) { | ||
131 | + $(".layui-layer-btn a", layero).addClass("layui-layer-btn0"); | ||
132 | + } | ||
133 | + , yes: function (index, layero) { | ||
134 | + submitForm(ids.join(","), layero); | ||
135 | + return false; | ||
136 | + } | ||
137 | + , | ||
138 | + btn2: function (index, layero) { | ||
139 | + var ids = []; | ||
140 | + $.each(page, function (i, j) { | ||
141 | + ids.push(j.id); | ||
142 | + }); | ||
143 | + submitForm(ids.join(","), layero); | ||
144 | + return false; | ||
145 | + } | ||
146 | + , | ||
147 | + btn3: function (index, layero) { | ||
148 | + submitForm("all", layero); | ||
149 | + return false; | ||
150 | + } | ||
151 | + }) | ||
152 | + }); | ||
153 | + //*************************** 自定义export结束 | ||
154 | + // 为表格绑定事件 | ||
155 | + Table.api.bindevent(table); | ||
156 | + table.on('load-success.bs.table', function (data) { | ||
157 | + $(".btn-editone").data("area", ["1000px", "800px"]); | ||
158 | + }); | ||
159 | + | ||
160 | + }, | ||
161 | + add: function () { | ||
162 | + Form.api.bindevent($("form[role=form]"), function (data, ret) { | ||
163 | + Fast.api.close(data); | ||
164 | + Toastr.success("商品提交成功"); | ||
165 | + }, function (data, ret) { | ||
166 | + Toastr.success("商品提交失败"); | ||
167 | + }, function (success, error) { | ||
168 | + //注意如果我们需要阻止表单,可以在此使用return false;即可 | ||
169 | + //如果我们处理完成需要再次提交表单则可以使用submit提交,如下 | ||
170 | + console.log(this); | ||
171 | + var form = this; | ||
172 | + if (form.size() === 0) { | ||
173 | + Toastr.error("表单未初始化完成,无法提交"); | ||
174 | + return false; | ||
175 | + } | ||
176 | + var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET'; | ||
177 | + type = type && (type === 'GET' || type === 'POST') ? type : 'GET'; | ||
178 | + url = form.attr("action"); | ||
179 | + url = url ? url : location.href; | ||
180 | + //修复当存在多选项元素时提交的BUG | ||
181 | + var params = {}; | ||
182 | + var multipleList = $("[name$='[]']", form); | ||
183 | + if (multipleList.size() > 0) { | ||
184 | + var postFields = form.serializeArray().map(function (obj) { | ||
185 | + return $(obj).prop("name"); | ||
186 | + }); | ||
187 | + $.each(multipleList, function (i, j) { | ||
188 | + if (postFields.indexOf($(this).prop("name")) < 0) { | ||
189 | + params[$(this).prop("name")] = ''; | ||
190 | + } | ||
191 | + }); | ||
192 | + } | ||
193 | + var dataParam = {spec_many: specMany.getData()}; | ||
194 | + console.log(dataParam); | ||
195 | + Fast.api.ajax({ | ||
196 | + type: type, | ||
197 | + url: url, | ||
198 | + data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : '') + (Object.keys(dataParam).length > 0 ? '&' + $.param(dataParam) : ''), | ||
199 | + dataType: 'json', | ||
200 | + complete: function (xhr) { | ||
201 | + var token = xhr.getResponseHeader('__token__'); | ||
202 | + if (token) { | ||
203 | + $("input[name='__token__']", form).val(token); | ||
204 | + } | ||
205 | + if (xhr.responseJSON.code == 1) { | ||
206 | + //关闭弹窗 | ||
207 | + var index = parent.Layer.getFrameIndex(window.name); | ||
208 | + var callback = parent.$("#layui-layer" + index).data("callback"); | ||
209 | + parent.Layer.close(index); | ||
210 | + //刷新列表 | ||
211 | + parent.$("#table").bootstrapTable('refresh'); | ||
212 | + } | ||
213 | + } | ||
214 | + }, function (data, ret) { | ||
215 | + $('.form-group', form).removeClass('has-feedback has-success has-error'); | ||
216 | + if (data && typeof data === 'object') { | ||
217 | + if (typeof data.token !== 'undefined') { | ||
218 | + $("input[name='__token__']", form).val(data.token); | ||
219 | + } | ||
220 | + if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') { | ||
221 | + data.callback.call(form, data); | ||
222 | + } | ||
223 | + } | ||
224 | + }, function (data, ret) { | ||
225 | + if (data && typeof data === 'object' && typeof data.token !== 'undefined') { | ||
226 | + $("input[name='__token__']", form).val(data.token); | ||
227 | + } | ||
228 | + }); | ||
229 | + return false; | ||
230 | + }); | ||
231 | + | ||
232 | + // 注册商品多规格组件 | ||
233 | + var specMany = new GoodsSpec({ | ||
234 | + container: '.goods-spec-many', | ||
235 | + OutForm: Form | ||
236 | + }); | ||
237 | + | ||
238 | + // 切换单/多规格 | ||
239 | + $('select[name="row[spec_type]"').change(function (e) { | ||
240 | + var $goodsSpecMany = $('.goods-spec-many') | ||
241 | + , $goodsSpecSingle = $('.goods-spec-single'); | ||
242 | + if (e.currentTarget.value === '10') { | ||
243 | + $goodsSpecMany.hide() && $goodsSpecSingle.show(); | ||
244 | + } else { | ||
245 | + $goodsSpecMany.show() && $goodsSpecSingle.hide(); | ||
246 | + } | ||
247 | + }); | ||
248 | + | ||
249 | + | ||
250 | + }, | ||
251 | + edit: function () { | ||
252 | + //Controller.api.bindevent(); | ||
253 | + | ||
254 | + Form.api.bindevent($("form[role=form]"), function (data, ret) { | ||
255 | + //Fast.api.close(data); | ||
256 | + Toastr.success("商品提交成功"); | ||
257 | + }, function (data, ret) { | ||
258 | + Toastr.success("商品提交失败"); | ||
259 | + }, function (success, error) { | ||
260 | + //注意如果我们需要阻止表单,可以在此使用return false;即可 | ||
261 | + //如果我们处理完成需要再次提交表单则可以使用submit提交,如下 | ||
262 | + console.log(this); | ||
263 | + var form = this; | ||
264 | + if (form.size() === 0) { | ||
265 | + Toastr.error("表单未初始化完成,无法提交"); | ||
266 | + return false; | ||
267 | + } | ||
268 | + var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET'; | ||
269 | + type = type && (type === 'GET' || type === 'POST') ? type : 'GET'; | ||
270 | + url = form.attr("action"); | ||
271 | + url = url ? url : location.href; | ||
272 | + //修复当存在多选项元素时提交的BUG | ||
273 | + var params = {}; | ||
274 | + var multipleList = $("[name$='[]']", form); | ||
275 | + if (multipleList.size() > 0) { | ||
276 | + var postFields = form.serializeArray().map(function (obj) { | ||
277 | + return $(obj).prop("name"); | ||
278 | + }); | ||
279 | + $.each(multipleList, function (i, j) { | ||
280 | + if (postFields.indexOf($(this).prop("name")) < 0) { | ||
281 | + params[$(this).prop("name")] = ''; | ||
282 | + } | ||
283 | + }); | ||
284 | + } | ||
285 | + var dataParam = {spec_many: specMany.getData()}; | ||
286 | + console.log(dataParam); | ||
287 | + Fast.api.ajax({ | ||
288 | + type: type, | ||
289 | + url: url, | ||
290 | + data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : '') + (Object.keys(dataParam).length > 0 ? '&' + $.param(dataParam) : ''), | ||
291 | + dataType: 'json', | ||
292 | + complete: function (xhr) { | ||
293 | + var token = xhr.getResponseHeader('__token__'); | ||
294 | + if (token) { | ||
295 | + $("input[name='__token__']", form).val(token); | ||
296 | + } | ||
297 | + if (xhr.responseJSON.code == 1) { | ||
298 | + //关闭弹窗 | ||
299 | + var index = parent.Layer.getFrameIndex(window.name); | ||
300 | + var callback = parent.$("#layui-layer" + index).data("callback"); | ||
301 | + parent.Layer.close(index); | ||
302 | + //刷新列表 | ||
303 | + parent.$("#table").bootstrapTable('refresh'); | ||
304 | + } | ||
305 | + } | ||
306 | + }, function (data, ret) { | ||
307 | + $('.form-group', form).removeClass('has-feedback has-success has-error'); | ||
308 | + if (data && typeof data === 'object') { | ||
309 | + if (typeof data.token !== 'undefined') { | ||
310 | + $("input[name='__token__']", form).val(data.token); | ||
311 | + } | ||
312 | + if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') { | ||
313 | + data.callback.call(form, data); | ||
314 | + } | ||
315 | + } | ||
316 | + }, function (data, ret) { | ||
317 | + if (data && typeof data === 'object' && typeof data.token !== 'undefined') { | ||
318 | + $("input[name='__token__']", form).val(data.token); | ||
319 | + } | ||
320 | + }); | ||
321 | + return false; | ||
322 | + }); | ||
323 | + // 注册商品多规格组件 | ||
324 | + var specMany = new GoodsSpec({ | ||
325 | + container: '.goods-spec-many', | ||
326 | + OutForm: Form | ||
327 | + }, from_specData); | ||
328 | + | ||
329 | + // 切换单/多规格 | ||
330 | + $('select[name="row[spec_type]"').change(function (e) { | ||
331 | + var $goodsSpecMany = $('.goods-spec-many') | ||
332 | + , $goodsSpecSingle = $('.goods-spec-single'); | ||
333 | + if (e.currentTarget.value === '10') { | ||
334 | + $goodsSpecMany.hide() && $goodsSpecSingle.show(); | ||
335 | + } else { | ||
336 | + $goodsSpecMany.show() && $goodsSpecSingle.hide(); | ||
337 | + } | ||
338 | + }); | ||
339 | + }, | ||
340 | + api: { | ||
341 | + bindevent: function () { | ||
342 | + Form.api.bindevent($("form[role=form]")); | ||
343 | + } | ||
344 | + } | ||
345 | + }; | ||
346 | + return Controller; | ||
347 | +}); |
-
请 注册 或 登录 后发表评论