laravel-admin表格table创建与展示

在这里插入图片描述
代码如下:

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));
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值