From 52ef9567cfd3b39acb3d6dea39ee55958ce36d64 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Fri, 5 Aug 2022 17:51:33 +0800 Subject: [PATCH 1/2] spec form --- README.md | 51 +++++- .../resources/lang/zh_CN/goods-brand.php | 2 + packages/goods/resources/lang/zh_CN/goods.php | 2 + .../views/form/attr-horizontal.blade.php | 86 +++++++++ .../goods/resources/views/form/spec.blade.php | 154 +++++++++++++++++ .../goods/src/Actions/RowGoodsSkuList.php | 16 -- packages/goods/src/Form/GoodsAttrForm.php | 37 ++++ packages/goods/src/Form/GoodsSpecForm.php | 52 ++++++ packages/goods/src/Form/Spec.php | 21 +++ packages/goods/src/GoodsServiceProvider.php | 8 + .../Controllers/Admin/GoodsController.php | 163 +++++++----------- packages/goods/src/Http/routes.php | 4 +- packages/goods/updates/CreateGoodsTable.php | 6 +- packages/goods/updates/GoodsTableSeeder.php | 22 ++- resources/views/form/footer.blade.php | 8 +- src/Form/Footer.php | 7 +- src/Show/Tools.php | 41 +++-- 17 files changed, 529 insertions(+), 151 deletions(-) create mode 100644 packages/goods/resources/views/form/attr-horizontal.blade.php create mode 100644 packages/goods/resources/views/form/spec.blade.php delete mode 100644 packages/goods/src/Actions/RowGoodsSkuList.php create mode 100644 packages/goods/src/Form/GoodsAttrForm.php create mode 100644 packages/goods/src/Form/GoodsSpecForm.php create mode 100644 packages/goods/src/Form/Spec.php diff --git a/README.md b/README.md index 9e36eb0..05f3af5 100755 --- a/README.md +++ b/README.md @@ -4,17 +4,52 @@ Fork From [jqhph/dcat-admin](https://github.com/jqhph/dcat-admin) ## 改动 -### Show +- 文件: `dcat-admin/src/Form/Footer.php`, 将 `reset` 按钮默认设置为 `false` -### 详细页-列表按钮点击跳转方式 +```php +protected $buttons = ['reset' => false, 'submit' => true, 'back' => true]; -- `packages/dcat-admin/src/Show/Tools.php` 254行 - -```html - +public function disableBack(bool $disable = true) +{ + $this->buttons['back'] = !$disable; +} ``` -```html - +- 添加 Form 表单的 `back` 按钮, 文件: `dcat-admin/resources/views/form/footer.blade.php` + +```php +@if(! empty($buttons['back'])) +
+ {{ trans('admin.back') }} +
+@endif ``` +- 文件: `dcat-admin/src/Show/Tools.php`, 添加 `back` 按钮, `list` 默认设置为 `false`, 修改按钮的渲染方式(去掉外层的 `btn-group` 标签, 添加类名 `mr-1`) + +```php +protected $tools = ['back', 'list', 'edit', 'delete']; + +protected $showBack = true; + +public function disableBack(bool $disable = true) +{ + $this->showBack = !$disable; + return $this; +} + +protected function renderBack() +{ + if (! $this->showBack) { + return; + } + + $back = trans('admin.back'); + + return << + {$back} + +HTML; +} +``` diff --git a/packages/goods/resources/lang/zh_CN/goods-brand.php b/packages/goods/resources/lang/zh_CN/goods-brand.php index 59012bc..cd88350 100644 --- a/packages/goods/resources/lang/zh_CN/goods-brand.php +++ b/packages/goods/resources/lang/zh_CN/goods-brand.php @@ -5,6 +5,8 @@ return [ 'GoodsBrand' => '品牌管理', 'goods' => '商品管理', 'brand' => '品牌', + 'create' => '创建', + 'edit' => '修改', ], 'fields' => [ 'name' => '名称', diff --git a/packages/goods/resources/lang/zh_CN/goods.php b/packages/goods/resources/lang/zh_CN/goods.php index f314135..e3a3a27 100644 --- a/packages/goods/resources/lang/zh_CN/goods.php +++ b/packages/goods/resources/lang/zh_CN/goods.php @@ -6,6 +6,8 @@ return [ 'goods' => '商品信息', 'create' => '创建', 'edit' => '修改', + 'attr' => '属性', + 'spec' => '规格', ], 'fields' => [ 'category_id' => '分类', diff --git a/packages/goods/resources/views/form/attr-horizontal.blade.php b/packages/goods/resources/views/form/attr-horizontal.blade.php new file mode 100644 index 0000000..8142809 --- /dev/null +++ b/packages/goods/resources/views/form/attr-horizontal.blade.php @@ -0,0 +1,86 @@ + +
+

{!! $label !!}

+
+
+ +
+ +
+ +
+ + @foreach($forms as $pk => $form) + +
+ + {!! $form->render() !!} + + @if($options['allowDelete']) +
+ +
+
 {{ trans('admin.remove') }}
+
+
+ @endif +
+
+ + @endforeach +
+ + + + + @if($options['allowCreate']) +
+ +
+
 {{ trans('admin.new') }}
+
+
+ @endif + +
+ + diff --git a/packages/goods/resources/views/form/spec.blade.php b/packages/goods/resources/views/form/spec.blade.php new file mode 100644 index 0000000..d58c7b7 --- /dev/null +++ b/packages/goods/resources/views/form/spec.blade.php @@ -0,0 +1,154 @@ +
+ + + + @foreach($headers as $item) + + @endforeach + + + + + @foreach($value as $item) + + + + @foreach($item['values'] as $subItem) + + @foreach($subItem as $value) + + @endforeach + + + @endforeach + + @foreach($headers as $index => $subItem) + @if($index > 0) + + @endif + @endforeach + + + @endforeach + + + + + +
{{ $item }}
{{ $item['name'] }}
{{ $value }} + +
+ + + +
+ + + +
+
+ + diff --git a/packages/goods/src/Actions/RowGoodsSkuList.php b/packages/goods/src/Actions/RowGoodsSkuList.php deleted file mode 100644 index 5e6641a..0000000 --- a/packages/goods/src/Actions/RowGoodsSkuList.php +++ /dev/null @@ -1,16 +0,0 @@ -response()->redirect(admin_route('goods-sku.index', ['goods' => $this->getKey()])); - } -} diff --git a/packages/goods/src/Form/GoodsAttrForm.php b/packages/goods/src/Form/GoodsAttrForm.php new file mode 100644 index 0000000..502fb0a --- /dev/null +++ b/packages/goods/src/Form/GoodsAttrForm.php @@ -0,0 +1,37 @@ +update(['attr' => $input['attr']]); + + return $this->response()->success('保存成功'); + } + + public function form() + { + $this->fill(Arr::only($this->payload, ['type_id', 'goods_id', 'attr'])); + + $this->hidden('type_id'); + $this->hidden('goods_id'); + $this->spec('attr')->header(['分组', '名称', '属性值']); + } + + protected function renderResetButton() + { + return " 返回"; + } +} diff --git a/packages/goods/src/Form/GoodsSpecForm.php b/packages/goods/src/Form/GoodsSpecForm.php new file mode 100644 index 0000000..d8b4080 --- /dev/null +++ b/packages/goods/src/Form/GoodsSpecForm.php @@ -0,0 +1,52 @@ +update(['spec' => $input['spec']]); + + return $this->response()->success('保存成功'); + } + + public function form() + { + $this->spec('spec')->customFormat(function ($v) { + $list = []; + foreach($v as $item) { + $listItem = ['name' => $item['name'], 'values' => []]; + foreach($item['values'] as $subItem) { + array_push($listItem['values'], [ + 'name' => $subItem['value'], + 'value' => $subItem['price'] + ]); + } + array_push($list, $listItem); + } + return $list; + })->header(['名称', '可选值', '价格']); + } + + protected function renderResetButton() + { + return " 返回"; + } + + protected function getSubmitButtonLabel() + { + return '保存'; + } +} diff --git a/packages/goods/src/Form/Spec.php b/packages/goods/src/Form/Spec.php new file mode 100644 index 0000000..09de009 --- /dev/null +++ b/packages/goods/src/Form/Spec.php @@ -0,0 +1,21 @@ + [] + ]; + + public function header(array $headers) + { + $this->addVariables(['headers' => $headers]); + + return $this; + } +} diff --git a/packages/goods/src/GoodsServiceProvider.php b/packages/goods/src/GoodsServiceProvider.php index 6dac8d7..c1e6b29 100644 --- a/packages/goods/src/GoodsServiceProvider.php +++ b/packages/goods/src/GoodsServiceProvider.php @@ -4,6 +4,8 @@ namespace Peidikeji\Goods; use Dcat\Admin\Extend\ServiceProvider; use Dcat\Admin\Admin; +use Dcat\Admin\Form; +use Peidikeji\Goods\Form\Spec; class GoodsServiceProvider extends ServiceProvider { @@ -14,4 +16,10 @@ class GoodsServiceProvider extends ServiceProvider ['title' => '商品类别', 'uri' => 'goods/type', 'icon' => '', 'parent' => '商品管理'], ['title' => '商品信息', 'uri' => 'goods', 'icon' => '', 'parent' => '商品管理'], ]; + + public function init() + { + parent::init(); + Form::extend('spec', Spec::class); + } } diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsController.php b/packages/goods/src/Http/Controllers/Admin/GoodsController.php index 24e41a1..6411674 100644 --- a/packages/goods/src/Http/Controllers/Admin/GoodsController.php +++ b/packages/goods/src/Http/Controllers/Admin/GoodsController.php @@ -2,17 +2,16 @@ namespace Peidikeji\Goods\Http\Controllers\Admin; -use Dcat\Admin\Admin; use Dcat\Admin\Form; -use Dcat\Admin\Form\BlockForm; -use Dcat\Admin\Form\NestedForm; -use Dcat\Admin\Form\Row; use Dcat\Admin\Grid; use Dcat\Admin\Grid\Displayers\Actions; use Dcat\Admin\Grid\Tools\Selector; use Dcat\Admin\Http\Controllers\AdminController; +use Dcat\Admin\Layout\Content; use Dcat\Admin\Show; -use Peidikeji\Goods\Actions\RowGoodsSkuList; +use Dcat\Admin\Widgets\Card; +use Peidikeji\Goods\Form\GoodsAttrForm; +use Peidikeji\Goods\Form\GoodsSpecForm; use Peidikeji\Goods\Models\Goods; use Peidikeji\Goods\Models\GoodsBrand; use Peidikeji\Goods\Models\GoodsCategory; @@ -22,6 +21,33 @@ class GoodsController extends AdminController { protected $translation = 'peidikeji.dcat-admin-extension-goods::goods'; + public function attr($goods, Content $content) + { + $goods = Goods::with(['type'])->findOrFail($goods); + $form = GoodsAttrForm::make([ + 'type' => $goods->type + ])->payload(['attr' => $goods->attr, 'type_id' => $goods->type?->id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white'); + return $content + ->translation($this->translation()) + ->title($goods->name) + ->description($goods->type?->name) + ->body($form); + } + + public function spec($goods, Content $content) + { + $goods = Goods::findOrFail($goods); + $form = GoodsSpecForm::make([ + 'type' => $goods->type, + 'spec' => $goods->spec + ])->payload(['type_id' => $goods->type_id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white'); + return $content + ->translation($this->translation()) + ->title($goods->name) + ->description($goods->type?->name) + ->body($form); + } + protected function grid() { return Grid::make(Goods::with(['category', 'brand', 'type']), function (Grid $grid) { @@ -56,7 +82,7 @@ class GoodsController extends AdminController $grid->column('name')->display(function () { return ($this->cover_image ? ' ' : '') . ''.$this->name.''; }); - $grid->column('price'); + $grid->column('price')->editable(); $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec'); $grid->column('on_sale')->switch(); $grid->column('sold_count'); @@ -64,7 +90,10 @@ class GoodsController extends AdminController $grid->disableRowSelector(); $grid->actions(function (Actions $actions) { - $actions->append(new RowGoodsSkuList()); + $row = $actions->row; + $actions->append('货品信息'); + $actions->append('商品属性'); + $actions->append('商品规格'); }); }); } @@ -89,6 +118,7 @@ class GoodsController extends AdminController $show->field('sold_count'); $show->field('created_at')->as(fn($v) => $this->created_at->format('Y-m-d H:i:s')); $show->field('updated_at')->as(fn($v) => $this->updated_at->format('Y-m-d H:i:s')); + return $show; } @@ -97,109 +127,38 @@ class GoodsController extends AdminController return Form::make(new Goods(), function (Form $form) { $model = $form->model(); $isCreating = $form->isCreating(); - $type = null; - if (request('type_id') && $isCreating) { - $typeId = request('type_id'); - $type = GoodsType::find($typeId); - if ($type) { - $attrbutes = [ - 'type_id' => $type->id, - 'attr' => $type->attr, - 'spec' => $type->spec, - 'part' => $type->part, - ]; - $form->model($attrbutes); - } - } - $model = $form->model(); - if (!$type) { - $type = $model && $model->type_id ? GoodsType::find($form->model()->type_id) : null; + if ($isCreating) { + $form->select('type_id')->options(GoodsType::pluck('name', 'id')); + } else { + $type = $model->type_id ? GoodsType::find($form->model()->type_id) : null; + $form->display('type_id')->with(fn() => $type->name); } + $form->select('category_id')->options(GoodsCategory::selectOptions(null, false))->required(); + $form->select('brand_id')->options(GoodsBrand::pluck('name', 'id')); + $form->text('name')->required(); + $form->text('goods_sn'); + $form->image('cover_image') + ->autoUpload() + ->saveFullUrl() + ->move('goods/cover-image') + ->required(); + $form->multipleImage('images') + ->autoUpload() + ->saveFullUrl() + ->move('goods/images'); + $form->multipleImage('content') + ->autoUpload() + ->saveFullUrl() + ->move('goods/content'); - $form->disableHeader(); - $form->tab('基本设置', function (Form $form) use ($isCreating, $type) { - if ($isCreating) { - $form->select('type_id')->options(GoodsType::pluck('name', 'id')); - } else { - $form->display('type_id')->with(fn() => $type->name); - } - $form->select('category_id')->options(GoodsCategory::selectOptions(null, false))->required(); - $form->select('brand_id')->options(GoodsBrand::pluck('name', 'id')); - $form->text('name')->required(); - $form->text('goods_sn'); - $form->image('cover_image') - ->autoUpload() - ->saveFullUrl() - ->move('goods/goods') - ->required(); - $form->multipleImage('images') - ->autoUpload() - ->saveFullUrl() - ->move('goods/goods'); - $form->multipleImage('content') - ->autoUpload() - ->saveFullUrl() - ->move('goods/goods'); - - $form->number('price')->min(0)->attribute('step', 0.01); - $form->switch('on_sale'); - }); - - $form->tab('属性', function (Form $form) use ($type) { - $form->array('attr', null, function (NestedForm $table) use ($type) { - $values = data_get($type, 'attr.' . $table->getKey() . '.values') ?: []; - $table->text('group', '分组'); - $table->text('name', '属性名')->required(); - $table->autocomplete('value', '属性值')->options($values)->configs(['minChars' => 0]); - }); - }); - $form->tab('规格', function (Form $form) use ($type) { - $form->array('spec', null, function (NestedForm $table) use ($type) { - $table->text('name', '名称')->required(); - $values = data_get($type, 'spec.' . $table->getKey() . '.values') ?: []; - $table->array('values', null, function (NestedForm $table) use ($values) { - $index = $table->getKey(); - $table->autocomplete('value', '可选值') - ->default($index === null ? '' : data_get($values, $index, '')) - ->options($values) - ->configs(['minChars' => 0]); - $table->number('price', '加价')->min(0)->default(); - }); - }); - }); - $form->tab('配件', function (Form $form) use ($type) { - $form->array('part', null, function (NestedForm $table) use ($type) { - $table->text('name', '名称')->required(); - $values = data_get($type, 'part.' . $table->getKey() . '.values') ?: []; - $table->array('values', null, function (NestedForm $table) use ($values) { - $index = $table->getKey(); - $table->autocomplete('value', '可选值') - ->default($index === null ? '' : data_get($values, $index, '')) - ->options($values) - ->configs(['minChars' => 0]); - $table->number('price', '加价')->min(0)->default(); - }); - }); - }); + $form->number('price')->min(0)->attribute('step', 0.01); + $form->switch('on_sale'); $form->disableResetButton(); $form->disableCreatingCheck(); $form->disableViewCheck(); $form->disableEditingCheck(); - - $admin_url = request()->url(); - Admin::script( - <<names('goods-sku'); +Route::resource('goods/{goods}/sku', GoodsSkuController::class)->names('goods_sku'); +Route::get('goods/{goods}/attr', [GoodsController::class, 'attr'])->name('goods.attr'); +Route::get('goods/{goods}/spec', [GoodsController::class, 'spec'])->name('goods.spec'); Route::resource('goods', GoodsController::class); diff --git a/packages/goods/updates/CreateGoodsTable.php b/packages/goods/updates/CreateGoodsTable.php index 0e81261..5f3d4da 100644 --- a/packages/goods/updates/CreateGoodsTable.php +++ b/packages/goods/updates/CreateGoodsTable.php @@ -59,9 +59,9 @@ class CreateGoodsTable extends Migration $table->unsignedInteger('stock')->default(0)->comment('库存'); $table->unsignedInteger('sold_count')->default(0)->comment('销量'); $table->decimal('price', 12, 2)->comment('售价'); - $table->json('attr')->nullable()->comment('属性[{name, value}]'); - $table->json('spec')->nullable()->comment('规格[{name, values: [{value, price}]}]'); - $table->json('part')->nullable()->comment('配件[{name, values: [{value, price}]}]'); + $table->json('attr')->nullable()->comment('属性[{name, values: [{name, value}]}]'); + $table->json('spec')->nullable()->comment('规格[{name, values: [{name, value}]}]'); + $table->json('part')->nullable()->comment('配件[{name, values: [{name, value}]}]'); $table->timestamps(); $table->softDeletes(); diff --git a/packages/goods/updates/GoodsTableSeeder.php b/packages/goods/updates/GoodsTableSeeder.php index bf0f38f..f0539da 100644 --- a/packages/goods/updates/GoodsTableSeeder.php +++ b/packages/goods/updates/GoodsTableSeeder.php @@ -36,9 +36,11 @@ class GoodsTableSeeder extends Seeder [ 'name' => '手机', 'attr' => [ - ['group' => '主体', 'name' => '入网型号', 'values' => ['5G', '4G']], - ['group' => '主体', 'name' => '上市年份', 'values' => null], - ['group' => '主体', 'name' => '品牌', 'values' => null] + ['name' => '主体', 'values' => [ + ['name' => '入网型号', 'values' => ['5G', '4G']], + ['name' => '上市年份', 'values' => null], + ['name' => '品牌', 'values' => null] + ]] ], 'spec' => [ ['name' => '颜色', 'values' => ['白色', '红色', '黑色']], @@ -92,9 +94,11 @@ class GoodsTableSeeder extends Seeder 'stock' => 100, 'price' => 6499.00, 'attr' => [ - ['group' => '主体', 'name' => '入网型号', 'value' => '5G'], - ['group' => '主体', 'name' => '品牌', 'value' => '三星Galaxy'], - ['group' => '主体', 'name' => '上市年份', 'value' => '2020'], + ['name' => '主体', 'values' => [ + ['name' => '入网型号', 'value' => '5G'], + ['name' => '品牌', 'value' => '三星Galaxy'], + ['name' => '上市年份', 'value' => '2020'], + ]], ], 'spec' => [ ['name' => '颜色', 'values' => [ @@ -133,8 +137,10 @@ class GoodsTableSeeder extends Seeder 'stock' => 150, 'price' => 17999.00, 'attr' => [ - ['group' => '显示器','name' => '屏幕类型', 'value' => 'LED 背光显示屏'], - ['group' => '显示器','name' => '物理分辨率', 'value' => '3072 x 1920 (226 ppi)'], + ['name' => '显示器', 'values' => [ + ['name' => '屏幕类型', 'value' => 'LED 背光显示屏'], + ['name' => '物理分辨率', 'value' => '3072 x 1920 (226 ppi)'] + ]], ], 'spec' => [ ['name' => '颜色', 'values' => [ diff --git a/resources/views/form/footer.blade.php b/resources/views/form/footer.blade.php index 82113fd..b52f4f8 100755 --- a/resources/views/form/footer.blade.php +++ b/resources/views/form/footer.blade.php @@ -20,5 +20,11 @@ @endif + + @if(! empty($buttons['back'])) +
+ {{ trans('admin.back') }} +
+ @endif - \ No newline at end of file + diff --git a/src/Form/Footer.php b/src/Form/Footer.php index d8e09c7..c163071 100755 --- a/src/Form/Footer.php +++ b/src/Form/Footer.php @@ -33,7 +33,7 @@ class Footer implements Renderable * * @var array */ - protected $buttons = ['reset' => true, 'submit' => true]; + protected $buttons = ['reset' => false, 'submit' => true, 'back' => true]; /** * Available checkboxes. @@ -59,6 +59,11 @@ class Footer implements Renderable $this->builder = $builder; } + public function disableBack(bool $disable = true) + { + $this->buttons['back'] = !$disable; + } + /** * Disable reset button. * diff --git a/src/Show/Tools.php b/src/Show/Tools.php index ebd99c1..7a93590 100755 --- a/src/Show/Tools.php +++ b/src/Show/Tools.php @@ -28,7 +28,7 @@ class Tools implements Renderable * * @var array */ - protected $tools = ['delete', 'edit', 'list']; + protected $tools = ['back', 'list', 'edit', 'delete']; /** * Tools should be appends to default tools. @@ -47,7 +47,7 @@ class Tools implements Renderable /** * @var bool */ - protected $showList = true; + protected $showList = false; /** * @var bool @@ -59,6 +59,8 @@ class Tools implements Renderable */ protected $showEdit = true; + protected $showBack = true; + /** * @var bool */ @@ -173,6 +175,12 @@ class Tools implements Renderable return $this; } + public function disableBack(bool $disable = true) + { + $this->showBack = !$disable; + return $this; + } + /** * @param bool $disable * @return $this @@ -250,11 +258,24 @@ class Tools implements Renderable $list = trans('admin.list'); return << - + {$list} - +HTML; + } + + protected function renderBack() + { + if (! $this->showBack) { + return; + } + + $back = trans('admin.back'); + + return << + {$back} + HTML; } @@ -276,7 +297,7 @@ HTML; if ($this->showEdit) { $btn = << + {$edit} EOF; @@ -293,11 +314,11 @@ EOF; $text = $this->showEdit ? '' : "   $edit"; - $quickBtn = ""; + $quickBtn = ""; } return <<{$btn}{$quickBtn} + {$btn}{$quickBtn} HTML; } @@ -315,11 +336,9 @@ HTML; $delete = trans('admin.delete'); return << - - HTML; } From 182bd8b06f801be6f42bc89189ef18e4b77332c0 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Mon, 8 Aug 2022 18:03:19 +0800 Subject: [PATCH 2/2] generate --- .../goods/resources/lang/zh_CN/goods-sku.php | 3 +- .../goods/resources/views/form/spec.blade.php | 272 ++++++++++++------ .../goods/resources/views/grid/attr.blade.php | 2 +- .../resources/views/grid/attrs.blade.php | 15 + .../resources/views/grid/parts.blade.php | 15 + .../goods/resources/views/grid/spec.blade.php | 6 +- .../resources/views/grid/specs.blade.php | 15 + packages/goods/src/Form/GoodsAttrForm.php | 13 +- packages/goods/src/Form/GoodsSpecForm.php | 30 +- packages/goods/src/Form/Spec.php | 53 +++- packages/goods/src/GoodsService.php | 47 ++- .../Controllers/Admin/GoodsController.php | 31 +- .../Controllers/Admin/GoodsSkuController.php | 132 ++++++--- packages/goods/updates/GoodsTableSeeder.php | 6 +- resources/views/form/checkbox.blade.php | 4 +- 15 files changed, 450 insertions(+), 194 deletions(-) create mode 100644 packages/goods/resources/views/grid/attrs.blade.php create mode 100644 packages/goods/resources/views/grid/parts.blade.php create mode 100644 packages/goods/resources/views/grid/specs.blade.php diff --git a/packages/goods/resources/lang/zh_CN/goods-sku.php b/packages/goods/resources/lang/zh_CN/goods-sku.php index 5c8f5bc..2373eb6 100644 --- a/packages/goods/resources/lang/zh_CN/goods-sku.php +++ b/packages/goods/resources/lang/zh_CN/goods-sku.php @@ -4,7 +4,8 @@ return [ 'labels' => [ 'GoodsSku' => '货品管理', 'goods' => '商品管理', - 'sku' => '商品管理', + 'sku' => '货品管理', + 'create' => '添加', ], 'fields' => [ 'sn' => '货号', diff --git a/packages/goods/resources/views/form/spec.blade.php b/packages/goods/resources/views/form/spec.blade.php index d58c7b7..94990cf 100644 --- a/packages/goods/resources/views/form/spec.blade.php +++ b/packages/goods/resources/views/form/spec.blade.php @@ -1,22 +1,29 @@
+ @foreach($headers as $item) @endforeach - + - @foreach($value as $item) + @foreach($formatValue as $item) - + @foreach($item['values'] as $subItem) - @foreach($subItem as $value) - + @foreach($keys as $key) + @endforeach @endforeach - @foreach($headers as $index => $subItem) - @if($index > 0) - - @endif + @foreach($keys as $index => $key) + @endforeach @@ -66,89 +71,170 @@ } diff --git a/packages/goods/resources/views/grid/attr.blade.php b/packages/goods/resources/views/grid/attr.blade.php index 643a91d..00d5af6 100644 --- a/packages/goods/resources/views/grid/attr.blade.php +++ b/packages/goods/resources/views/grid/attr.blade.php @@ -5,7 +5,7 @@ @foreach($value as $item)
{{ $item['name'] }} - {{ $item['value'] }} {{ isset($item['price']) ? '(+'.$item['price'].')' : '' }} + {{ $item['name'] }}({{ $item['value'] }})
@endforeach @endif diff --git a/packages/goods/resources/views/grid/attrs.blade.php b/packages/goods/resources/views/grid/attrs.blade.php new file mode 100644 index 0000000..4f137df --- /dev/null +++ b/packages/goods/resources/views/grid/attrs.blade.php @@ -0,0 +1,15 @@ + + + +@if($value) +@foreach($value as $item) +
+ {{ $item['name'] }} + @if($item['values']) + @foreach($item['values'] as $subItem) + {{ $subItem['name'] }}({{ $subItem['value'] }}) + @endforeach + @endif +
+@endforeach +@endif diff --git a/packages/goods/resources/views/grid/parts.blade.php b/packages/goods/resources/views/grid/parts.blade.php new file mode 100644 index 0000000..e5aa0a5 --- /dev/null +++ b/packages/goods/resources/views/grid/parts.blade.php @@ -0,0 +1,15 @@ + + + +@if($value) +@foreach($value as $item) +
+ {{ $item['name'] }} + @if($item['values']) + @foreach($item['values'] as $subItem) + {{ $subItem['value'] }}({{ $subItem['price'] }}) + @endforeach + @endif +
+@endforeach +@endif diff --git a/packages/goods/resources/views/grid/spec.blade.php b/packages/goods/resources/views/grid/spec.blade.php index e5aa0a5..f3a93ef 100644 --- a/packages/goods/resources/views/grid/spec.blade.php +++ b/packages/goods/resources/views/grid/spec.blade.php @@ -5,11 +5,7 @@ @foreach($value as $item)
{{ $item['name'] }} - @if($item['values']) - @foreach($item['values'] as $subItem) - {{ $subItem['value'] }}({{ $subItem['price'] }}) - @endforeach - @endif + {{ $item['value'] }}({{ $item['price'] }})
@endforeach @endif diff --git a/packages/goods/resources/views/grid/specs.blade.php b/packages/goods/resources/views/grid/specs.blade.php new file mode 100644 index 0000000..e5aa0a5 --- /dev/null +++ b/packages/goods/resources/views/grid/specs.blade.php @@ -0,0 +1,15 @@ + + + +@if($value) +@foreach($value as $item) +
+ {{ $item['name'] }} + @if($item['values']) + @foreach($item['values'] as $subItem) + {{ $subItem['value'] }}({{ $subItem['price'] }}) + @endforeach + @endif +
+@endforeach +@endif diff --git a/packages/goods/src/Form/GoodsAttrForm.php b/packages/goods/src/Form/GoodsAttrForm.php index 502fb0a..49a7613 100644 --- a/packages/goods/src/Form/GoodsAttrForm.php +++ b/packages/goods/src/Form/GoodsAttrForm.php @@ -5,7 +5,6 @@ namespace Peidikeji\Goods\Form; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; -use Illuminate\Support\Arr; use Peidikeji\Goods\Models\Goods; class GoodsAttrForm extends Form implements LazyRenderable @@ -14,20 +13,16 @@ class GoodsAttrForm extends Form implements LazyRenderable public function handle(array $input) { - dd($input); - $goods = Goods::findOrFail($input['goods_id']); - $goods->update(['attr' => $input['attr']]); + $goods = Goods::findOrFail($this->payload['goods_id']); + $goods->update(['attr' => json_decode($input['attr'])]); return $this->response()->success('保存成功'); } public function form() { - $this->fill(Arr::only($this->payload, ['type_id', 'goods_id', 'attr'])); - - $this->hidden('type_id'); - $this->hidden('goods_id'); - $this->spec('attr')->header(['分组', '名称', '属性值']); + $attr = $this->model()->type?->attr; + $this->spec('attr')->header(['分组', '名称', '属性值'])->keys(['name', 'value'])->type($attr); } protected function renderResetButton() diff --git a/packages/goods/src/Form/GoodsSpecForm.php b/packages/goods/src/Form/GoodsSpecForm.php index d8b4080..e1c4c6e 100644 --- a/packages/goods/src/Form/GoodsSpecForm.php +++ b/packages/goods/src/Form/GoodsSpecForm.php @@ -2,12 +2,9 @@ namespace Peidikeji\Goods\Form; -use Dcat\Admin\Admin; use Dcat\Admin\Contracts\LazyRenderable; -use Dcat\Admin\Form\NestedForm; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; -use Illuminate\Support\Arr; use Peidikeji\Goods\Models\Goods; class GoodsSpecForm extends Form implements LazyRenderable @@ -16,28 +13,21 @@ class GoodsSpecForm extends Form implements LazyRenderable public function handle(array $input) { - $goods = Goods::findOrFail($input['goods_id']); - $goods->update(['spec' => $input['spec']]); - + $goods = Goods::findOrFail($this->payload['goods_id']); + $spec = json_decode($input['spec'], true); + foreach($spec as &$item) { + foreach($item['values'] as &$subItem) {} + $subItem['price'] = floatval($subItem['price']); + } + $goods->update(['spec' => $spec]); return $this->response()->success('保存成功'); } public function form() { - $this->spec('spec')->customFormat(function ($v) { - $list = []; - foreach($v as $item) { - $listItem = ['name' => $item['name'], 'values' => []]; - foreach($item['values'] as $subItem) { - array_push($listItem['values'], [ - 'name' => $subItem['value'], - 'value' => $subItem['price'] - ]); - } - array_push($list, $listItem); - } - return $list; - })->header(['名称', '可选值', '价格']); + $spec = $this->model()->type?->spec; + + $this->spec('spec')->header(['名称', '可选值', '价格'])->keys(['value', 'price'])->type($spec); } protected function renderResetButton() diff --git a/packages/goods/src/Form/Spec.php b/packages/goods/src/Form/Spec.php index 09de009..b2ce6c3 100644 --- a/packages/goods/src/Form/Spec.php +++ b/packages/goods/src/Form/Spec.php @@ -3,19 +3,68 @@ namespace Peidikeji\Goods\Form; use Dcat\Admin\Form\Field; +use Illuminate\Support\Arr; class Spec extends Field { protected $view = 'peidikeji.dcat-admin-extension-goods::form.spec'; protected $variables = [ - 'headers' => [] + 'headers' => [], + 'keys' => [], + 'type' => null, + 'formatValue' => [], ]; public function header(array $headers) { - $this->addVariables(['headers' => $headers]); + $this->addVariables([ + 'headers' => $headers, + ]); return $this; } + + public function keys($keys) + { + $this->addVariables([ + 'keys' => $keys, + ]); + + return $this; + } + + public function type($type) + { + $this->addVariables(['type' => $type]); + + return $this; + } + + public function render() + { + $value = $this->value; + $type = $this->variables['type']; + $newValue = []; + if ($type && !$value) { + foreach($type as $item) { + $itemValue = $value ? Arr::first($value, fn($i) => $i['name'] === $item['name']) : []; + $values = data_get($itemValue, 'values', []); + foreach($values as &$items) { + $subItem = Arr::first($item['values'], fn($i) => $i['name'] === $items['name']); + $items['options'] = data_get($subItem, 'values'); + } + array_push($newValue, [ + 'name' => $item['name'], + 'values' => $values + ]); + } + } else { + $newValue = $value ?: []; + } + $this->addVariables([ + 'formatValue' => $newValue + ]); + return parent::render(); + } } diff --git a/packages/goods/src/GoodsService.php b/packages/goods/src/GoodsService.php index 6bc81ec..a3b87c6 100644 --- a/packages/goods/src/GoodsService.php +++ b/packages/goods/src/GoodsService.php @@ -22,14 +22,22 @@ class GoodsService GoodsSku::where('goods_id', $goods->id)->delete(); } - public function generateSku(Goods $goods) + /** + * 根据规格生成SKU + * + * @param Goods $goods 商品 + * @param array $options {spec: 指定规格, price: 基础价格, name: 基础名称, stock: 默认库存, name_add: 是否在名称上面追加属性值, price_add: 是否在价格上面追加属性的加价, force: 是否覆盖原有的货品} + */ + public function generateSku(Goods $goods, $options = []) { - $this->clearSku($goods); - if ($goods->spec) { - $spec = $goods->spec; - $price = $goods->price; - $name = $goods->name; - + $spec = data_get($options, 'spec', $goods->spec); + $price = data_get($options, 'price', $goods->price); + $name = data_get($options, 'name', $goods->name); + $stock = data_get($options, 'stock', $goods->stock); + $nameAdd = !!data_get($options, 'name_add', false); + $priceAdd = !!data_get($options, 'price_add', false); + $force = !!data_get($options, 'force', false); + if ($spec) { $specList = []; foreach ($spec as $item) { $items = []; @@ -37,21 +45,30 @@ class GoodsService array_push($items, [ 'name' => $item['name'], 'value' => $value['value'], - 'price' => $value['price'], + 'price' => floatval($value['price']), ]); } array_push($specList, $items); } $cartesianList = $this->cartesianProduct($specList); foreach($cartesianList as $items) { - $specPrice = array_sum(array_column($items, 'price')); - $goods->skus()->create([ - 'sn' => $this->generateSn(), - 'name' => $name, - 'price' => $price + $specPrice, - 'stock' => $goods->stock, + $specPrice = $priceAdd ? $price + array_sum(array_column($items, 'price')) : $price; + $specName = $nameAdd ? $name . ' ' . implode(' ', array_column($items, 'value')) : $name; + $exists = $goods->skus()->jsonArray($items)->exists(); + $attributes = [ + 'name' => $specName, + 'price' => $specPrice, + 'stock' => $stock, 'spec' => $items, - ]); + ]; + if ($exists) { + if ($force) { + $goods->skus()->jsonArray($items)->update($attributes); + } + } else { + $attributes['sn'] = $this->generateSn(); + $goods->skus()->create($attributes); + } } } } diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsController.php b/packages/goods/src/Http/Controllers/Admin/GoodsController.php index 6411674..0c96d33 100644 --- a/packages/goods/src/Http/Controllers/Admin/GoodsController.php +++ b/packages/goods/src/Http/Controllers/Admin/GoodsController.php @@ -10,11 +10,13 @@ use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Layout\Content; use Dcat\Admin\Show; use Dcat\Admin\Widgets\Card; +use Illuminate\Validation\Rule; use Peidikeji\Goods\Form\GoodsAttrForm; use Peidikeji\Goods\Form\GoodsSpecForm; use Peidikeji\Goods\Models\Goods; use Peidikeji\Goods\Models\GoodsBrand; use Peidikeji\Goods\Models\GoodsCategory; +use Peidikeji\Goods\Models\GoodsSku; use Peidikeji\Goods\Models\GoodsType; class GoodsController extends AdminController @@ -25,8 +27,9 @@ class GoodsController extends AdminController { $goods = Goods::with(['type'])->findOrFail($goods); $form = GoodsAttrForm::make([ - 'type' => $goods->type - ])->payload(['attr' => $goods->attr, 'type_id' => $goods->type?->id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white'); + 'type' => $goods->type, + 'attr' => $goods->attr + ])->payload(['type_id' => $goods->type?->id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white'); return $content ->translation($this->translation()) ->title($goods->name) @@ -83,7 +86,7 @@ class GoodsController extends AdminController return ($this->cover_image ? ' ' : '') . ''.$this->name.''; }); $grid->column('price')->editable(); - $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec'); + $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.specs'); $grid->column('on_sale')->switch(); $grid->column('sold_count'); @@ -111,9 +114,9 @@ class GoodsController extends AdminController $show->field('cover_image')->image('', 100); $show->field('images')->image('', 100); $show->field('content')->image(''); - $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec'); - $show->field('attr')->view('peidikeji.dcat-admin-extension-goods::grid.attr'); - $show->field('part')->view('peidikeji.dcat-admin-extension-goods::grid.spec'); + $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.specs'); + $show->field('attr')->view('peidikeji.dcat-admin-extension-goods::grid.attrs'); + $show->field('part')->view('peidikeji.dcat-admin-extension-goods::grid.parts'); $show->field('on_sale')->bool(); $show->field('sold_count'); $show->field('created_at')->as(fn($v) => $this->created_at->format('Y-m-d H:i:s')); @@ -127,17 +130,21 @@ class GoodsController extends AdminController return Form::make(new Goods(), function (Form $form) { $model = $form->model(); $isCreating = $form->isCreating(); + $unique = Rule::unique('goods', 'goods_sn'); if ($isCreating) { $form->select('type_id')->options(GoodsType::pluck('name', 'id')); } else { - $type = $model->type_id ? GoodsType::find($form->model()->type_id) : null; - $form->display('type_id')->with(fn() => $type->name); + $type = $model->type_id ? GoodsType::find($model->type_id) : null; + $form->display('type_id')->with(fn() => $model->type_id ? $type->name : ''); + $unique->ignore($model->id); } $form->select('category_id')->options(GoodsCategory::selectOptions(null, false))->required(); $form->select('brand_id')->options(GoodsBrand::pluck('name', 'id')); $form->text('name')->required(); - $form->text('goods_sn'); + $form->text('goods_sn')->required()->rules([$unique], [ + 'unique' => '商品编号已经存在' + ]); $form->image('cover_image') ->autoUpload() ->saveFullUrl() @@ -159,6 +166,12 @@ class GoodsController extends AdminController $form->disableCreatingCheck(); $form->disableViewCheck(); $form->disableEditingCheck(); + + $form->deleting(function (Form $form) { + $data = $form->model()->toArray(); + // 删除 SKU + GoodsSku::whereIn('goods_id', array_column($data, 'id'))->delete(); + }); }); } } diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php index a901821..0d46b74 100644 --- a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php +++ b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php @@ -11,6 +11,7 @@ use Dcat\Admin\Show; use Illuminate\Routing\Controller; use Illuminate\Support\Arr; use Illuminate\Validation\Rule; +use Peidikeji\Goods\GoodsService; use Peidikeji\Goods\Models\Goods; use Peidikeji\Goods\Models\GoodsSku; @@ -26,14 +27,16 @@ class GoodsSkuController extends Controller $grid->selector(function (Selector $selector) use ($goods) { $specs = $goods->spec; - foreach($specs as $key => $item) { - $values = array_column($item['values'], 'value'); - $selector->selectOne('spec_' . $key, $item['name'], array_column($item['values'], 'value'), function ($q, $value) use ($values, $item) { - $selected = array_values(Arr::only($values, $value)); - if (count($selected) > 0) { - $q->jsonArray([['name' => $item['name'], 'value' => $selected[0]]]); - } - }); + if ($specs) { + foreach($specs as $key => $item) { + $values = array_column($item['values'], 'value'); + $selector->selectOne('spec_' . $key, $item['name'], array_column($item['values'], 'value'), function ($q, $value) use ($values, $item) { + $selected = array_values(Arr::only($values, $value)); + if (count($selected) > 0) { + $q->jsonArray([['name' => $item['name'], 'value' => $selected[0]]]); + } + }); + } } }); @@ -43,13 +46,15 @@ class GoodsSkuController extends Controller $grid->column('origin_price')->display(fn() => $goods->price); $grid->column('price'); $grid->column('stock'); - foreach($goods->spec as $key => $item) { - $grid->column('spec_' . $key, $item['name'])->display(function () use ($item) { - $filtered = current(array_filter($this->spec, fn($subItem) => $subItem['name'] === $item['name'])); - $value = data_get($filtered, 'value'); - $price = data_get($filtered, 'price'); - return ''.$value.''; - }); + if ($goods->spec) { + foreach($goods->spec as $key => $item) { + $grid->column('spec_' . $key, $item['name'])->display(function () use ($item) { + $filtered = current(array_filter($this->spec, fn($subItem) => $subItem['name'] === $item['name'])); + $value = data_get($filtered, 'value'); + $price = data_get($filtered, 'price'); + return ''.$value.''; + }); + } } // $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.attr'); }); @@ -69,7 +74,7 @@ class GoodsSkuController extends Controller $show->field('name'); $show->field('price'); $show->field('stock'); - $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.attr'); + $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec'); // $goods = $show->model()->goods; // foreach($goods->spec as $key => $item) { // $show->field('spec_' . $key, $item['name'])->as(function () use ($item) { @@ -90,11 +95,8 @@ class GoodsSkuController extends Controller protected function form($goods) { return Form::make(new GoodsSku(), function (Form $form) use ($goods) { - $unqiue = Rule::unique('goods_sku', 'sn'); - if ($form->isEditing()) { - $unqiue->ignore($form->model()->id); - } - $form->text('sn')->rules([$unqiue])->required(); + $unqiue = Rule::unique('goods_sku', 'sn')->ignore($form->model()->id); + $form->text('sn')->rules([$unqiue], ['unique' => '货号已经存在'])->required(); $form->text('name')->default($goods->name); $form->number('price')->min(0)->default($goods->price); $form->number('stock')->min(0)->default($goods->stock); @@ -102,22 +104,26 @@ class GoodsSkuController extends Controller $form->hidden('goods_id')->default($goods->id); $spec = $form->model()->spec; - foreach($goods->spec as $key => $item) { - $values = array_column($item['values'], 'value', 'value'); - $value = null; - if ($spec) { - $filtered = current(array_filter($spec, fn($subItem) => $subItem['name'] === $item['name'])); - $value = array_search($filtered['value'], $values); + if ($goods->spec) { + foreach($goods->spec as $item) { + $values = array_column($item['values'], 'value', 'value'); + $value = null; + if ($spec) { + $filtered = current(array_filter($spec, fn($subItem) => $subItem['name'] === $item['name'])); + $value = array_search($filtered['value'], $values); + } + $form->radio($item['name'], $item['name'])->options($values)->value($value); } - $form->radio($item['name'], $item['name'])->options($values)->value($value); } $form->saving(function (Form $form) use ($goods) { $info = $form->model(); $spec = []; - foreach($goods->spec as $item) { - array_push($spec, ['name' => $item['name'], 'value' => $form->input($item['name'])]); - $form->deleteInput($item['name']); + if ($goods->spec) { + foreach($goods->spec as $item) { + array_push($spec, ['name' => $item['name'], 'value' => $form->input($item['name'])]); + $form->deleteInput($item['name']); + } } $form->input('spec', $spec); $query = GoodsSku::where('goods_id', $goods->id)->jsonArray($spec); @@ -148,11 +154,67 @@ class GoodsSkuController extends Controller public function create($goods, Content $content) { + $goods = Goods::findOrFail($goods); return $content ->translation($this->translation) - ->title(admin_trans_label()) - ->description(trans('admin.create')) - ->body($this->form(Goods::findOrFail($goods))); + ->title(__('peidikeji.dcat-admin-extension-goods::goods-sku.labels.sku')) + ->description(__('peidikeji.dcat-admin-extension-goods::goods-sku.labels.create')) + ->body($this->createForm($goods)); + } + + protected function createForm($goods) + { + return Form::make(new GoodsSku(), function (Form $form) use ($goods) { + $form->text('name')->default($goods->name); + if ($goods->spec) { + $form->checkbox('name_append', '')->options([1 => '是否在名称上面追加属性值']); + } + $form->number('price')->min(0)->default($goods->price); + if ($goods->spec) { + $form->checkbox('price_append', '')->options([1 => '是否在价格上面追加属性的加价'])->default([1]); + } + + if ($goods->spec) { + foreach($goods->spec as $item) { + $values = array_column($item['values'], 'value', 'value'); + $form->checkbox($item['name'], $item['name'])->options($values); + } + + $form->checkbox('force', '')->options([1 => '覆盖已经存在的货品'])->default(1); + } + + + $form->disableCreatingCheck(); + $form->disableEditingCheck(); + $form->disableViewCheck(); + $form->disableResetButton(); + + $form->saving(function (Form $form) use ($goods) { + $price = $form->price; + $name = $form->name; + $spec = []; + if ($goods->spec) { + foreach($goods->spec as $index => $item) { + $values = $form->input($item['name']); + $values = array_filter($values, fn($v) => $v); + if (count($values) === 0) { + return $form->response()->error('请勾选 ' . $item['name']); + } + array_push($spec, ['name' => $item['name'], 'values' => array_filter($item['values'], fn($v) => in_array($v['value'], $values))]); + $form->deleteInput($item['name']); + } + } + GoodsService::make()->generateSku($goods, [ + 'spec' => $spec, + 'price' => $price, + 'name' => $name, + 'name_add' => !!data_get($form->name_append, 0), + 'price_add' => !!data_get($form->price_append, 0), + 'force' => !!$form->force + ]); + return $form->response()->success('添加成功')->redirect(admin_route('goods_sku.index', ['goods' => $goods->id])); + }); + }); } public function update($goods, $id) @@ -162,7 +224,7 @@ class GoodsSkuController extends Controller public function store($goods) { - return $this->form(Goods::findOrFail($goods))->store(); + return $this->createForm(Goods::findOrFail($goods))->store(); } public function destroy($goods, $id) diff --git a/packages/goods/updates/GoodsTableSeeder.php b/packages/goods/updates/GoodsTableSeeder.php index f0539da..fec700d 100644 --- a/packages/goods/updates/GoodsTableSeeder.php +++ b/packages/goods/updates/GoodsTableSeeder.php @@ -53,8 +53,10 @@ class GoodsTableSeeder extends Seeder [ 'name' => '笔记本电脑', 'attr' => [ - ['group' => '显示器', 'name' => '屏幕类型', 'values' => ['LED 背光显示屏']], - ['group' => '显示器','name' => '物理分辨率', 'values' => ['3072 x 1920 (226 ppi)']], + ['name' => '显示器', 'values' => [ + ['name' => '屏幕类型', 'values' => ['LED 背光显示屏']], + ['name' => '物理分辨率', 'values' => ['3072 x 1920 (226 ppi)']] + ]], ], 'spec' => [ ['name' => '颜色', 'values' => ['白色', '灰色']], diff --git a/resources/views/form/checkbox.blade.php b/resources/views/form/checkbox.blade.php index 3ea145e..08d4ca4 100755 --- a/resources/views/form/checkbox.blade.php +++ b/resources/views/form/checkbox.blade.php @@ -1,6 +1,6 @@
- +
@@ -55,4 +55,4 @@ }); $(selector+':checked').trigger('change') -@endif \ No newline at end of file +@endif
{{ $item }} + @if($type) + + @endif +
{{ $item['name'] }}{{ $item['name'] }}
{{ $value }}{{ data_get($subItem, $key) }}
- - + + -