docs-master
README
dcat-2.x
数据仓库
字段显示
区块
扩展版本与升级
下拉菜单
模态窗 (Modal)
数据详情字段翻译
单/复选框
数据详情基本使用
图片/文件上传
change-log
数据详情动作
开发工具
JS组件
多语言
详情字段显示扩展
查询过滤
版本升级须知
拓展-开发工具
扩展
extend
提示窗
行的使用和扩展
帮助函数
自定义导出
关联关系
widgets-markdown
列过滤器
模型树动作
安装
主题开发
开发前必读
扩展基本使用
数据统计卡片
LICENSE
model-form-trans
警告框
视图与自定义页面
主题与颜色
开发扩展
工具栏
头部和脚部
JSON格式字段处理
异步加载基本使用
数据导出
Dcat Admin
数据软删除
自定义登陆
dcat-admin
v1.x版本升级指南
快捷创建
自定义头部导航条
快速开始
多应用 (多后台)
常见问题汇总
卡片
动作基本使用
模型树
选项卡
BETA版本更新日志
数据详情初始化
静态资源加载
菜单
权限控制
Laravel Octane
入门
表单
表单字段的管理
表单回调
分步表单
表单数据源
表单字段动态显示
表单字段动态显示
表单验证
表单关联关系
表单字段的使用
表单基本使用
动作以及表单响应
数据表单动作
表单布局
表单初始化
表单弹窗
工具表单
表格
表头
图表
控制器编写规范
表单字段的管理

表单字段的管理

扩展自定义组件

在开始扩展表单组件之前需要先了解动态监听元素生成 (init)功能,表单组件的JS代码建议都使用Dcat.init方法监听并初始化,否则可能无法兼容Form::hasMany以及Form::array等动态生成字段的表单类型。

集成富文本编辑器wangEditor

wangEditor是一个优秀的国产的轻量级富文本编辑器,如果dcat-admin自带的基于ckeditor的编辑器组件使用上有问题,可以通过下面的步骤可以集成它,并覆盖掉默认的editor

为了方便演示,示例中直接使用CDN链接。实际开发中需要先下载前端库文件wangEditor到服务器,解压到目录public/vendor/wangEditor-4.7.1

新建组件类app/Admin/Extensions/Form/WangEditor.php

复制<?php

namespace App\Admin\Extensions\Form;

use Dcat\Admin\Form\Field;

class WangEditor extends Field
{
    protected $view = 'admin.wang-editor';
}

新建视图文件resources/views/admin/wang-editor.blade.php

复制<div class="{{$viewClass['form-group']}}">

    <label class="{{$viewClass['label']}} control-label">{{$label}}</label>

    <div class="{{$viewClass['field']}}">

        @include('admin::form.error')

        <div {!! $attributes !!} style="width: 100%; height: 100%;">
            <p>{!! $value !!}</p>
        </div>

        <input type="hidden" name="{{$name}}" value="{{ old($column, $value) }}" />

        @include('admin::form.help-block')

    </div>
</div>

<!-- script标签加上 "init" 属性后会自动使用 Dcat.init() 方法动态监听元素生成 -->
<script require="@wang-editor" init="{!! $selector !!}">
    var E = window.wangEditor
    // id 变量是 Dcat.init() 自动生成的,是一个唯一的随机字符串
    var editor = new E('#' + id);
    editor.config.zIndex = 0
    editor.config.uploadImgShowBase64 = true
    editor.config.onchange = function (html) {
        $this.parents('.form-field').find('input[type="hidden"]').val(html);
    }
    editor.create()
</script>

然后注册进dcat-admin,在app/Admin/bootstrap.php中添加以下代码:

复制<?php

use App\Admin\Extensions\Form\WangEditor;
use Dcat\Admin\Form;

// 注册前端组件别名
Admin::asset()->alias('@wang-editor', [
    // 为了方便演示效果,这里直接加载CDN链接,实际开发中可以下载到服务器加载
    'js' => ['https://cdn.jsdelivr.net/npm/wangeditor@4.7.1/dist/wangEditor.min.js'],
]);

