场景:为了方便开发使用了laravel-admin框架,使用的时候遇到了很多不理解,也解决很多问题,但是单独拿出来,感觉没必要记录,正好遇到了一个结合多个问题的模块,能概括很多问题,就一次性记录一下,方便以后使用。这是一个产品模块,有标签,分类,多选,单选,图片上传等功能。这里不概述如何创建模块
1、添加功能
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Good());
$form->text('good_name', __('产品名称'));
$form->select ('brand_id', '品牌')->options (Brand::all()->pluck('brand_name','id'));
$form->select('cate_id','分类')->options(
Category::all()->pluck('category_name','id')
);
$form->image('cover',__('封面图'))
->thumbnail('small', $width = 300, $height = 300)->removable();
$form->decimal('price', __('售价'));
$form->decimal('original', __('原价'));
$form->radio('is_sale', __('是否上架'))->options([
'1' => '是',
'2' => '否'
])->default(1);
$form->checkbox('tags', '标签')->options(Tags::all()->pluck('name','id'));
$form->textarea('content', __('产品内容'));
$form->textarea('summary', __('产品简介'));
return $form;
}
品牌字段,是一个下拉框,对brand表查询,并且规定了展示的k,v。
图片字段,做了一个缩略图。
标签是多选框。
2、model操作
class Good extends Model
{
public $table = 'good';
public static function boot(){
// 继承父类
parent::boot();
// updating creating saving 这几个方法你自己选择,打印一下$model看看你就知道怎么取出数据了
static::saving(function ($model) {
$nId = app(Snowflake::class)->nextId();
$model->id= $nId ;
//组装图片信息,并处理
$arrImage = [
'id' => app(Snowflake::class)->nextId(),
'good_id' => $nId,
'position' => 1,
'link' => $model->cover
];
$bRet = GoodImage::create($arrImage);
if ( !$bRet )
{
return false;
}
$sTags = implode(',',$model->tags);
$model->tags = $sTags;
unset($model->cover);
});
}
我这里图片不在一个表所以在模型里,需要单独来处理,最后需要把他销毁掉。标签数据因为前面是多选,所以现在$model里面tags是一个array,这里需要处理一下要不然会报错。
3、列表展示,字段处理
protected function grid()
{
$grid = new Grid(new Good());
$grid->column('good_name', __('产品名称'));
$grid->column('brand_id',__('品牌'))->display(function (){
$arr = Brand::where('id',$this->brand_id)->first();
if ( !$arr || !$arr->brand_name )
{
return '';
}
return $arr->brand_name;
});
$grid->column('cate_id',__('分类'))->display(function (){
$arr = Category::where('id',$this->cate_id)->first();
if ( !$arr || !$arr->category_name )
{
return '';
}
return $arr->category_name;
});
$grid->column('price', __('售价'));
$grid->column('original', __('原价'));
$grid->column('is_sale', '是否上架')->filter([
'1'=>'是',
'2'=>'否'
])->display(function ($is_sale){
return $is_sale ? '是' : '否';
});
$grid->column('tags', __('标签'))->display(function ($tags){
$arr = explode(',',$tags);
$arrTag = Tags::whereIn('id',$arr)->get()->toArray();
$str = '';
foreach ( $arrTag as $k=>$v )
{
if ( $v['name'] )
$str .= "<span style='border:1px solid #ccc;'>". $v['name']."</span>"." ";
}
return $str;
});
$grid->column('created_at', __('创建时间'));
return $grid;
}
为了显示对应的数据,列表需要对数据库字段进行处理。主要是一些查询。