2350 lines
78 KiB
PHP
2350 lines
78 KiB
PHP
<?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 图片大小,单位为kb,0为不限制
|
||
* @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 图片大小,单位为kb,0为不限制
|
||
* @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 默认true,false为关闭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);
|
||
}
|
||
}
|