Form::extend('editor', WangEditor::class);

调用:

复制$form->editor('body');

集成富文本编辑器ckeditor

先下载ckeditor 并解压到/public目录,比如放在/public/packages/目录下。

然后新建扩展文件app/Admin/Extensions/Form/CKEditor.php:

复制<?php

namespace App\Admin\Extensions\Form;

use Dcat\Admin\Form\Field;

class CKEditor extends Field
{
    protected $view = 'admin.ckeditor';
}

新建view resources/views/admin/ckeditor.blade.php:

复制<div class="{{$viewClass['form-group']}}">

    <label class="{{$viewClass['label']}} control-label">{{$label}}</label>

    <div class="{{$viewClass['field']}}">

        @include('admin::form.error')

        <textarea name="{{ $name}}" placeholder="{{ $placeholder }}" {!! $attributes !!} >{!! $value !!}</textarea>

        @include('admin::form.help-block')

    </div>
</div>

<script require="@ckeditor" init="{!! $selector !!}">
    $this.ckeditor();
</script>

然后在app/Admin/bootstrap.php中引入扩展:

复制use App\Admin\Extensions\Form\CKEditor;
use Dcat\Admin\Form;

// 注册前端组件别名
Admin::asset()->alias('@ckeditor', [
    'js' => [
        '/packages/ckeditor/ckeditor.js',
        '/packages/ckeditor/adapters/jquery.js',
    ],
]);

Form::extend('ckeditor', CKEditor::class);

然后就能在form中使用了:

复制$form->ckeditor('content');

集成PHP editor

通过下面的步骤来扩展一个基于codemirror的PHP代码编辑器,效果参考PHP mode

先将codemirror库下载并解压到前端资源目录下,比如放在public/packages/codemirror-5.20.2目录下。

新建组件类app/Admin/Extensions/Form/PHPEditor.php:

复制<?php

namespace App\Admin\Extensions\Form;

use Dcat\Admin\Form\Field;

class PHPEditor extends Field
{
    protected $view = 'admin.php-editor';
}

{tip} 类中的静态资源也同样可以从外部引入,参考Editor.php

创建视图resources/views/admin/php-editor.blade.php:

复制<div class="{{$viewClass['form-group']}}">

    <label class="{{$viewClass['label']}} control-label">{{$label}}</label>

    <div class="{{$viewClass['field']}}">

        @include('admin::form.error')

        <textarea class="{{ $class }}"   {!! $attributes !!} >{!! $value !!}</textarea>

        <input type="hidden" name="{{$name}}" value="{{ old($column, $value) }}" />

        @include('admin::form.help-block')
    </div>
</div>

<script require="@phpeditor" init="{!! $selector !!}">
    var Editor = CodeMirror.fromTextArea(document.getElementById(id), {
        lineNumbers: true,
        mode: "text/x-php",
        extraKeys: {
            "Tab": function(cm){
                cm.replaceSelection("    " , "end");
            }
        }
    });
    Editor.on("change", function (Editor, changes) {
        let val = Editor.getValue();
        //console.log(val);
        $this.parents('.form-field').find('input[type="hidden"]').val(val);
    });
</script>

最后找到文件app/Admin/bootstrap.php,如果文件不存在,请更新dcat-admin,然后新建该文件,添加下面代码:

复制<?php

use App\Admin\Extensions\Form\PHPEditor;
use Dcat\Admin\Form;

Admin::asset()->alias('@phpeditor', [
    'js' => [
        '/packages/codemirror-5.20.2/lib/codemirror.js',
        '/packages/codemirror-5.20.2/addon/edit/matchbrackets.js',
        '/packages/codemirror-5.20.2/mode/htmlmixed/htmlmixed.js',
        '/packages/codemirror-5.20.2/mode/xml/xml.js',
        '/packages/codemirror-5.20.2/mode/javascript/javascript.js',
        '/packages/codemirror-5.20.2/mode/css/css.js',
        '/packages/codemirror-5.20.2/mode/clike/clike.js',
        '/packages/codemirror-5.20.2/mode/php/php.js',
    ],
    'css' => '/packages/codemirror-5.20.2/lib/codemirror.css',
]);

