代码如下:
public function form()
{
$form = new Form(new XXX());
$form->text('name', '活动名称');
$form->text('slug', '活动Slug');
if ($form->isEditing()) {
$form->datetime('created_at', '创建时间')->readonly();
}
$form->table('xxx-json', '活动产品', function ($table) {
$table->select('product_id', '产品')->options(function ($id) {
$product = YYY::find($id);
return $product ? $product->pluck('pro_name', 'id') : [];
})->ajax('/admin/api/xxx-json');
$table->select('type', '权益类型')->options(self::TYPES);
$table->number('value', '数值');
});
// $form->hidden('content');// 必须要有这个,否则会报错content字段不存在\vendor\encore\laravel-admin\src\Form.php Line:900
$form->table('content', '权益', function ($table) {
$table->select('type', '类别')->options(self::OPTIONS);
$table->select('lang', '语言')->options(array_combine(Launch::LANGUAGES, Launch::LANGUAGES));
$table->text('value', '值');
});
$form->datetimeRange('start_time', 'end_time', '活动时间');
$form->select('status', '活动状态')->options(XXX::STATUS)->default(XXX::STATUS_VALID);
$form->select('style', '按钮样式')->options(XXX::STYLES)->default(XXX::STYLE_MORE);
$form->url('redirect', '跳转链接')->required();
if ($form->isEditing()) {
$form->url('link', '活动链接');
}
// hook 保存后拿到活动id然后再次保存,没有观察者好用,但是不知道观察者为啥不可用
$form->saved(function (Form $form) {
$activity = $form->model();
$activity->link = vsprintf(config('app.url') . '/share/%s?activity_id=%d', [$activity->slug, $activity->id]);
$activity->save();
});
// 设置创建人
$form->hidden('created_by')->default(Admin::user()->id);
$form->footer(function ($footer) {
// 去掉`查看`checkbox
$footer->disableViewCheck();
});
return $form;
}
编辑的时候展示:
更新代码,需要转换数据为json,并对字段进行一些处理:
public function update(Request $request)
{
$activity_id = $request->route()->parameter('activity');
// Log::info('更新活动内容: ' . json_encode($request->all(), 320));
// 如果存在pk说明是行内编辑
if ($request->pk) {
$params[request('name')] = request('value');
} else {
$params = $this->validate($request, self::RULES);
// 过滤不需要的参数
foreach ($params as $field => $param) {
switch ($field) {
case 'content':
case 'products':
$data = array_filter($params[$field], function ($value) {
// 只要没被移除的
return isset($value['_remove_']) && !$value['_remove_'];
});
$params[$field] = json_encode($data, 320);
break;
}
}
}
// dd($params);
XXX::where('id', $activity_id)->update($params);
return admin_toastr('更新成功!', 'success');
}
模型里面也需要处理一下:
<?php
namespace App\Model\YYY;
use Illuminate\Database\Eloquent\Model;
class XXX extends Model
{
protected $connection = 'mysql_vip';
protected $table = 'vip_activities';
public $timestamps = true;
// 这里就是设置告诉设置的是json格式
protected $casts = [
'content' => 'json',
'products' => 'json',
];
public const STATUS_VALID = 10;
public const STATUS_DELETE = 20;
// 状态10:正常,20:删除
public const STATUS = [
self::STATUS_VALID => '正常',
self::STATUS_DELETE => '删除',
];
// 10:了解更多特权,20:立即体验
public const STYLE_MORE = 10;
public const STYLE_TRY = 20;
public const STYLES = [
self::STYLE_MORE => '了解更多特权',
self::STYLE_TRY => '立即体验',
];
protected $fillable = [
'name', 'slug', 'products', 'content', 'start_time', 'end_time', 'redirect', 'style', 'link', 'created_by', 'created_at', 'updated_at',
];
public function scopeHot($query)
{
return $query->where('share_count', ' > ', 100);
}
public function scopeTrashed($query)
{
return $query->where('status', self::STATUS_DELETE);
}
public function getContentAttribute($value)
{
// array_values取值是为了避免覆盖
return array_values(json_decode($value, true) ?: []);
}
public function setContentAttribute($value)
{
$this->attributes['content'] = json_encode(array_values($value));
}
public function getProductsAttribute($value)
{
// array_values取值是为了避免覆盖
return array_values(json_decode($value, true) ?: []);
}
public function setProductsAttribute($value)
{
$this->attributes['products'] = json_encode(array_values($value));
}
}