// +---------------------------------------------------------------------- namespace crmeb\utils; use FormBuilder\Factory\Elm as Form; /** * Form Builder * Class FormBuilder * @package crmeb\utils */ class FormBuilder extends Form { public static function setOptions($call){ if (is_array($call)) { return $call; }else{ return $call(); } } /** * 单文件上传(form-create 自定义组件) * * 前端 main.js 已注册 type=FileUpload 的自定义组件:空态为上传图标卡片, * 已上传时图片类文件(含 ico)显示缩略图、其它文件显示文件图标与文件名, * 上传前后同为 80×80。替代内置 upload 组件按图片卡片渲染文件 * (非图片文件没有缩略图会破图,且上传前后尺寸不一致)。 * 值为文件地址字符串,提交与回显行为与 uploadFile 一致。 * * @param string $field 字段名 * @param string $title 字段标题 * @param string $action 上传地址 * @param string $value 已上传文件地址 * @param array $props 组件 props 覆盖:data 上传附加参数、headers 上传请求头、accept 允许的文件类型、disabled 是否禁用 * @return \FormBuilder\Driver\CustomComponent */ public static function fileUpload($field, $title, $action, $value = '', array $props = []) { return self::createComponent('FileUpload') ->field($field) ->title($title) ->value((string)$value) ->props(array_merge([ 'action' => $action, 'uploadName' => 'file', ], $props)); } /** * 富文本编辑器(form-create 自定义组件) * * 前端 SchemaForm 已注册 type=SchemaEditor 的自定义组件(适配系统 wangEditor), * 经包内 CustomComponent 输出规则,值与提交行为与普通字段一致。 * * @param string $field 字段名 * @param string $title 字段标题 * @param string $value 富文本 HTML 默认值 * @param array $ai AI 写作默认提示词配置(可选):prompt 默认提示词、 * system_prompt 默认系统提示词、show_system_prompt 是否显示系统提示词编辑区 * @return \FormBuilder\Driver\CustomComponent */ public static function editor($field, $title, $value = '', array $ai = []) { $component = self::createComponent('SchemaEditor') ->field($field) ->title($title) ->value((string)$value); // AI 写作默认提示词写入组件 props 随规则下发(前端 SchemaEditor 接收后透传给公共弹窗 AiModal) $props = []; if (!empty($ai['prompt'])) { $props['aiPrompt'] = (string)$ai['prompt']; } if (!empty($ai['system_prompt'])) { $props['aiSystemPrompt'] = (string)$ai['system_prompt']; } if (!empty($ai['show_system_prompt'])) { $props['aiShowSystemPrompt'] = true; } if ($props) { $component->props($props); } return $component; } /** * 优惠券标签选择器(form-create 自定义组件 · 契约组件) * * 前端 SchemaForm 已注册 type=SchemaCoupon 的自定义组件: * el-tag 标签展示已选优惠券(可删除),弹窗打开系统选择优惠券页回填 * (/admin/marketing.Coupon/list.html,弹窗页脚确定/取消触发回填)。 * 值为对象数组 [{id, title, coupon_price, use_min_price}], * 发券消费端(userFirstSubGiveCoupon)已兼容该格式。 * ⚠️ 契约组件:改前端只能向后兼容扩展(新增可选 props、默认行为不变)。 * 已支持 props: * - receiveType:筛选发送方式(1 用户领取 / 3 系统赠送),默认 '' 不限; * 新人礼等系统赠送场景应显式传 3。 * * @param string $field 字段名 * @param string $title 字段标题 * @param array $value 已选优惠券对象数组 * @param array $props 组件 props 覆盖:receiveType 等 * @return \FormBuilder\Driver\CustomComponent */ public static function couponSelect($field, $title, $value = [], array $props = []) { return self::createComponent('SchemaCoupon') ->field($field) ->title($title) ->value((array)$value) ->props(array_merge([ 'field' => $field, 'receiveType' => '', ], $props)); } /** * 多列勾选组(form-create 自定义组件 · 契约组件) * * 前端 SchemaForm 已注册 type=SchemaCheckboxGroup 的自定义组件。 * ⚠️ 契约组件:前端实现被 schema 驱动页面与已编译插件 UMD 多方引用, * 改前端组件只能向后兼容扩展(新增可选 props、默认行为不变,红线见 * .crmeb/rules/前端规范.md 第一节),并同步本方法注释。已支持能力: * - 网格布局多列展示(columns),支持全选联动与半选态; * - 选项 title 悬停多行提示;选项 group 归并分组渲染(分组标题全选/清空 + 已选计数); * - 选项 disabled=true 单项禁用;props 传 disabled=true 整组禁用; * - props 传 max=N 限制最多勾选 N 项(默认 0 不限)。 * * @param string $field 字段名 * @param string $title 字段标题 * @param array $value 已勾选值数组 * @param array $options 选项列表 [{label, value[, group][, title][, disabled]}] * @param array $props 组件 props 覆盖:columns 每行列数(默认 2)、selectAll 是否显示全选(默认 true)、disabled 整组禁用、max 最多可勾选数(默认 0 不限) * @return \FormBuilder\Driver\CustomComponent */ public static function checkboxGroup($field, $title, array $value = [], array $options = [], array $props = []) { return self::createComponent('SchemaCheckboxGroup') ->field($field) ->title($title) ->value($value) ->props(array_merge([ 'field' => $field, 'options' => array_values($options), 'columns' => 2, 'selectAll' => true, ], $props)); } }