Form::extend('php', PHPEditor::class);

这样就能在model-form中使用PHP编辑器了:

复制$form->php('code');

通过这种方式,可以添加任意你想要添加的form组件。

常用方法

表单组件是Dcat Admin中最为复杂的组件,下面列一些在扩展表单组件中可能需要用到的方法

处理用户输入的表单值 (prepareInputValue)

通过prepareInputValue方法可以处理用户输入的表单值,默认不做任何处理。此方法在Form表单的saving事件触发之后,表单字段的saving方法之前执行

{tip} 这个功能类似Laravel model中的修改器

复制class PHPEditor extends Field
{
    ...

    // 把用户输入的表单值转化为 string 格式保存到数据库
    protected function prepareInputValue($value)
    {
        return (string) $value;
    }
}

处理待显示的字段值 (formatFieldData)

通过formatFieldData方法可以处理处理待显示的字段值。此方法在表单字段的customFormat方法之前执行

{tip} 这个功能类似Laravel model中的访问器

复制class PHPEditor extends Field
{
    ...

    // 把字段值转化为数组格式
    // $data是当前表单的编辑数据,数据格式是 array
    protected function formatFieldData($data)
    {
        // 获取到当前字段值
        $value = parent::formatFieldData($data);

        // 处理字段值
        ...

        return $value;
    }
}

获取元素CSS选择器 (getElementClassSelector)

表单组件类实例化后会根据字段名称生成一个css class,然后传递到模板中,我们通常可以通过这个class获取到当前表单的元素对象

模板

复制<div class="{{$viewClass['form-group']}}">

    <div class="{{ $viewClass['label'] }} control-label">
        <span>{!! $label !!}</span>
    </div>

    <div class="{{$viewClass['field']}}">

        @include('admin::form.error')

        <input type="hidden" name="{{$name}}"/>

        <select style="width: 100%;" name="{{$name}}" {!! $attributes !!} >
           <option value=""></option>
           @foreach($options as $select => $option)
               <option value="{{$select}}" {{ Dcat\Admin\Support\Helper::equal($select, $value) ?'selected':'' }}>{{$option}}</option>
           @endforeach
        </select>

        @include('admin::form.help-block')

    </div>
</div>


<script require="..." init="{!! $selector !!}">
    // 这里的 $selector 即是当前字段的 css选择器
    $this.select2($configs);
</script>

JS代码

为了让扩展的表单组件能够兼容HasManyarray以及Table表单,我们必须使用动态监听元素生成 (init)功能

复制<div class="{{$viewClass['form-group']}}">
    ...
</div>


<script require="..." init="{!! $selector !!}">
    $this.select2($configs);
</script>

dcat-admin

dcat-admin


表单字段的管理

