主题
开发
为了更好的介绍,文档将如何开发提到最前面,组件详细使用可以在对应组件页面了解到。目前开发一些案列正在进行中,后续继续补充
入门
首先创建一个简单的角色表单
php
use CatchForm\Components\Form;
class RoleForm
{
public function form()
{
return Form::make(function (Form $form) {
$form->text('role_name', '角色名称')->required();
$form->text('identify', '角色显示名称')->required();
$form->text('description', '角色描述')->required();
});
}
}
- 使用
Form
组件创建$form
对象 - 使用
make
方法- 接受一个
匿名函数
,里面是对应表单的内容
- 接受一个
创建添加权限表单
php
public function form()
{
return Form::make(function (Form $form){
$form->row(function (Form $form){
$form->col( function (Form $form){
$form->radio('type', '菜单类型')->required()->asButton()->options(MenuType::class)
->defaultValue(1)
// 目录
->whenEqual(MenuType::Top->value(), function (Control $control){
$control->show([
'permission_name', 'icon', 'module',
'component', 'route', 'hidden',
'redirect', 'sort', 'keepalive'
]);
})
->whenNotEqual(MenuType::Top->value(), function (Control $control){
$control->hide(['parent_id', 'redirect']);
})
->whenEqual(MenuType::Top->value(), function (Control $control){
$control->required(['permission_name', 'module', 'route']);
})
// 菜单操作
->whenEqual(MenuType::Menu->value(), function (Control $control){
$control->show([
'permission_name', 'icon', 'module',
'component', 'route', 'hidden', 'redirect',
'sort', 'keepalive', 'select_permission_mark',
'active_menu'
]);
})
->whenEqual(MenuType::Menu->value(), function (Control $control){
$control->required([
'permission_name', 'module', 'route',
'select_permission_mark', 'component',
'parent_id'
]);
})
// 按钮操作
->whenEqual(MenuType::Action->value(), function (Control $control){
$control->show(['permission_name', 'text_permission_mark']);
})
->whenEqual(MenuType::Action->value(), function (Control $control){
$control->required(['permission_name', 'text_permission_mark', 'parent_id']);
})
->emitChange();
$form->text('permission_name', '菜单名称')->maxlength(30)->showWordLimit();
$form->select('module', '所属模块')->options((new Modules())->get())->emitChange();
$form->text('route', '路由Path')->maxlength(30)->showWordLimit()->required();
$form->text('redirect', 'Redirect')->maxlength(50)->showWordLimit();
$form->number('sort', '排序')->min(0)->max(999999)->defaultValue(1);
})->span12();
$form->col(function (Form $form){
$form->cascader('parent_id', '上级菜单')->optionsTo('options')->options(
\Modules\Permissions\Models\Permissions::query()
->whereIn('type', [
MenuType::Menu->value,
MenuType::Top->value
])->get(['id as value', 'permission_name as label', 'parent_id'])->toTree(id: 'value')
)->checkStrictly();
$form->selectOptions('permission_mark', '权限标识')
->alias('select_permission_mark')
->api('controllers');
$form->text('permission_mark', '权限标识')->alias('text_permission_mark');
$form->iconSelect('icon', '选择icon')->class('w-full');
$form->selectOptions('component', '所属组件')->api('components');
$form->radio('hidden', 'Hidden')->options(Status::class)->defaultValue(Status::Enable->value());
$form->radio('keepalive', 'Keepalive')->options(Status::class)->defaultValue(Status::Enable->value());
})->span12();
});
$form->text('active_menu', '激活菜单')
->info('如果是访问内页的菜单路由,例如创建文章 create/post, 虽然它隶属于文章列表,但实际上并不会嵌套在文章列表路由里
而是单独的一个路由,并且是不显示在左侧菜单的。所以在访问它的时候,需要左侧菜单高亮,则需要设置该参数');
});
}
前端表单生成代码
vue
<template>
<catch-form api="表单 api 接口" ref="form" />
</template>
<script lang="ts" setup>
// @ts-nocheck
const form = ref()
// 监听模块组件的 change 事件
const changeEvent = () => {
// 获取表单实例
const formApi = form.value.getForm()
// 监听模块 change 时间
formApi.on('module-change', (value) => {
formApi.mergeRule('select_permission_mark', { props: { query: { module: value } } })
formApi.mergeRule('component', { props: { query: { module: value } } })
})
// 监听类型 change 事件
formApi.on('type-change', (value) => {
form.value.resetExceptFields('type')
})
}
const closeDialog = inject('closeDialog') as Function
onMounted(() => {
close(() => closeDialog())
changeEvent()
})
</script>
如下图显示
分栏布局
有时候表单需要分栏布局,显示双栏布局
php
return Form::make(function (Form $form){
$form->row(function (Form $form){
$form->col( function (Form $form){
$form->text('left', '左栏目')->maxlength(30)->showWordLimit();
})->span12();
$form->col(function (Form $form){
$form->text('right', '右栏目')->alias('text_permission_mark');
})
// span 12
->span12();
});
});
显示效果如下
三栏布局
php
return Form::make(function (Form $form){
$form->row(function (Form $form){
$form->col( function (Form $form){
$form->text('left', '左栏目')->maxlength(30)->showWordLimit();
})->span8();
$form->col(function (Form $form){
$form->text('middle', '中间栏')->alias('text_permission_mark');
})->span8();
$form->col(function (Form $form){
$form->text('right', '右栏目')->alias('text_permission_mark');
})->span8();
});
});
表单条件
有时候表单元素之间需要一些状态条件联动,举个简单的示例,还是以上面的示例为例
php
return Form::make(function (Form $form){
$form->row(function (Form $form){
$form->col( function (Form $form){
$form->text('left', '左栏目')->maxlength(30)->showWordLimit()
// 当输入是 `middle` 的时候才会显示中间栏目
->whenEqual('middle', function (Control $control){
$control->show(['middle']);
});
});
$form->col(function (Form $form){
$form->text('middle', '中间栏')->alias('text_permission_mark');
});
$form->col(function (Form $form){
$form->text('right', '右栏目')->alias('text_permission_mark');
});
});
});
当输入是
middle
的时候才会显示中间栏目
表单验证
表单组件内部内置了很多可用规则,下面演示个只允许字母的规则。
php
return Form::make(function (Form $form){
$form->text('text', '测试')->validates('alpha');
});