CRMEB/backend/crmeb/utils/FormBuilder.php
吴昊天 1d87201680 fix(优惠券选择): 契约组件支持 receiveType 筛选,新人礼仅可选系统赠送券
嵌入选择页按内容高度自适应,表格列宽收紧便于弹窗展示。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 10:24:29 +08:00

162 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

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

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
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));
}
}