Skip to content

开发

为了更好的介绍,文档将如何开发提到最前面,组件详细使用可以在对应组件页面了解到。目前开发一些案列正在进行中,后续继续补充

入门

首先创建一个简单的角色表单

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>

如下图显示 laravel admin catchadmin 动态表单

分栏布局

有时候表单需要分栏布局,显示双栏布局

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();
    });
});

显示效果如下 laravel admin catchadmin 动态表单  分栏布局

三栏布局

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 的时候才会显示中间栏目

laravel admin catchadmin 动态表单  分栏布局

表单验证

表单组件内部内置了很多可用规则,下面演示个只允许字母的规则。

php
return  Form::make(function (Form $form){
    $form->text('text', '测试')->validates('alpha');
});

laravel admin catchadmin 动态表单

可用规则

可用规则,请查看可用规则验证列表