背景

随着 dcat-admin 越来越多的人使用,相信有许多跟我一样热爱这个项目的的人最后也会参与到这个项目中来,从使用者到项目的维护者,可以为项目贡献一份自己的力量。我以后也会将维护这个项目的一些心得,底层代码的实现都以博文的形式分享给大家。

需求

有个同学提了一个这样的需求 ; 需要在表单 / 详情支持多栏布局,而这个需求刚好我自己用 dcat-admin 做项目时候也遇到过。尤其是 form 表单字段比较多的时候,我开始的解决方案是通过 form 的 tab 来减少表单一页的字段数量。

表单的多栏目布局
思路:我想的是 form 表单的字段外面包一次 row ,然后控制 row 里面每个字段的长宽。当我看了 dcat-admin 的代码后,发现是已经实现好了的,所以不需要自己在开发,我这里主要讲讲表单的多栏目布局的用法和底层代码怎么实现的。
效果:


使用代码:

在控制器创建一个 from 方法

protected function form(){return Form::make(new WxyMaterialItem(), function (Form $form) {$form->row(function (Form\Row $row) {$row->width(4)->text('name')->required();$row->width(4)->text('id');$row->width(4)->text('simple_code');});$form->row(function (Form\Row $row) {$row->width(6)->text('integral_money');$row->width(6)->text('stock_min');});$form->row(function (Form\Row $row) {$row->width(12)->text('attribute');});$form->row(function (Form\Row $row) {$row->width(3)->text('price1');$row->width(3)->text('price2');$row->width(3)->text('price3');$row->width(3)->text('status');});});}

代码分析:

整个 form 表单渲染出来的流程如下
Dcat\Admin\Form 对象 -> 方法 rows 实例化一个 Dcat\Admin\Form\Row 对象并保存对象属性 -> 最后通过 render 方法渲染界面

这里面核心作用文件是 Dcat\Admin\Form\Row,我们可以看看里面的几个方法

width 方法

public function width($width = 12){$this->defaultFieldWidth = $width;return $this;}

这个方法主要设置当前行的每一个显示字段的宽度,比如你一行显示三个字段
建议每个字段的宽度设置为 3,例如 $row->width (3)->text (‘name’);

__call 方法

public function __call($method, $arguments){$field = $this->form->__call($method, $arguments);$field->disableHorizontal();$this->fields[] = ['width'   => $this->defaultFieldWidth,'element' => $field,];return $field;}

这个方法主要是保存当前行要显示的字段的信息,通过 __call 方法去调用 Dcat\Admin\Form 的字段方法获取字段信息,如使用代码的 $row->width (4)->text (‘name’),会保存一个宽度 col-md-4 的 Dcat\Admin\Form\Field\Text 字段。

render 方法

  public function render(){return view('admin::form.row', ['fields' => $this->fields]);}

admin::form.row 视图

<div class="row">@foreach($fields as $field)<div class="col-md-{{ $field['width'] }}">{!! $field['element']->render() !!}</div>@endforeach
</div>

$field [‘element’]->render () 就是将字段渲染成 html
我们可以 dd 下 $this->fields , 看看其数据结构

详情的多栏目布局
思路:详情的多栏目布局是需要重新开发的,思路逻辑是和表单的多栏目布局类似的
主要是创建一个 Dcat\Admin\Show\Row 文件,里面的代码如下

<?php
namespace Dcat\Admin\Show;
use Dcat\Admin\Show;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Support\Collection;
class Row implements Renderable
{/*** Callback for add field to current row.s.** @var \Closure*/protected $callback;/*** Parent show.** @var Show*/protected $show;/*** @var Collection*/protected $fields;/*** Default field width for appended field.** @var int*/protected $defaultFieldWidth = 12;/*** Row constructor.** @param \Closure $callback* @param Show $show*/public function __construct(\Closure $callback, Show $show){$this->callback = $callback;$this->show = $show;$this->fields = new Collection();call_user_func($this->callback, $this);}/*** Render the row.** @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View*/public function render(){return view('admin::show.row', ['fields' => $this->fields]);}/*** @return Collection|\Dcat\Admin\Show\Field[]*/public function fields(){return $this->fields;}/*** Set width for a incomming field.** @param int $width** @return $this*/public function width($width = 12){$this->defaultFieldWidth = $width;return $this;}/*** Add field.** @param string $name* @param string $label** @return \Dcat\Admin\Show\Field*/public function field($name, $label = ''){$field = $this->show->field($name, $label);$this->pushField($field);return $field;}/*** Add field.** @param $name** @return \Dcat\Admin\Show\Field|Collection*/public function __get($name){$field = $this->show->field($name);$this->pushField($field);return $field;}/*** @param $method* @param $arguments** @return \Dcat\Admin\Show\Field*/public function __call($method, $arguments){$field = $this->show->__call($method, $arguments);$this->pushField($field);return $field;}/*** @param \Dcat\Admin\Show\Field $field** @return void*/protected function pushField($field){$this->fields->push(['width'   => $this->defaultFieldWidth,'element' => $field,]);}
}

里面 __ cal l, __get , field 三个方法都是获取当前行的字段信息,并保存到行的属性,在最后渲染详情的时候先循环 rows(这一步在 Dcat\Admin\Show\Panel 的 render 方法), 在通过上面代码中的 render 方法渲染 rows 的每个字段;如下:

html 如下

<div class="box-body"><div class="form-horizontal mt-1">@if($rows->isEmpty())@foreach($fields as $field){!! $field->render() !!}@endforeach@else<div>@foreach($rows as $row){!! $row->render() !!}@endforeach</div>@endif<div class="clearfix"></div></div>
</div>

