You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2350 lines
78 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\common\builder\form;
use app\common\builder\ZBuilder;
use think\Exception;
use think\facade\Env;
/**
* 表单构建器
* @package app\common\builder\type
* @author 蔡伟明 <314013107@qq.com>
*/
class Builder extends ZBuilder
{
/**
* @var string 模板路径
*/
private $_template = '';
/**
* @var array 模板变量
*/
private $_vars = [
'page_title' => '', // 页面标题
'page_tips' => '', // 页面提示
'tips_type' => '', // 提示类型
'btn_hide' => [], // 要隐藏的按钮
'btn_title' => [], // 按钮标题
'form_items' => [], // 表单项目
'tab_nav' => [], // 页面Tab导航
'post_url' => '', // 表单提交地址
'form_data' => [], // 表单数据
'extra_html' => '', // 额外HTML代码
'extra_js' => '', // 额外JS代码
'extra_css' => '', // 额外CSS代码
'ajax_submit' => true, // 是否ajax提交
'hide_header' => false, // 是否隐藏表单头部标题
'header_title' => '', // 表单头部标题
'js_list' => [], // 需要引入的js文件名
'css_list' => [], // 需要引入的css文件名
'field_triggers' => [], // 需要触发的表单项名
'field_hide' => '', // 需要隐藏的表单项
'field_values' => '', // 触发表单项的值
'field_clear' => [], // 字段清除
'_js_files' => [], // 需要加载的js合并输出
'_js_init' => [], // 初始化的js合并输出
'_css_files' => [], // 需要加载的css合并输出
'_layout' => [], // 布局参数
'btn_extra' => [], // 额外按钮
'submit_confirm' => false, // 提交确认
'extend_js_list' => [], // 扩展表单项js列表
'extend_css_list' => [], // 扩展表单项css列表
'_method' => 'post',// 表单提交方式
'empty_tips' => '暂无数据',// 没有表单项时的提示信息
'_token_name' => '__token__', // 表单令牌名称
'_token_value' => '', // 表单令牌值
];
/**
* @var bool 是否组合分组
*/
private $_is_group = false;
/**
* 初始化
* @author 蔡伟明 <314013107@qq.com>
*/
public function initialize()
{
$this->_template = Env::get('app_path'). 'common/builder/form/layout.html';
$this->_vars['post_url'] = $this->request->url(true);
$this->_vars['_token_name'] = config('zbuilder.form_token_name');
$this->_vars['_token_value'] = $this->request->token($this->_vars['_token_name']);
}
/**
* 模板变量赋值
* @param mixed $name 要显示的模板变量
* @param string $value 变量的值
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function assign($name, $value = '')
{
if (is_array($name)) {
$this->_vars = array_merge($this->_vars, $name);
} else {
$this->_vars[$name] = $value;
}
return $this;
}
/**
* 设置页面标题
* @param string $title 页面标题
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setPageTitle($title = '')
{
if ($title != '') {
$this->_vars['page_title'] = trim($title);
}
return $this;
}
/**
* 设置表单页提示信息
* @param string $tips 提示信息
* @param string $type 提示类型success,info,danger,warning
* @param string $pos 提示位置top,button
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setPageTips($tips = '', $type = 'info', $pos = 'top')
{
if ($tips != '') {
$this->_vars['page_tips_'.$pos] = $tips;
$this->_vars['tips_type'] = $type != '' ? trim($type) : 'info';
}
return $this;
}
/**
* 设置表单提交地址
* @param string $post_url 提交地址
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setUrl($post_url = '')
{
if ($post_url != '') {
$this->_vars['post_url'] = trim($post_url);
}
return $this;
}
/**
* 隐藏按钮
* @param array|string $btn 要隐藏的按钮,如:['submit'],其中'submit'->确认按钮,'back'->返回按钮
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function hideBtn($btn = [])
{
if (!empty($btn)) {
$this->_vars['btn_hide'] = is_array($btn) ? $btn : explode(',', $btn);
}
return $this;
}
/**
* 添加底部额外按钮
* @param string $btn 按钮内容
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function addBtn($btn = '')
{
if ($btn != '') {
$this->_vars['btn_extra'][] = $btn;
}
return $this;
}
/**
* 设置按钮标题
* @param string|array $btn 按钮名 'submit' -> “提交”,'back' -> “返回”
* @param string $title 按钮标题
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setBtnTitle($btn = '', $title = '')
{
if (!empty($btn)) {
if (is_array($btn)) {
$this->_vars['btn_title'] = $btn;
} else {
$this->_vars['btn_title'][trim($btn)] = trim($title);
}
}
return $this;
}
/**
* 设置提交表单时显示确认框
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function submitConfirm()
{
$this->_vars['submit_confirm'] = true;
return $this;
}
/**
* 隐藏表单头部标题
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function hideHeaderTitle()
{
$this->_vars['hide_header'] = true;
return $this;
}
/**
* 设置表单头部标题
* @param string $title 标题
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setHeaderTitle($title = '')
{
$this->_vars['header_title'] = trim($title);
return $this;
}
/**
* 设置表单令牌
* @param string $name 令牌名称
* @param string $type 令牌生成方法
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setToken($name = '__token__', $type = 'md5')
{
$this->_vars['_token_name'] = $name === '' ? '__token__' : $name;
$this->_vars['_token_value'] = $this->request->token($this->_vars['_token_name'], $type);
return $this;
}
/**
* 设置触发
* @param string $trigger 需要触发的表单项名目前支持select单选类型、text、radio三种
* @param string $values 触发的值
* @param string $show 触发后要显示的表单项名,目前不支持普通联动、范围、拖动排序、静态文本
* @param bool $clear 是否清除值
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setTrigger($trigger = '', $values = '', $show = '', $clear = true)
{
if (!empty($trigger)) {
if (is_array($trigger)) {
foreach ($trigger as $item) {
$this->_vars['field_hide'] .= $item[2].',';
$this->_vars['field_values'] .= $item[1].',';
$this->_vars['field_triggers'][$item[0]][] = [(string)$item[1], $item[2]];
$this->_vars['field_clear'][$item[0]] = isset($item[3]) ? ($item[3] === true ? 1 : 0) : 1;
}
} else {
$this->_vars['field_hide'] .= $show.',';
$this->_vars['field_values'] .= (string)$values.',';
$this->_vars['field_triggers'][$trigger][] = [(string)$values, $show];
$this->_vars['field_clear'][$trigger] = $clear === true ? 1 : 0;
}
}
return $this;
}
/**
* 添加触发
* @param array $triggers 触发数组
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function addTrigger($triggers = [])
{
if (!empty($triggers)) {
$this->setTrigger($triggers);
}
return $this;
}
/**
* 添加数组类型的表单项基本和Textarea是一样的但读取的时候会用parse_attr函数转换
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author caiweiming <314013107@qq.com>
* @return Builder
*/
public function addArray($name = '', $title = '', $tips = '', $default = '', $extra_attr = '', $extra_class = '') {
return $this->addTextarea($name, $title, $tips, $default, $extra_attr, $extra_class);
}
/**
* 添加单个档案文件
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addArchive($name = '', $title = '', $tips = '', $extra_class = '')
{
$item = [
'type' => 'archive',
'name' => $name,
'title' => $title,
'tips' => $tips,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加多个档案文件
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addArchives($name = '', $title = '', $tips = '', $extra_class = '')
{
$item = [
'type' => 'archives',
'name' => $name,
'title' => $title,
'tips' => $tips,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加百度地图
* @param string $name 表单项名
* @param string $title 标题
* @param string $ak 百度APPKEY
* @param string $tips 提示
* @param string $default 默认坐标
* @param string $address 默认地址
* @param string $level 地图显示级别
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addBmap($name = '', $title = '', $ak = '', $tips = '', $default = '', $address = '', $level = '', $extra_class = '')
{
$item = [
'type' => 'bmap',
'name' => $name,
'title' => $title,
'ak' => $ak,
'tips' => $tips,
'value' => $default,
'address' => $address,
'level' => $level == '' ? 12 : $level,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加按钮
* @param string $name 表单项名也是按钮id
* @param array $attr 按钮属性
* @param string $ele_type 按钮类型默认为button也可以为a标签
* @author 蔡伟明 <314013107@qq.com>
* @return $this|array
*/
public function addButton($name = '', $attr = [], $ele_type = 'button')
{
$item = [
'type' => 'button',
'name' => $name,
'id' => $name,
'ele_type' => $ele_type,
'data' => '',
];
if ($attr) {
foreach ($attr as $key => $value) {
if (substr($key, 0, 5) == 'data-') {
$item['data'] .= $key. '=' . $value . ' ';
}
}
$item = array_merge($item, $attr);
}
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加复选框
* @param string $name 复选框名
* @param string $title 复选框标题
* @param string $tips 提示
* @param array $options 复选框数据
* @param string $default 默认值
* @param array $attr 属性,
* color-颜色(default/primary/info/success/warning/danger)默认primary
* size-尺寸(sm,nm,lg)默认sm
* shape-形状(rounded,square)默认rounded
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addCheckbox($name = '', $title = '', $tips = '', $options = [], $default = '', $attr = [], $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'checkbox',
'name' => $name,
'title' => $title,
'tips' => $tips,
'options' => $options == '' ? [] : $options,
'value' => $default,
'attr' => $attr,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'extra_label_class' => $extra_attr == 'disabled' ? 'css-input-disabled' : '',
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加CKEditor编辑器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $width 编辑器宽度默认100%
* @param integer $height 编辑器高度默认400px
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addCkeditor($name = '', $title = '', $tips = '', $default = '', $width = '100%', $height = 400, $extra_class = '')
{
$item = [
'type' => 'ckeditor',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'width' => $width,
'height' => $height,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加取色器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $mode 模式默认为rgba(含透明度)也可以是rgb
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addColorpicker($name = '', $title = '', $tips = '', $default = '', $mode = 'rgba', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'colorpicker',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'mode' => $mode,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加日期
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $format 日期格式
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addDate($name = '', $title = '', $tips = '', $default = '', $format = '', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'date',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'format' => $format == '' ? 'yyyy-mm-dd' : $format,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加日期范围
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $format 格式
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addDaterange($name = '', $title = '', $tips = '', $default = '', $format = '', $extra_attr = '', $extra_class = '')
{
if (strpos($name, ',')) {
list($name_from, $name_to) = explode(',', $name);
$id_from = $name_from;
$id_to = $name_to;
$id = $name_from;
} else {
$name_from = $name_to = $name . '[]';
$id_from = $name . '_from';
$id_to = $name . '_to';
$id = $name;
}
if (strpos($default, ',') !== false) {
list($value_from, $value_to) = explode(',', $default);
} else {
$value_from = $default;
$value_to = '';
}
$item = [
'type' => 'daterange',
'id' => $id,
'name_from' => $name_from,
'name_to' => $name_to,
'id_from' => $id_from,
'id_to' => $id_to,
'title' => $title,
'tips' => $tips,
'value_from' => $value_from,
'value_to' => $value_to,
'format' => $format == '' ? 'yyyy-mm-dd' : $format,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加日期时间
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $format 日期时间格式
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addDatetime($name = '', $title = '', $tips = '', $default = '', $format = '', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'datetime',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'format' => $format == '' ? 'YYYY-MM-DD HH:mm' : $format,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加markdown编辑器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param bool $watch 是否实时预览
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addEditormd($name = '', $title = '', $tips = '', $default = '', $watch = true, $extra_class = '')
{
$item = [
'type' => 'editormd',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'watch' => $watch,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加单文件上传
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $size 文件大小单位为kb
* @param string $ext 文件后缀
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addFile($name = '', $title = '', $tips = '', $default = '', $size = '', $ext = '', $extra_class = '')
{
$size = ($size != '' ? $size : config('upload_file_size')) * 1024;
$ext = $ext != '' ? $ext : config('upload_file_ext');
$item = [
'type' => 'file',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'size' => $size,
'ext' => $ext,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加多文件上传
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $size 图片大小单位为kb
* @param string $ext 文件后缀
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addFiles($name = '', $title = '', $tips = '', $default = '', $size = '', $ext = '', $extra_class = '')
{
$size = ($size != '' ? $size : config('upload_file_size')) * 1024;
$ext = $ext != '' ? $ext : config('upload_file_ext');
$item = [
'type' => 'files',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'size' => $size,
'ext' => $ext,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加图片相册
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addGallery($name = '', $title = '', $tips = '', $default = '', $extra_class = '')
{
$item = [
'type' => 'gallery',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加分组
* @param array $groups 分组数据
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addGroup($groups = [])
{
if (is_array($groups) && !empty($groups)) {
$this->_is_group = true;
foreach ($groups as &$group) {
foreach ($group as $key => $item) {
$type = array_shift($item);
if (strpos($type, ':')) {
list($type, $layout) = explode(':', $type);
$layout = explode('|', $layout);
$this->_vars['_layout'][$item[0]] = [
'xs' => $layout[0],
'sm' => isset($layout[1]) ? ($layout[1] == '' ? $layout[0] : $layout[1]) : $layout[0],
'md' => isset($layout[2]) ? ($layout[2] == '' ? $layout[0] : $layout[2]) : $layout[0],
'lg' => isset($layout[3]) ? ($layout[3] == '' ? $layout[0] : $layout[3]) : $layout[0],
];
}
$group[$key] = call_user_func_array([$this, 'add'.ucfirst($type)], $item);
}
}
$this->_is_group = false;
}
$item = [
'type' => 'group',
'options' => $groups
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加隐藏表单项
* @param string $name 表单项名
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addHidden($name = '', $default = '', $extra_class = '')
{
$item = [
'type' => 'hidden',
'name' => $name,
'value' => $default,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加图标选择器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addIcon($name = '', $title = '', $tips = '', $default = '', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'icon',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加单图片上传
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $size 图片大小单位为kb0为不限制
* @param string $ext 文件后缀
* @param string $extra_class 额外css类名
* @param array|string $thumb 缩略图参数
* @param array|string $watermark 水印参数
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addImage($name = '', $title = '', $tips = '', $default = '', $size = '', $ext = '', $extra_class = '', $thumb = '', $watermark = '')
{
$size = ($size != '' ? $size : config('upload_image_size')) * 1024;
$ext = $ext != '' ? $ext : config('upload_image_ext');
$item = [
'type' => 'image',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'size' => $size,
'ext' => $ext,
'extra_class' => $extra_class,
];
// 处理缩略图参数
if (isset($thumb['size'])) {
$item['thumb'] = $thumb['size'].'|'.(isset($thumb['type']) ? $thumb['type'] : 1);
} else {
$item['thumb'] = $thumb;
}
// 处理水印参数
if (isset($watermark['img'])) {
$item['watermark'] = $watermark['img'].'|'.(isset($watermark['pos']) ? $watermark['pos'] : 9).'|'.(isset($watermark['alpha']) ? $watermark['alpha'] : 50);
} else {
$item['watermark'] = $watermark;
}
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加多图片上传
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $size 图片大小单位为kb0为不限制
* @param string $ext 文件后缀
* @param string $extra_class 额外css类名
* @param array|string $thumb 缩略图参数
* @param array|string $watermark 水印参数
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addImages($name = '', $title = '', $tips = '', $default = '', $size = '', $ext = '', $extra_class = '', $thumb = '', $watermark = '')
{
$size = ($size != '' ? $size : config('upload_image_size')) * 1024;
$ext = $ext != '' ? $ext : config('upload_image_ext');
$item = [
'type' => 'images',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'size' => $size,
'ext' => $ext,
'extra_class' => $extra_class,
];
// 处理缩略图参数
if (isset($thumb['size'])) {
$item['thumb'] = $thumb['size'].'|'.(isset($thumb['type']) ? $thumb['type'] : 1);
} else {
$item['thumb'] = $thumb;
}
// 处理水印参数
if (isset($watermark['img'])) {
$item['watermark'] = $watermark['img'].'|'.(isset($watermark['pos']) ? $watermark['pos'] : 9).'|'.(isset($watermark['alpha']) ? $watermark['alpha'] : 50);
} else {
$item['watermark'] = $watermark;
}
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 图片裁剪
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param array $options 参数
* @param string $extra_class 额外css类名
* @param array|string $thumb 缩略图参数
* @param array|string $watermark 水印参数
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addJcrop($name = '', $title = '', $tips = '', $default = '', $options = [], $extra_class = '', $thumb = '', $watermark = '')
{
$item = [
'type' => 'jcrop',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'options' => json_encode($options),
'extra_class' => $extra_class,
];
// 处理缩略图参数
if (isset($thumb['size'])) {
$item['thumb'] = $thumb['size'].'|'.(isset($thumb['type']) ? $thumb['type'] : 1);
} else {
$item['thumb'] = $thumb;
}
// 处理水印参数
if (isset($watermark['img'])) {
$item['watermark'] = $watermark['img'].'|'.(isset($watermark['pos']) ? $watermark['pos'] : 9).'|'.(isset($watermark['alpha']) ? $watermark['alpha'] : 50);
} else {
$item['watermark'] = $watermark;
}
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加普通联动表单项
* @param string $name 表单项名
* @param string $title 表单项标题
* @param string $tips 表单项提示说明
* @param array $options 表单项options
* @param string $default 默认值
* @param string $ajax_url 数据异步请求地址
* 可以用Url方法生成返回数据格式必须如下
* $arr['code'] = '1'; //判断状态
* $arr['msg'] = '请求成功'; //回传信息
* $arr['list'] = [
* ['key' => 'gz', 'value' => '广州'],
* ['key' => 'sz', 'value' => '深圳'],
* ]; //数据
* return json($arr);
* status用于判断是否请求成功list将作为$next_items第一个表单名的下拉框的内容
* @param string $next_items 下一级下拉框的表单名
* 如果有多个关联关系,必须一同写上,用逗号隔开,
* 比如学院作为联动的一个下拉框,它的下级是专业,那么这里就写上专业下拉框的表单名,如:'zy'
* 如果还有班级,那么切换学院的时候,专业和班级应该是一同关联的
* 所以就必须写上专业和班级的下拉框表单名,如:'zy,bj'
* @param string $param 指定请求参数的key名称默认为$name的值
* 比如$param为“key”
* 那么请求数据的时候会发送参数key=某个下拉框选项值
* @param string $extra_param 额外参数名,可以同时发送表单中的其他表单项值
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addLinkage($name = '', $title = '', $tips = '', $options = [], $default = '', $ajax_url = '', $next_items = '', $param = '', $extra_param = '')
{
$item = [
'type' => 'linkage',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'options' => $options,
'ajax_url' => $ajax_url,
'next_items' => $next_items,
'param' => $param == '' ? $name : $param,
'extra_param' => $extra_param,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 创建快速多级联动Token
* @param string $table 表名
* @param string $option
* @param string $key
* @author 蔡伟明 <314013107@qq.com>
* @return bool|string
*/
private function createLinkagesToken($table = '', $option = '', $key = '')
{
$table_token = substr(sha1($table.'-'.$option.'-'.$key.'-'.session('user_auth.last_login_ip').'-'.UID.'-'.session('user_auth.last_login_time')), 0, 8);
session($table_token, ['table' => $table, 'option' => $option, 'key' => $key]);
return $table_token;
}
/**
* 添加快速多级联动
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $table 表名
* @param int $level 级别
* @param string $default 默认值
* @param array|string $fields 字段名默认为id,name,pid
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addLinkages($name = '', $title = '', $tips = '', $table = '', $level = 2, $default = '', $fields = [])
{
if ($level > 4) {
halt('目前最多只支持4级联动');
}
// 键字段名也就是下拉菜单的option元素的value值
$key = 'id';
// 值字段名,也就是下拉菜单显示的各项
$option = 'name';
// 父级id字段名
$pid = 'pid';
if (!empty($fields)) {
if (!is_array($fields)) {
$fields = explode(',', $fields);
$key = isset($fields[0]) ? $fields[0] : $key;
$option = isset($fields[1]) ? $fields[1] : $option;
$pid = isset($fields[2]) ? $fields[2] : $pid;
} else {
$key = isset($fields['id']) ? $fields['id'] : $key;
$option = isset($fields['name']) ? $fields['name'] : $option;
$pid = isset($fields['pid']) ? $fields['pid'] : $pid;
}
}
$linkages_token = $this->createLinkagesToken($table, $option, $key);
$item = [
'type' => 'linkages',
'name' => $name,
'title' => $title,
'tips' => $tips,
'table' => $table,
'level' => $level,
'key' => $key,
'option' => $option,
'pid' => $pid,
'value' => $default,
'token' => $linkages_token,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加格式文本
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $format 格式
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addMasked($name = '', $title = '', $tips = '', $format = '', $default = '', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'masked',
'name' => $name,
'title' => $title,
'tips' => $tips,
'format' => $format,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加数字输入框
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $min 最小值
* @param string $max 最大值
* @param string $step 步进值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addNumber($name = '', $title = '', $tips = '', $default = '', $min = '', $max = '', $step = '', $extra_attr = '', $extra_class = '')
{
if (preg_match('/(.*)\[:(.*)\]/', $title, $matches)) {
$title = $matches[1];
$placeholder = $matches[2];
}
$item = [
'type' => 'number',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default == '' ? 0 : $default,
'min' => $min,
'max' => $max,
'step' => $step,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'placeholder' => isset($placeholder) ? $placeholder : '请输入'.$title,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加密码框
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addPassword($name = '', $title = '', $tips = '', $default = '', $extra_attr = '', $extra_class = '')
{
if (preg_match('/(.*)\[:(.*)\]/', $title, $matches)) {
$title = $matches[1];
$placeholder = $matches[2];
}
$item = [
'type' => 'password',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'placeholder' => isset($placeholder) ? $placeholder : '请输入'.$title,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加单选
* @param string $name 单选名
* @param string $title 单选标题
* @param string $tips 提示
* @param array $options 单选数据
* @param string $default 默认值
* @param array $attr 属性,
* color-颜色(default/primary/info/success/warning/danger)默认primary
* size-尺寸(sm,nm,lg)默认sm
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addRadio($name = '', $title = '', $tips = '', $options = [], $default = '', $attr = [], $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'radio',
'name' => $name,
'title' => $title,
'tips' => $tips,
'options' => $options == '' ? [] : $options,
'value' => $default,
'attr' => $attr,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'extra_label_class' => $extra_attr == 'disabled' ? 'css-input-disabled' : '',
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加范围
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param array $options 参数
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addRange($name = '', $title = '', $tips = '', $default = '', $options = [], $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'range',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
$item = array_merge($item, $options);
if (isset($item['double']) && $item['double'] == 'true') {
$item['double'] = 'double';
}
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加普通下拉菜单
* @param string $name 下拉菜单名
* @param string $title 标题
* @param string $tips 提示
* @param array $options 选项
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addSelect($name = '', $title = '', $tips = '', $options = [], $default = '', $extra_attr = '', $extra_class = '')
{
$type = 'select';
if ($extra_attr != '') {
if (in_array('multiple', explode(' ', $extra_attr))) {
$type = 'select2';
}
}
$placeholder = $type == 'select' ? '请选择一项' : '请选择一项或多项';
if (preg_match('/(.*)\[:(.*)\]/', $title, $matches)) {
$title = $matches[1];
$placeholder = $matches[2];
}
$item = [
'type' => $type,
'name' => $name,
'title' => $title,
'tips' => $tips,
'options' => $options,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'placeholder' => $placeholder,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加拖拽排序
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param array $value 值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addSort($name = '', $title = '', $tips = '', $value = [], $extra_class = '')
{
$content = [];
if (!empty($value)) {
$content = $value;
}
$item = [
'type' => 'sort',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => implode(',', array_keys($value)),
'content' => $content,
'extra_class' => $extra_class
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加静态文本
* @param string $name 静态表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $hidden 需要提交的值
* @param string $extra_class 额外css类
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addStatic($name = '', $title = '', $tips = '', $default = '', $hidden = '', $extra_class = '')
{
$item = [
'type' => 'static',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'hidden' => $hidden === true ? ($default == '' ? true : $default) : $hidden,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加Summernote编辑器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $width 编辑器宽度
* @param int $height 编辑器高度
* @param string $extra_class
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addSummernote($name = '', $title = '', $tips = '', $default = '', $width = '100%', $height = 350, $extra_class = '')
{
$item = [
'type' => 'summernote',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'width' => $width,
'height' => $height,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加开关
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param array $attr 属性,
* color-颜色(default/primary/info/success/warning/danger)默认primary
* size-尺寸(sm,nm,lg)默认sm
* shape-形状(rounded,square)默认rounded
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addSwitch($name = '', $title = '', $tips = '', $default = '', $attr = [], $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'switch',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'attr' => $attr,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'extra_label_class' => $extra_attr == 'disabled' ? 'css-input-disabled' : '',
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加标签
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addTags($name = '', $title = '', $tips = '', $default = '', $extra_class = '')
{
$item = [
'type' => 'tags',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => is_array($default) ? implode(',', $default) : $default,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加单行文本框
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param array $group 标签组,可以在文本框前后添加按钮或者文字
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addText($name = '', $title = '', $tips = '', $default = '', $group = [], $extra_attr = '', $extra_class = '')
{
if (preg_match('/(.*)\[:(.*)\]/', $title, $matches)) {
$title = $matches[1];
$placeholder = $matches[2];
}
$item = [
'type' => 'text',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'group' => $group,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'placeholder' => isset($placeholder) ? $placeholder : '请输入'.$title,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加多行文本框
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addTextarea($name = '', $title = '', $tips = '', $default = '', $extra_attr = '', $extra_class = '')
{
if (preg_match('/(.*)\[:(.*)\]/', $title, $matches)) {
$title = $matches[1];
$placeholder = $matches[2];
}
$item = [
'type' => 'textarea',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
'placeholder' => isset($placeholder) ? $placeholder : '请输入'.$title,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加时间
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $format 日期时间格式
* @param string $extra_attr 额外属性
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addTime($name = '', $title = '', $tips = '', $default = '', $format = '', $extra_attr = '', $extra_class = '')
{
$item = [
'type' => 'time',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'format' => $format == '' ? 'HH:mm:ss' : $format,
'extra_class' => $extra_class,
'extra_attr' => $extra_attr,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加百度编辑器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addUeditor($name = '', $title = '', $tips = '', $default = '', $extra_class = '')
{
$item = [
'type' => 'ueditor',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加wang编辑器
* @param string $name 表单项名
* @param string $title 标题
* @param string $tips 提示
* @param string $default 默认值
* @param string $extra_class 额外css类名
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function addWangeditor($name = '', $title = '', $tips = '', $default = '', $extra_class = '')
{
$item = [
'type' => 'wangeditor',
'name' => $name,
'title' => $title,
'tips' => $tips,
'value' => $default,
'extra_class' => $extra_class,
];
if ($this->_is_group) {
return $item;
}
$this->_vars['form_items'][] = $item;
return $this;
}
/**
* 添加表单项
* 这个是addCheckbox等方法的别名方法第一个参数传表单项类型其余参数与各自方法中的参数一致
* @param string $type 表单项类型
* @param string $name 表单项名
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function addFormItem($type = '', $name = '')
{
if ($type != '') {
// 获取所有参数值
$args = func_get_args();
array_shift($args);
// 判断是否有布局参数
if (strpos($type, ':')) {
list($type, $layout) = explode(':', $type);
$layout = explode('|', $layout);
$this->_vars['_layout'][$name] = [
'xs' => $layout[0],
'sm' => isset($layout[1]) ? ($layout[1] == '' ? $layout[0] : $layout[1]) : $layout[0],
'md' => isset($layout[2]) ? ($layout[2] == '' ? $layout[0] : $layout[2]) : $layout[0],
'lg' => isset($layout[3]) ? ($layout[3] == '' ? $layout[0] : $layout[3]) : $layout[0],
];
}
$method = 'add'. ucfirst($type);
call_user_func_array([$this, $method], $args);
}
return $this;
}
/**
* 一次性添加多个表单项
* @param array $items 表单项
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function addFormItems($items = [])
{
if (!empty($items)) {
foreach ($items as $item) {
call_user_func_array([$this, 'addFormItem'], $item);
}
}
return $this;
}
/**
* 直接设置表单项数据
* @param array $items 表单项数据
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setFormItems($items = [])
{
if (!empty($items)) {
foreach ($items as $key => $item) {
switch ($item['type']) {
case 'group':
foreach ($item['options'] as $options) {
foreach ($options as $option) {
$this->loadMinify($option['type']);
}
}
break;
case 'select':
if (isset($item['extra_attr']) && $item['extra_attr'] == 'multiple') {
$items[$key]['type'] = 'select2';
}
break;
}
if ($item['type'] == 'group') {
} else {
$this->loadMinify($item['type']);
}
// 设置布局参数
if (isset($item['layout'])) {
$this->_vars['_layout'][$item['name']] = [
'xs' => $item['layout'],
'sm' => $item['layout'],
'md' => $item['layout'],
'lg' => $item['layout'],
];
}
}
// 额外已经构造好的表单项目与单个组装的的表单项目进行合并
$this->_vars['form_items'] = array_merge($this->_vars['form_items'], $items);
}
return $this;
}
/**
* 扩展额外表单项
* @param $methodName
* @param $argument
* @author 蔡伟明 <314013107@qq.com>
* @return $this
* @throws Exception
*/
public function __call($methodName, $argument)
{
$type = strtolower(substr($methodName, 3));
if ($type != '') {
$class_name = 'form\\'.$type.'\\Builder';
if (!class_exists($class_name)) {
throw new Exception('类:'.$class_name.'不存在', 7001);
}
if (method_exists($class_name, 'item')) {
$class = new $class_name;
$form_item = call_user_func_array([$class, 'item'], $argument);
$form_item['type'] = $type;
if (!empty($class->js)) {
$this->_vars['extend_js_list'][$type] = $this->parseUrl($class->js, $type);
}
if (!empty($class->css)) {
$this->_vars['extend_css_list'][$type] = $this->parseUrl($class->css, $type);
}
if ($this->_is_group) {
return $form_item;
}
$this->_vars['form_items'][] = $form_item;
} else {
throw new Exception('扩展表单项未定义item()方法', 7001);
}
}
return $this;
}
/**
* 解析扩展表单项资源url
* @param array $urls 资源url
* @param string $type 表单项类型名称
* @author 蔡伟明 <314013107@qq.com>
* @return array
*/
private function parseUrl($urls = [], $type = '')
{
foreach ($urls as $key => $item) {
if (!preg_match('/__.*?__/', $item)) {
$urls[$key] = '__EXTEND_FORM__/'.$type.'/'.$item;
}
$urls[$key] = str_replace(array_keys(config('template.tpl_replace_string')), array_values(config('template.tpl_replace_string')), $urls[$key]);
}
return $urls;
}
/**
* 设置Tab按钮列表
* @param array $tab_list Tab列表 如:['tab1' => ['title' => '标题', 'url' => 'http://www.dolphinphp.com']]
* @param string $curr_tab 当前tab名
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setTabNav($tab_list = [], $curr_tab = '')
{
if (!empty($tab_list)) {
$this->_vars['tab_nav'] = [
'tab_list' => $tab_list,
'curr_tab' => $curr_tab,
];
}
return $this;
}
/**
* 设置表单数据
* @param array $form_data 表单数据
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setFormData($form_data = [])
{
if (!empty($form_data)) {
$this->_vars['form_data'] = $form_data;
}
return $this;
}
/**
* 设置额外HTML代码
* @param string $extra_html 额外HTML代码
* @param string $tag 标记
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setExtraHtml($extra_html = '', $tag = '')
{
if ($extra_html != '') {
$tag != '' && $tag = '_'.$tag;
$this->_vars['extra_html'.$tag] = $extra_html;
}
return $this;
}
/**
* 设置额外JS代码
* @param string $extra_js 额外JS代码
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setExtraJs($extra_js = '')
{
if ($extra_js != '') {
$this->_vars['extra_js'] = $extra_js;
}
return $this;
}
/**
* 设置额外CSS代码
* @param string $extra_css 额外CSS代码
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setExtraCss($extra_css = '')
{
if ($extra_css != '') {
$this->_vars['extra_css'] = $extra_css;
}
return $this;
}
/**
* 表单项布局
* @param array $column 布局参数 ['表单项名' => 所占宽度,....]
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function layout($column = [])
{
if (!empty($column)) {
foreach ($column as $field => $layout) {
$layout = explode('|', $layout);
$this->_vars['_layout'][$field] = [
'xs' => $layout[0],
'sm' => isset($layout[1]) ? ($layout[1] == '' ? $layout[0] : $layout[1]) : $layout[0],
'md' => isset($layout[2]) ? ($layout[2] == '' ? $layout[0] : $layout[2]) : $layout[0],
'lg' => isset($layout[3]) ? ($layout[3] == '' ? $layout[0] : $layout[3]) : $layout[0],
];
}
}
return $this;
}
/**
* 引入模块js文件
* @param string $files_name js文件名多个文件用逗号隔开
* @param string $module 指定模块
* @author caiweiming <314013107@qq.com>
* @return $this
*/
public function js($files_name = '', $module = '')
{
if ($files_name != '') {
$this->loadFile('js', $files_name, $module);
}
return $this;
}
/**
* 引入模块css文件
* @param string $files_name css文件名多个文件用逗号隔开
* @param string $module 指定模块
* @author caiweiming <314013107@qq.com>
* @return $this
*/
public function css($files_name = '', $module = '')
{
if ($files_name != '') {
$this->loadFile('css', $files_name, $module);
}
return $this;
}
/**
* 设置表单提交方式
* @param string $value 提交方式
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function method($value = '')
{
if ($value != '') {
$this->_vars['_method'] = $value;
$this->_vars['ajax_submit'] = strtolower($value) == 'get' ? false : true;
}
return $this;
}
/**
* 引入css或js文件
* @param string $type 类型css/js
* @param string $files_name 文件名,多个用逗号隔开
* @param string $module 指定模块
* @author caiweiming <314013107@qq.com>
*/
private function loadFile($type = '', $files_name = '', $module = '')
{
if ($files_name != '') {
$module = $module == '' ? $this->request->module() : $module;
if (!is_array($files_name)) {
$files_name = explode(',', $files_name);
}
foreach ($files_name as $item) {
if (strpos($item, '/')) {
$this->_vars[$type.'_list'][] = PUBLIC_PATH. 'static/'. $item.'.'.$type;
} else {
$this->_vars[$type.'_list'][] = PUBLIC_PATH. 'static/'. $module .'/'.$type.'/'.$item.'.'.$type;
}
}
}
}
/**
* 设置ajax方式提交
* @param bool $ajax_submit 默认truefalse为关闭ajax方式提交
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function isAjax($ajax_submit = true)
{
$this->_vars['ajax_submit'] = $ajax_submit;
return $this;
}
/**
* 设置模版路径
* @param string $template 模板路径
* @author 蔡伟明 <314013107@qq.com>
* @return $this
*/
public function setTemplate($template = '')
{
if ($template != '') {
$this->_template = $template;
}
return $this;
}
/**
* 根据表单项类型加载不同js和css文件并合并
* @param string $type 表单项类型
* @author 蔡伟明 <314013107@qq.com>
*/
private function loadMinify($type = '')
{
if ($type != '') {
switch ($type) {
case 'colorpicker':
$this->_vars['_js_files'][] = 'colorpicker_js';
$this->_vars['_css_files'][] = 'colorpicker_css';
$this->_vars['_js_init'][] = 'colorpicker';
break;
case 'ckeditor':
$this->_vars['_ckeditor'] = '1';
$this->_vars['_js_init'][] = 'ckeditor';
break;
case 'date':
case 'daterange':
$this->_vars['_js_files'][] = 'datepicker_js';
$this->_vars['_css_files'][] = 'datepicker_css';
$this->_vars['_js_init'][] = 'datepicker';
break;
case 'datetime':
case 'time':
$this->_vars['_js_files'][] = 'datetimepicker_js';
$this->_vars['_css_files'][] = 'datetimepicker_css';
$this->_vars['_js_init'][] = 'datetimepicker';
break;
case 'editormd':
$this->_vars['_js_files'][] = 'editormd_js';
$this->_vars['_editormd'] = '1';
break;
case 'images':
$this->_vars['_js_files'][] = 'jqueryui_js';
case 'file':
case 'files':
case 'image':
$this->_vars['_js_files'][] = 'webuploader_js';
$this->_vars['_css_files'][] = 'webuploader_css';
break;
case 'icon':
$this->_vars['_icon'] = '1';
break;
case 'jcrop':
$this->_vars['_js_files'][] = 'jcrop_js';
$this->_vars['_css_files'][] = 'jcrop_css';
break;
case 'linkage':
case 'linkages':
case 'select':
case 'select2':
$this->_vars['_js_files'][] = 'select2_js';
$this->_vars['_css_files'][] = 'select2_css';
$this->_vars['_js_init'][] = 'select2';
break;
case 'masked':
$this->_vars['_js_files'][] = 'masked_inputs_js';
break;
case 'range':
$this->_vars['_js_files'][] = 'rangeslider_js';
$this->_vars['_css_files'][] = 'rangeslider_css';
$this->_vars['_js_init'][] = 'rangeslider';
break;
case 'sort':
$this->_vars['_js_files'][] = 'nestable_js';
$this->_vars['_css_files'][] = 'nestable_css';
break;
case 'tags':
$this->_vars['_js_files'][] = 'tags_js';
$this->_vars['_css_files'][] = 'tags_css';
$this->_vars['_js_init'][] = 'tags-inputs';
break;
case 'ueditor':
$this->_vars['_ueditor'] = '1';
break;
case 'wangeditor':
$this->_vars['_js_files'][] = 'wangeditor_js';
$this->_vars['_css_files'][] = 'wangeditor_css';
break;
case 'summernote':
$this->_vars['_js_files'][] = 'summernote_js';
$this->_vars['_css_files'][] = 'summernote_css';
$this->_vars['_js_init'][] = 'summernote';
break;
}
} else {
if ($this->_vars['form_items']) {
foreach ($this->_vars['form_items'] as &$item) {
// 判断是否为分组
if ($item['type'] == 'group') {
foreach ($item['options'] as &$group) {
foreach ($group as $key => $value) {
if ($group[$key]['type'] != '') {
$this->loadMinify($group[$key]['type']);
}
}
}
} else {
if ($item['type'] != '') {
$this->loadMinify($item['type']);
}
}
}
}
}
}
/**
* 设置表单项的值
* @author 蔡伟明 <314013107@qq.com>
*/
private function setFormValue()
{
if ($this->_vars['form_data']) {
foreach ($this->_vars['form_items'] as &$item) {
// 判断是否为分组
if ($item['type'] == 'group') {
foreach ($item['options'] as &$group) {
foreach ($group as $key => $value) {
// 针对日期范围特殊处理
switch ($value['type']) {
case 'daterange':
if ($value['name_from'] == $value['name_to']) {
list($group[$key]['value_from'], $group[$key]['value_to']) = $this->_vars['form_data'][$value['id']];
} else {
$group[$key]['value_from'] = $this->_vars['form_data'][$value['name_from']];
$group[$key]['value_to'] = $this->_vars['form_data'][$value['name_to']];
}
break;
case 'datetime':
case 'date':
case 'time':
if (isset($this->_vars['form_data'][$value['name']])) {
$group[$key]['value'] = $this->_vars['form_data'][$value['name']];
} else {
$group[$key]['value'] = isset($value['value']) ? $value['value'] : '';
}
if (is_numeric($group[$key]['value'])) {
if ($value['type'] == 'datetime' || $value['type'] == 'time') {
$group[$key]['value'] = format_moment($group[$key]['value'], $value['format']);
} else {
$group[$key]['value'] = format_date($group[$key]['value'], $value['format']);
}
}
break;
case 'bmap':
$group[$key]['address'] = $this->_vars['form_data'][$value['name'].'_address'];
default:
if (isset($this->_vars['form_data'][$value['name']])) {
$group[$key]['value'] = $this->_vars['form_data'][$value['name']];
} else {
$group[$key]['value'] = '';
}
}
if ($group[$key]['type'] == 'static' && $group[$key]['hidden'] != '') {
$group[$key]['hidden'] = $this->_vars['form_data'][$value['name']];
}
}
}
} else {
// 针对日期范围特殊处理
switch ($item['type']) {
case 'daterange':
if ($item['name_from'] == $item['name_to']) {
list($item['value_from'], $item['value_to']) = $this->_vars['form_data'][$item['id']];
} else {
$item['value_from'] = $this->_vars['form_data'][$item['name_from']];
$item['value_to'] = $this->_vars['form_data'][$item['name_to']];
}
break;
case 'datetime':
case 'date':
case 'time':
if (isset($this->_vars['form_data'][$item['name']])) {
$item['value'] = $this->_vars['form_data'][$item['name']];
} else {
$item['value'] = isset($item['value']) ? $item['value'] : '';
}
if (is_numeric($item['value'])) {
if ($item['type'] == 'datetime' || $item['type'] == 'time') {
$item['value'] = format_moment($item['value'], $item['format']);
} else {
$item['value'] = format_date($item['value'], $item['format']);
}
}
break;
case 'bmap':
$item['address'] = $this->_vars['form_data'][$item['name'].'_address'];
default:
if (isset($this->_vars['form_data'][$item['name']])) {
$item['value'] = $this->_vars['form_data'][$item['name']];
} else {
$item['value'] = isset($item['value']) ? $item['value'] : '';
}
}
if ($item['type'] == 'static' && $item['hidden'] != '') {
$item['hidden'] = $this->_vars['form_data'][$item['name']];
}
// 处理拖拽排序组件
if ($item['type'] == 'sort') {
$value = explode(',', $item['value']);
$item['content'] = array_merge(array_flip($value), $item['content']);
}
}
}
}
}
/**
* 加载模板输出
* @param string $template 模板文件名
* @param array $vars 模板输出变量
* @param array $config 模板参数
* @author 蔡伟明 <314013107@qq.com>
* @return mixed
*/
public function fetch($template = '', $vars = [], $config = [])
{
if (!empty($vars)) {
$this->_vars['form_data'] = array_merge($this->_vars['form_data'], $vars);
}
// 设置表单值
$this->setFormValue();
// 处理不同表单类型加载不同js和css
$this->loadMinify();
// 处理页面标题
if ($this->_vars['page_title'] == '' && defined('ENTRANCE') && ENTRANCE == 'admin') {
$location = get_location('', false, false);
if ($location) {
$curr_location = end($location);
$this->_vars['page_title'] = $curr_location['title'];
}
}
// 另外设置模板
if ($template != '') {
$this->_template = $template;
}
// 处理需要隐藏的表单项,去除最后一个逗号
if ($this->_vars['field_hide'] != '') {
$this->_vars['field_hide'] = rtrim($this->_vars['field_hide'], ',');
}
if ($this->_vars['field_values'] != '') {
$this->_vars['field_values'] = explode(',', $this->_vars['field_values']);
$this->_vars['field_values'] = array_filter($this->_vars['field_values'], 'strlen');
$this->_vars['field_values'] = implode(',', array_unique($this->_vars['field_values']));
}
// 处理js和css合并的参数
if (!empty($this->_vars['_js_files'])) {
$this->_vars['_js_files'] = array_unique($this->_vars['_js_files']);
sort($this->_vars['_js_files']);
}
if (!empty($this->_vars['_css_files'])) {
$this->_vars['_css_files'] = array_unique($this->_vars['_css_files']);
sort($this->_vars['_css_files']);
}
if (!empty($this->_vars['_js_init'])) {
$this->_vars['_js_init'] = array_unique($this->_vars['_js_init']);
sort($this->_vars['_js_init']);
$this->_vars['_js_init'] = json_encode($this->_vars['_js_init']);
}
// 处理额外按钮
$this->_vars['btn_extra'] = implode(' ', $this->_vars['btn_extra']);
// 实例化视图并渲染
return parent::fetch($this->_template, $this->_vars, $config);
}
}