<h1>表单字段的管理</h1> <h2>扩展自定义组件</h2> <p>在开始扩展表单组件之前需要先了解<a href="js.md#init">动态监听元素生成 (init)</a>功能,表单组件的<code>JS</code>代码建议都使用<code>Dcat.init</code>方法监听并初始化,否则可能无法兼容<code>Form::hasMany</code>以及<code>Form::array</code>等动态生成字段的表单类型。</p> <h3>集成富文本编辑器wangEditor</h3> <p><a href="http://www.wangeditor.com/">wangEditor</a>是一个优秀的国产的轻量级富文本编辑器,如果<code>dcat-admin</code>自带的基于<code>ckeditor</code>的编辑器组件使用上有问题,可以通过下面的步骤可以集成它,并覆盖掉默认的<code>editor</code>:</p> <p>&gt; 为了方便演示,示例中直接使用CDN链接。实际开发中需要先下载前端库文件<a href="https://github.com/wangfupeng1988/wangEditor/releases">wangEditor</a>到服务器,解压到目录<code>public/vendor/wangEditor-4.7.1</code>。</p> <p>新建组件类<code>app/Admin/Extensions/Form/WangEditor.php</code>。</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Extensions\Form; use Dcat\Admin\Form\Field; class WangEditor extends Field { protected $view = 'admin.wang-editor'; }</code></pre> <p>新建视图文件<code>resources/views/admin/wang-editor.blade.php</code>:</p> <pre><code class="language-html">&amp;lt;div class=&amp;quot;{{$viewClass['form-group']}}&amp;quot;&amp;gt; &amp;lt;label class=&amp;quot;{{$viewClass['label']}} control-label&amp;quot;&amp;gt;{{$label}}&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;{{$viewClass['field']}}&amp;quot;&amp;gt; @include('admin::form.error') &amp;lt;div {!! $attributes !!} style=&amp;quot;width: 100%; height: 100%;&amp;quot;&amp;gt; &amp;lt;p&amp;gt;{!! $value !!}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;{{$name}}&amp;quot; value=&amp;quot;{{ old($column, $value) }}&amp;quot; /&amp;gt; @include('admin::form.help-block') &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- script标签加上 &amp;quot;init&amp;quot; 属性后会自动使用 Dcat.init() 方法动态监听元素生成 --&amp;gt; &amp;lt;script require=&amp;quot;@wang-editor&amp;quot; init=&amp;quot;{!! $selector !!}&amp;quot;&amp;gt; var E = window.wangEditor // id 变量是 Dcat.init() 自动生成的,是一个唯一的随机字符串 var editor = new E('#' + id); editor.config.zIndex = 0 editor.config.uploadImgShowBase64 = true editor.config.onchange = function (html) { $this.parents('.form-field').find('input[type=&amp;quot;hidden&amp;quot;]').val(html); } editor.create() &amp;lt;/script&amp;gt;</code></pre> <p>然后注册进<code>dcat-admin</code>,在<code>app/Admin/bootstrap.php</code>中添加以下代码:</p> <pre><code class="language-php">&amp;lt;?php use App\Admin\Extensions\Form\WangEditor; use Dcat\Admin\Form; // 注册前端组件别名 Admin::asset()-&amp;gt;alias('@wang-editor', [ // 为了方便演示效果,这里直接加载CDN链接,实际开发中可以下载到服务器加载 'js' =&amp;gt; ['https://cdn.jsdelivr.net/npm/wangeditor@4.7.1/dist/wangEditor.min.js'], ]); Form::extend('editor', WangEditor::class);</code></pre> <p>调用:</p> <pre><code class="language-php">$form-&amp;gt;editor('body');</code></pre> <h3>集成富文本编辑器ckeditor</h3> <p>先下载<a href="http://ckeditor.com/download">ckeditor</a> 并解压到/public目录,比如放在<code>/public/packages/</code>目录下。</p> <p>然后新建扩展文件<code>app/Admin/Extensions/Form/CKEditor.php</code>:</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Extensions\Form; use Dcat\Admin\Form\Field; class CKEditor extends Field { protected $view = 'admin.ckeditor'; }</code></pre> <p>新建view <code>resources/views/admin/ckeditor.blade.php</code>:</p> <pre><code class="language-html">&amp;lt;div class=&amp;quot;{{$viewClass['form-group']}}&amp;quot;&amp;gt; &amp;lt;label class=&amp;quot;{{$viewClass['label']}} control-label&amp;quot;&amp;gt;{{$label}}&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;{{$viewClass['field']}}&amp;quot;&amp;gt; @include('admin::form.error') &amp;lt;textarea name=&amp;quot;{{ $name}}&amp;quot; placeholder=&amp;quot;{{ $placeholder }}&amp;quot; {!! $attributes !!} &amp;gt;{!! $value !!}&amp;lt;/textarea&amp;gt; @include('admin::form.help-block') &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script require=&amp;quot;@ckeditor&amp;quot; init=&amp;quot;{!! $selector !!}&amp;quot;&amp;gt; $this.ckeditor(); &amp;lt;/script&amp;gt;</code></pre> <p>然后在<code>app/Admin/bootstrap.php</code>中引入扩展:</p> <pre><code class="language-php">use App\Admin\Extensions\Form\CKEditor; use Dcat\Admin\Form; // 注册前端组件别名 Admin::asset()-&amp;gt;alias('@ckeditor', [ 'js' =&amp;gt; [ '/packages/ckeditor/ckeditor.js', '/packages/ckeditor/adapters/jquery.js', ], ]); Form::extend('ckeditor', CKEditor::class);</code></pre> <p>然后就能在form中使用了:</p> <pre><code class="language-php">$form-&amp;gt;ckeditor('content');</code></pre> <h3>集成PHP editor</h3> <p>通过下面的步骤来扩展一个基于<a href="http://codemirror.net/index.html">codemirror</a>的PHP代码编辑器,效果参考<a href="http://codemirror.net/mode/php/">PHP mode</a>。</p> <p>先将<a href="http://codemirror.net/codemirror.zip">codemirror</a>库下载并解压到前端资源目录下,比如放在<code>public/packages/codemirror-5.20.2</code>目录下。</p> <p>新建组件类<code>app/Admin/Extensions/Form/PHPEditor.php</code>:</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Extensions\Form; use Dcat\Admin\Form\Field; class PHPEditor extends Field { protected $view = 'admin.php-editor'; } </code></pre> <p>&gt; {tip} 类中的静态资源也同样可以从外部引入,参考<a href="https://github.com/jqhph/dcat-admin/blob/master/src/Form/Field/Editor.php">Editor.php</a></p> <p>创建视图<code>resources/views/admin/php-editor.blade.php</code>:</p> <pre><code class="language-html">&amp;lt;div class=&amp;quot;{{$viewClass['form-group']}}&amp;quot;&amp;gt; &amp;lt;label class=&amp;quot;{{$viewClass['label']}} control-label&amp;quot;&amp;gt;{{$label}}&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;{{$viewClass['field']}}&amp;quot;&amp;gt; @include('admin::form.error') &amp;lt;textarea class=&amp;quot;{{ $class }}&amp;quot; {!! $attributes !!} &amp;gt;{!! $value !!}&amp;lt;/textarea&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;{{$name}}&amp;quot; value=&amp;quot;{{ old($column, $value) }}&amp;quot; /&amp;gt; @include('admin::form.help-block') &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script require=&amp;quot;@phpeditor&amp;quot; init=&amp;quot;{!! $selector !!}&amp;quot;&amp;gt; var Editor = CodeMirror.fromTextArea(document.getElementById(id), { lineNumbers: true, mode: &amp;quot;text/x-php&amp;quot;, extraKeys: { &amp;quot;Tab&amp;quot;: function(cm){ cm.replaceSelection(&amp;quot; &amp;quot; , &amp;quot;end&amp;quot;); } } }); Editor.on(&amp;quot;change&amp;quot;, function (Editor, changes) { let val = Editor.getValue(); //console.log(val); $this.parents('.form-field').find('input[type=&amp;quot;hidden&amp;quot;]').val(val); }); &amp;lt;/script&amp;gt;</code></pre> <p>最后找到文件<code>app/Admin/bootstrap.php</code>,如果文件不存在,请更新<code>dcat-admin</code>,然后新建该文件,添加下面代码:</p> <pre><code>&amp;lt;?php use App\Admin\Extensions\Form\PHPEditor; use Dcat\Admin\Form; Admin::asset()-&amp;gt;alias('@phpeditor', [ 'js' =&amp;gt; [ '/packages/codemirror-5.20.2/lib/codemirror.js', '/packages/codemirror-5.20.2/addon/edit/matchbrackets.js', '/packages/codemirror-5.20.2/mode/htmlmixed/htmlmixed.js', '/packages/codemirror-5.20.2/mode/xml/xml.js', '/packages/codemirror-5.20.2/mode/javascript/javascript.js', '/packages/codemirror-5.20.2/mode/css/css.js', '/packages/codemirror-5.20.2/mode/clike/clike.js', '/packages/codemirror-5.20.2/mode/php/php.js', ], 'css' =&amp;gt; '/packages/codemirror-5.20.2/lib/codemirror.css', ]); Form::extend('php', PHPEditor::class);</code></pre> <p>这样就能在<a href="model-form.md">model-form</a>中使用PHP编辑器了:</p> <pre><code>$form-&amp;gt;php('code');</code></pre> <p>通过这种方式,可以添加任意你想要添加的<code>form</code>组件。</p> <h2>常用方法</h2> <p>表单组件是<code>Dcat Admin</code>中最为复杂的组件,下面列一些在扩展表单组件中可能需要用到的方法</p> <h3>处理用户输入的表单值 (prepareInputValue)</h3> <p>通过<code>prepareInputValue</code>方法可以处理用户输入的表单值,默认不做任何处理。此方法在<code>Form</code>表单的<code>saving</code>事件触发之后,表单字段的<code>saving</code>方法之前执行</p> <p>&gt; {tip} 这个功能类似<code>Laravel model</code>中的<strong>修改器</strong>。</p> <pre><code class="language-php">class PHPEditor extends Field { ... // 把用户输入的表单值转化为 string 格式保存到数据库 protected function prepareInputValue($value) { return (string) $value; } }</code></pre> <h3>处理待显示的字段值 (formatFieldData)</h3> <p>通过<code>formatFieldData</code>方法可以处理处理待显示的字段值。此方法在表单字段的<code>customFormat</code>方法之前执行</p> <p>&gt; {tip} 这个功能类似<code>Laravel model</code>中的<strong>访问器</strong>。</p> <pre><code class="language-php">class PHPEditor extends Field { ... // 把字段值转化为数组格式 // $data是当前表单的编辑数据,数据格式是 array protected function formatFieldData($data) { // 获取到当前字段值 $value = parent::formatFieldData($data); // 处理字段值 ... return $value; } }</code></pre> <h3>获取元素CSS选择器 (getElementClassSelector)</h3> <p>表单组件类实例化后会根据字段名称生成一个<code>css class</code>,然后传递到模板中,我们通常可以通过这个<code>class</code>获取到当前表单的元素对象</p> <p>模板</p> <pre><code class="language-html">&amp;lt;div class=&amp;quot;{{$viewClass['form-group']}}&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;{{ $viewClass['label'] }} control-label&amp;quot;&amp;gt; &amp;lt;span&amp;gt;{!! $label !!}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;{{$viewClass['field']}}&amp;quot;&amp;gt; @include('admin::form.error') &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;{{$name}}&amp;quot;/&amp;gt; &amp;lt;select style=&amp;quot;width: 100%;&amp;quot; name=&amp;quot;{{$name}}&amp;quot; {!! $attributes !!} &amp;gt; &amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/option&amp;gt; @foreach($options as $select =&amp;gt; $option) &amp;lt;option value=&amp;quot;{{$select}}&amp;quot; {{ Dcat\Admin\Support\Helper::equal($select, $value) ?'selected':'' }}&amp;gt;{{$option}}&amp;lt;/option&amp;gt; @endforeach &amp;lt;/select&amp;gt; @include('admin::form.help-block') &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script require=&amp;quot;...&amp;quot; init=&amp;quot;{!! $selector !!}&amp;quot;&amp;gt; // 这里的 $selector 即是当前字段的 css选择器 $this.select2($configs); &amp;lt;/script&amp;gt;</code></pre> <h3>JS代码</h3> <p>为了让扩展的表单组件能够兼容<code>HasMany</code>、<code>array</code>以及<code>Table</code>表单,我们必须使用<a href="js.md#init">动态监听元素生成 (init)</a>功能</p> <pre><code class="language-html">&amp;lt;div class=&amp;quot;{{$viewClass['form-group']}}&amp;quot;&amp;gt; ... &amp;lt;/div&amp;gt; &amp;lt;script require=&amp;quot;...&amp;quot; init=&amp;quot;{!! $selector !!}&amp;quot;&amp;gt; $this.select2($configs); &amp;lt;/script&amp;gt;</code></pre>

页面列表

ITEM_HTML