使用代码:

控制器创建一个 detail 方法

protected function detail($id){return Show::make($id, new WxyMaterialItem("brands"), function (Show $show) {$show->row(function (Show\Row $row) {$row->width(6)->name;$row->width(6)->simple_code;});$show->row(function (Show\Row $row) {$row->width(4)->specs;$row->width(4)->integral_money;$row->width(4)->field("aa", "你好");});$show->row(function (Show\Row $row) {$row->width(4)->mdept_id("部门");$row->width(4)->status;$row->width(4)->field("brands.name", "品牌");});});}

Laravel Dcat-admin 详情页多栏布局开发相关推荐

  1. 移动端通用元件库+app通用元件库+数据展示+操作反馈+通用模板+数据录入+列表页+表单页+详情页+通用版布局+移动端手机模板+业务组件+反馈组件+展示组件+表单组件+导航组件

    移动端通用元件库+app通用元件库+数据展示+操作反馈+通用模板+数据录入+列表页+表单页+详情页+通用版布局+移动端手机模板+业务组件+反馈组件+展示组件+表单组件+导航组件 原型展示及下载地址:h ...

  2. Axure通用web端元件库rplib文件格式+移动端app通用元件库rplib文件格式+电脑端动态可视化图表元件库+数据展示+操作反馈+通用模板+数据录入+列表页+表单页+详情页+通用版布局

    作品介绍:Axure通用web端元件库rplib文件格式+移动端app通用元件库rplib文件格式+电脑端动态可视化图表元件库+数据展示+操作反馈+通用模板+数据录入+列表页+表单页+详情页+通用版布 ...

  3. Laravel + Dcat admin 开发一个健壮的 erp 项目

    原文地址 : Laravel + Dcat admin 开发一个健壮的 erp 项目 背景 4个月前我写过一篇文章 dcat-admin 开源框架在 erp 项目中的应用 在几个月前我只是用其完成一些 ...

  4. 电商详情页设计小程序开发分享,支持微信转发,可用于增加微信转发,提高转化率

    详情页设计小程序开发总结 简介 详情页设计小程序功能 详情页设计源码介绍 详情页设计小程序 首页 详情页 开发台文件介绍 详情页设计小程序总结 详情页设计免费源码 简介 从电商出现后,详情页设计变得非 ...

  5. Laravel Dcat Admin 安装

    安装 环境 PHP >= 7.1 Laravel 5.5.0 ~ 7.* Fileinfo PHP Extension 开始安装 如果安装过程中出现 composer 下载过慢或安装失败的情况, ...

  6. 启益电商:商品详情页排版布局怎么做

    在制作宝贝详情页的时候,当然要以客户的需求为中心,主要是让客户看完详情页后产生购买产品的想法.而详情页错误的布局,不仅不能激发客户的潜在需求,还会让客户觉得凌乱.详细的页面布局如何事半功倍? 1.属性 ...

  7. 【Vue项目复习笔记】详情页的展示

    一.跳转详情页并携带iid 1.点击商品跳转到详情页 当我们点击GoodListItem中的每一个item,就跳转到对应的页面.我们首先要做的就是监听GoodsListItem的点击 在GoodsLi ...

  8. html列表详情页,如何区分一个页面是列表页还是详情页

    解析页面是做爬虫的过程中的重要环节,而且如果站点多了,解析也会变得非常复杂,所以智能化解析就可能是一个不错的解决方案.如果我们能够容忍一定的错误率,那么我们可以利用智能化解析算法帮我们提取一些内容,简 ...

  9. 商品详情页上拉查看详情开源库

    商品详情页上拉查看详情 目录介绍 01.该库介绍 02.效果展示 03.如何使用 04.注意要点 05.优化问题 06.部分代码逻辑 07.参考案例 01.该库介绍 模仿淘宝.京东.考拉等商品详情页分 ...

最新文章

  1. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 't
  2. 绝对精华,大牛教你在Android系统上安装linux发行版
  3. Linux 各文件系统配置
  4. 乌班图 修改ip_Ubuntu临时和永久修改ip地址掩码和网关
  5. 【渝粤教育】电大中专药事管理与法规 (2)_1作业 题库
  6. python nodemcu_python开发nodemcu2(跑马灯实验)
  7. 【NetApp】NetApp存储设备的CPU使用率分析
  8. 2019年华为JAVA面试题系列
  9. eas bos根据合同类别过滤自定义核算项目
  10. FineReport html5图表简介
  11. Maya Python 第七章 使用Maya命令创建基本工具 7.1-7.3
  12. vs2019下载不了的解决办法
  13. js对象转数组可枚举属性和不可枚举属性
  14. java变量的定义_Java变量_Java变量概念定义
  15. JAVA对象 到底是什么?
  16. 我的java学习之路之Spring MVC
  17. FPU烤机是什么意思 FPU烤机用什么软件
  18. Oracle根据中文首字母排序
  19. java中类变量局部量_java入门---变量类型类变量局部变量实例变量静态变量
  20. jqu操作class 实现动态导航菜单

热门文章

  1. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)
  2. 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息
  3. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵
  4. ARM Cortex-M嵌入式C基础编程(下)
  5. Python:数据提取之JSON与JsonPATH
  6. react控制 input 框回车之后内容清空
  7. Android CheckBox 点击的时候没有效果
  8. 不支持打开非业务域名htts:....请重新配置
  9. Dundas使用手册
  10. 20190702 论回去