homepagePHP/docs/FormBuilder.md

307 lines
11 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## FormBuilder
#### 事件
+ startHandlePostData
确定按钮会监听该事件类型,可传递一个按钮描述。触发该事件后确定按钮会无效,描述会改成传递的字符串。
+ endHandlePostData
确定按钮会监听该事件类型,触发该事件,确定按钮会重新生效,按钮描述会恢复。
#### ueditor
设置上传文件或抓取远程图的url前缀和url后缀
```php
//addFormItem第七个参数传递指定的上传处理地址加上url_prefix参数和url_suffix
//拼接出的url结果 url_prefix . url原来的相对路径. url_suffix
->addFormItem('desc', 'ueditor', '商家简介', '', '', '', 'data-url="/Public/libs/ueditor/php/controller.php?url_prefix=prefix地址&url_suffix=后缀"')
//场景举例:
//某些管理员在上传富文本图片时,会上传一张非常大的图片,这样会导致用户访问该页面异常缓慢
//这时可以利用url_prefix配合imageproxy做到自动降低图片大小降低图片占用的网络带宽
$url_prefix = U('/ip/q90', '', false, true) . '/' . U('/', '', false, true);
//url_prefix = http://域名/ip/q90/http://域名/图片地址
->addFormItem('desc', 'ueditor', '商家简介', '', '', '', 'data-url="/Public/libs/ueditor/php/controller.php?url_prefix=' . $url_prefix . '"')
```
+ insertframe: 默认启用。用于插入```<iframe></iframe>```或```url```,可以编辑宽高,边框,是否允许滚动,对齐方式等属性,其他属性会被删除。
+ insert_richtext: 默认启用。通过```微信公众号url```,可以抓取微信公众号的文章内容以及图片
使用oss作为文件存储服务
```php
//addFormItem第七个参数传递指定的上传处理地址, oss设为1表示开始oss上传处理type为指定的上传配置类型
->addFormItem('content', 'ueditor', '正文内容','', '','','data-url="/Public/libs/ueditor/php/controller.php?oss=1&type=image"')
//若oss采用cdn域名则需要在config.php对应的上传类型中加上
'oss_options' => [
'bucket'=>'******真实的bucket名******',
],
```
通过forcecatchremote属性设置是否强制要求抓取外链图片至本地该属性默认为true。
```blade
复制外链文章时会抓取外链图片至本地。若该属性为true则未抓取完会显示loadding图片且不能保存若该属性为false如果未等全部抓取完就保存此时图片还是外链。
```
```php
//addFormItem第七个参数设置data-forcecatchremote="true"
->addFormItem('desc', 'ueditor', '商家简介', '', '', '', 'data-forcecatchremote="true"')
```
重新指定UE的JS CONFIG文件的路径
```php
//在Common/Conf/config.php中新增配置值
'CUSTOM_UEDITOR_JS_CONFIG' => __ROOT__ . '/Public/static/ueditor.config.js' //注意必须加上__ROOT__为了兼容根目录是网站子路径的情况
```
设置ue的option参数
```php
//如想通过form.options来配置ue的toolbars参数
//组件会自动完成php数组--》js json对象的转换并传入ue中
->addFormItem('content', 'ueditor', '内容', '', ['toolbars' => [['attachment']]])
```
自定义UE色板
```php
全局配置
1.先COPYueditor.config.js文件到项目路径重新指定JS CONFIG路径
2.修改ueditor.config.js 的customColors配置项第一行10色块为主题色块 最后一行10色块为标准色块可按照需要自行增删改里面的色值。
局部配置
1. 在Formbuilder设置formItem时可传递customColors的设置详细方法查看“设置ue的option参数”
```
自定义上传config设置
```blade
在app/Common/Conf 下新增ueditor_config.json或者ueditor_config.php(返回数组)该文件将会替换掉默认的config.json。如有客制化config.json的需求定制该文件即可。
```
#### addFormItem
```blade
该方法用于加入一个表单项
参数
$name item名
$type item类型(取值参考系统配置FORM_ITEM_TYPE)
$title item标题
$tip item提示说明
$options item options
$extra_class item项额外样式如使用hidden则隐藏item
$extra_attr item项额外属性
$auth_node item权限点需要先添加该节点若该用户无此权限则unset该item格式为模块.控制器.方法名,如:['admin.Box.allColumns']
若auth_node存在多个值支持配置不同逻辑logic值为and或者or判断是否显示该item默认为and
and用户拥有全部权限则显示该item格式为
['node' => ['模块.控制器.方法名','模块.控制器.方法名'], 'logic' => 'and']
or用户一个权限都没有则隐藏该item格式为
['node' => ['模块.控制器.方法名','模块.控制器.方法名'], 'logic' => 'or']
```
#### 只读模式
可通过setReadOnly(true)方法设置form为只读模式默认是关闭
只读模式需要组件支持
组件可通过传入的设置项获取是否只读模式,然后做相应的展示适配
如Text组件
```php
class Text implements FormType {
public function build(array $form_type){
$view = new View();
$view->assign('form', $form_type);
if($form_type['item_option']['read_only']){
$content = $view->fetch(__DIR__ . '/text_read_only.html');
}
else{
$content = $view->fetch(__DIR__ . '/text.html');
}
return $content;
}
}
```
#### 扩展表单与按扭间的底部内容
通过addBottom向表单加入需要的html/js代码
```php
//TableBuilder 和 DividerBuilder 为 qscmf-antd-builder的模块功能
$table_builder = new TableBuilder();
$table_builder->addColumn([ 'title' => 'Name', 'dataIndex' => 'name']);
$table_builder->addColumn([ 'title' => 'Age', 'dataIndex' => 'age']);
$table_builder->addColumn([ 'title' => 'Address', 'dataIndex' => 'address']);
$table_builder->addRow(['key' => 1, 'name' => 'John Brown', 'age' => 32, 'address' => 'New York No. 1 Lake Park']);
$table_builder->addRow(['key' => 2, 'name' => 'Jim Green', 'age' => 42, 'address' => 'London No. 1 Lake Park']);
$table_builder->addRow(['key' => 3, 'name' => 'Joe Black', 'age' => 32, 'address' => 'Sidney No. 1 Lake Park']);
$formbuilder = new FormBuilder();
.
.
.
$formbuilder->setReadOnly(true)
->addBottom((new DividerBuilder())->setTitle('筹款记录'))
->addBottom($table_builder)
->display();
```
#### setShowBtn
```blade
该方法用于设置是否展示默认按钮(确定、返回)
参数
$is_show 是否展示默认为true
```
#### display
```blade
该方法用于显示页面,支持获取输出页面的内容
参数
$render 是否输出页面的内容默认为false
```
效果图
<img src='https://user-images.githubusercontent.com/1665649/85219268-f5699f00-b3d4-11ea-98a0-6192336872b8.png' />
#### district组件
```blade
省市区三级联动
支持自定义省市区数据源api默认为U('Api/Area/getArea')
```
```php
// 使用说明
// addFormItem第五个参数传递自定义api加上area_api_url
->addFormItem('city_id', 'district', '城市', '', ['area_api_url' => U('Api/Area/fetchLimitCity', '', '', true)]);
```
#### select2组件
```blade
下拉选择,支持模糊搜索
支持多选
```
```php
// 使用说明
// addFormItem第七个参数传递extra_attr值包括multiple="multiple"
$project_info = [
'41' => 'text1',
'42' => 'text2',
'43' => 'text3',
];
->addFormItem('project_id','项目','select2', '', $project_info, '', 'multiple="multiple"');
// 初始化多选选中的值,选中键值的字符串或者数组
// 字符串
->setFormData(["project_id" => "41,42"]);
// 数组
->setFormData(["project_id" => ["41,42"]]);
```
可使用extra_attr参数设置的属性说明
+ multiple
```text
多选
multiple="multiple"
```
+ dropdownParent
```text
select2组件默认追加在body元素末尾在modal或者其它容器中使用select2会出现一些意外情况如无法在搜索框输入内容。
可以使用此属性修改其位置,将组件放入容器内,避免意外情况。
dropdownParent="dom_id"
```
+ allowClear
```text
是否可清除false 否 true 是默认为true
allowClear="true"
```
#### 字段权限过滤机制
```blade
当系统存在多种不同类型的用户,特定字段只有部分用户有操作权限,可以添加虚拟节点为权限点,有该权限点的用户才可以操作该字段。
```
##### 场景模拟
```blade
如系统存在机构管理员OrgUser与书库点管理员LibraryUser均可新增或者编辑书箱Box。
但是捐赠方company_id与冠名caption字段书库点管理员没有操作权限。
按照以前的做法需要检测登录的用户,然后针对不同类型用户分别做这些字段的显示和操作逻辑限制。
使用该机制可以解决这个需求。
```
##### 用法
+ 在Model类配置$_auth_node_column的值
```blade
字段说明
字段名
auth_node权限点格式为模块.控制器.方法名,如:'admin.Box.allColumns';多个值需使用数组,如:['admin.Box.allColumns','admin.Box.add','admin.Box.edit']
default默认值
若auth_node存在多个值则需要该用户拥有全部权限才可以操作该字段
```
```php
// 在BoxModel配置需要权限过滤的字段只有拥有该权限点的用户才可以操作字段
protected $_auth_node_column = [
'company_id' => ['auth_node' => 'admin.Box.allColumns'],
'caption' => ['auth_node' => ['admin.Box.allColumns','admin.Box.add','admin.Box.edit'],'default' => 'quansitech']
];
```
+ 使用addFormItem设置表单并配置auth_node属性具体规则参考FormBuilder的addFormItem方法
```php
// 在构建新增或者编辑书箱表单时设置auth_node属性
// auth_node值应与$_auth_node_column对应字段的auth_node值一致
->addFormItem('company_id', 'select', '捐赠方', '', D('Company')->where(['status' => DBCont::NORMAL_STATUS])->getField('id,name'), '', '', ['admin.Box.allColumns'])
->addFormItem('caption', 'text', '冠名', '冠名长度不得超过10个字', '', '', '', ['admin.Box.allColumns','admin.Box.add','admin.Box.edit'])
```
+ 创建auth_node的节点
#### datetime日期时间组件
```blade
日期时间组件
可以通过options自定义格式修改format时需要配置对应的php_format
```
```php
->addFormItem('datetime', 'datetime', '日期时间')
->addFormItem('year', 'datetime', '年', '', ['startView' => 'decade', 'minView' => "decade", 'format' => "yyyy", 'php_format' => "Y"])
->addFormItem('month', 'datetime', '月', '', ['startView' => 'year', 'minView' => "year", 'format' => "yyyy-mm", 'php_format' => "Y-m"])
```
#### addButton
```blade
向表单加入自定义按钮
表单默认有提交按钮(确定)和返回按钮(返回),可以使用此方法加入其它按钮。
此方法的用法和已支持的按钮类型参考listBuilder的addRightButton方法。
```
用法
+ 使用默认类型按钮,如向表单页加入禁用、启用、删除功能
```php
->addButton('forbid')
->addButton('delete');
```
+ 使用自定义类型按钮,可根据业务自定义按钮属性
```php
->addButton('self', ['title' => '查看资料', 'class' => 'btn btn-info qs-form-btn', 'onclick'=>"javascript:window.location.href='".U('admin/User/info', ['id' => '__data_id__'])."';"]);
```