以下说明需要具备composer包开发的相关基础
- 新增provider
class CustomProvider implements \Bootstrap\Provider { public function register(){ // 相关注册代码 } }
- 注册迁移目录
class CustomProvider implements \Bootstrap\Provider, \Bootstrap\LaravelProvider { public function register(){ // 相关注册代码 } public function registerLara(){ //注册迁移目录代码 } // register的方法是由TP发起的,TP相关的常量,函数可以使用 // registerLara是由laravel发起的,这里不要使用TP的内置方法,仅可执行TP的注册迁移函数 }
- 框架提供的注册接口 (RegisterContainer类)
- registerController
- 说明:注册controller
- 参数:module_name 模块、 controller_name 控制器、controller_cls 需要映射的controller类名
- registerListTopButton
- 说明: 注册列表按钮类型
- 参数:type 类型、 type_cls 继承\Qscmf\Builder\ButtonType\ButtonType的实现类
- registerFormItem
- 说明:注册表单控件
- 参数:type 类型、 type_cls 继承\Qscmf\Builder\FormType\FormType的实现类
- registerSymLink
- 说明: 注册软连接
- 参数:link_path 软连接绝对路径、 source_path 源绝对路径
- registerListSearchType
- 说明: 注册列表搜索控件
- 参数: type 类型、 type_cls 继承\Qscmf\Builder\ListSearchType\ListSearchType的实现类
- registerListRightButtonType
- 说明: 注册列表表格按钮
- 参数: type 类型、 type_cls 继承\Qscmf\Builder\ListRightButton\ListRightButton的实现类
- registerMigration
- 说明:注册迁移文件目录
- 参数: paths 迁移文件存放的目录数组,只有一个目录时,可以只写一个字符串
- registerHeadJs
说明:
将组件的js注入dashboard_layout头部,
也可以通过在模板文件添加__QS_REGISTER_JS_TAG_BEGIN__和__QS_REGISTER_JS_TAG_END__指定js注入的位置
参数:
src js连接地址
async 是否异步加载(默认false)
- registerListColumnType
- 说明: 注册ListBuilder column类型组件
- 参数:
- type 类型
- type_cls 继承\Qscmf\Builder\ColumnType\ColumnType的实现类
- registerHeadCss
说明:
将组件的css注入dashboard_layout头部,
也可以通过在模板文件添加__QS_REGISTER_CSS_TAG_BEGIN__和__QS_REGISTER_CSS_TAG_END__指定css注入的位置
参数:
src css连接地址
- registerBodyHtml
说明:
将组件的html注入dashboard_layout body的底部,
也可以通过在模板文件添加__QS_REGISTER_BODY_TAG_BEGIN__和__QS_REGISTER_BODY_TAG_END__指定html注入的位置
参数:
html 需要注入的html
- registerHeaderNavbarRightHtml
说明:
向dashboard_layout 的header元素注入右侧导航项
参数:
html 需要注入的html
- 配置composer.json
在composer.json文件添加下面注册信息, 框架可通过该配置自动完成provider注册
"qscmf": { "providers": [ #扩展包provider类名# ] }
读取扩展的自定义配置,可在扩展代码的任意位置通过该函数读取到用户定义的配置
配置文件: 放在根目录下的PackageConfig.php
packageConfig($package_name, $config)
参数:
package_name 扩展名
config 配置名
举例:
//PackageConfig.php
return [
//quansitech/send-msg 扩展名
//module 配置名
'quansitech/send-msg' => [
'module' => 'extendAdmin'
]
];
use Think\View;
use Qscmf\Builder\FormType\FormType;
//实现 Qscmf\Builder\FormType\FormType 接口
//接口必须实现一个build函数,用于完成表单控件的渲染
class CustomType implements FormType{
//form_type接收所有表单控件创建时需要的参数,如 name、title、tips、options等配置项
public function build($form_type){
$view = new View();
$view->assign('form', $form_type);
$content = $view->fetch(__DIR__ . '/custom.html');
return $content;
}
}
use Illuminate\Support\Str;
use Qscmf\Builder\ButtonType\ButtonType;
use Think\View;
//必须继承\Qscmf\Builder\ButtonType\ButtonType抽象类
class CustomButton extends ButtonType{
//实现抽象函数build,完成控件渲染
// option接收所有按钮控件创建时需要的参数,如 type、attribute、tips、auth_node
// listBuilder 为 ListBuilder 类
public function build(array $option, ListBuilder $listBuilder){
//默认配置值
$my_attribute['type'] = 'custom';
$my_attribute['title'] = '自定义类型';
$my_attribute['target-form'] = 'ids';
$my_attribute['class'] = 'btn btn-primary';
//用户自定义覆盖默认配置
if ($option['attribute'] && is_array($option['attribute'])) {
$option['attribute'] = array_merge($my_attribute, $option['attribute']);
}
$gid = Str::uuid();
$gid = str_repeat('-', '', $gid);
$option['attribute']['id'] = 'modal-' . $gid;
$view = new View();
$view->assign('gid', $gid);
//仅需渲染按钮外的内容,按钮的渲染由框架完成
$content = $view->fetch(__DIR__ . '/custom.html');
//返回渲染结果
return <<<HTML
{$content}
HTML;
}
}
use Qscmf\Builder\ButtonType\Save\TargetFormTrait;
use Qscmf\Builder\ColumnType\ColumnType;
use Qscmf\Builder\ColumnType\EditableInterface;
// 必须继承Qscmf\Builder\ColumnType\ColumnType抽象类
// 可以通过实现接口Qscmf\Builder\ColumnType\EditableInterface来自定义该组件编辑状态下的html
// 自定义编辑状态html时,input标签的样式必须包括top button save类型的target_form,否则不会提交该列值
// Qscmf\Builder\ButtonType\Save\TargetFormTrait已经实现getSaveTargetForm(),即获取top button save类型的target_form,使用该trait类即可
class Num extends ColumnType implements EditableInterface
{
use TargetFormTrait;
public function build(array &$option, array $data, $listBuilder)
{
return $data[$option['name']];
}
public function editBuild(&$option, $data, $listBuilder){
$class = "form-control input text ". $this->getSaveTargetForm($listBuilder);
return "<input class='{$class}' type='number' name='{$option['name']}[]' value={$data[$option['name']]} />";
}
}
subBuilder共用ColumnType的列类型
避免重复加载静态文件,需要提供以下方法引入不同模式下的静态资源。
之后会强制ColumnType实现以下方法,需要升级对应组件
-
只读模式 registerCssAndJs
static public function registerCssAndJs():?array { return [ "<script src='".asset('libs/cui/cui.extend.min.js')."' ></script>", "<script src='".asset('libs/bootstrap-datepicker/bootstrap-datepicker.js')."' ></script>", "<script src='".asset('libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js')."' ></script>", "<script src='".asset('libs/bootstrap-datetimepicker/locales/bootstrap-datetimepicker.zh-CN.js')."' ></script>", ]; }
-
可编辑模式 registerEditCssAndJs
static public function registerEditCssAndJs():?array { return [ "<script src='".asset('libs/cui/cui.extend.min.js')."' ></script>", "<script src='".asset('libs/bootstrap-datepicker/bootstrap-datepicker.js')."' ></script>", "<script src='".asset('libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js')."' ></script>", "<script src='".asset('libs/bootstrap-datetimepicker/locales/bootstrap-datetimepicker.zh-CN.js')."' ></script>", ]; }
namespace Qs\ListRightButton\Modal;
use Qs\ModalButton\ModalButtonBuilder;
use Qscmf\Builder\ListRightButton\ListRightButton;
// 列表的右边按钮和表单页的按钮,都是处理一条具体的数据
// 所以它们所需的按钮类型应该是一样的,可以共同使用ListRightButton类型的按钮。
// 必须继承Qscmf\Builder\ListRightButton\ListRightButton抽象类
// 默认的颜色的样式目前有default、primary、warning、danger、success、info
// 由于列表页按钮和表单页的按钮样式不一致,使用mergeAttr合并属性,注入对应的样式类名
class Modal extends ListRightButton
{
public function build(array &$option, array $data, $listBuilder)
{
$my_attribute['type'] = 'modal';
$my_attribute['title'] = '对话框';
$my_attribute['class'] = 'primary';
$my_attribute['data-toggle'] = "modal";
$builder = $option['options'] ?:$this->defaultModalBuilder();
$gid = $builder->getGid();
$my_attribute['data-target']="#".$gid.'Modal';
if ($option['attribute'] && is_array($option['attribute'])) {
$option['attribute'] = $listBuilder->mergeAttr($my_attribute, $option['attribute']);
}
$option['attribute']['id'] = $gid;
return (string)$builder;
}
protected function defaultModalBuilder(){
$builder = new ModalButtonBuilder();
$builder->setTitle('defaultModal');
return $builder;
}
}
namespace Qs\ListSearchType\Select2;
use Qs\ListSearchType\Select2Builder;
use Think\View;
use Qscmf\Builder\ListSearchType\ListSearchType;
// 必须继承\Qscmf\Builder\ListSearchType\ListSearchType抽象类
class Select2 implements ListSearchType
{
// 实现抽象函数build,完成控件渲染
// item接收所有搜索控件创建时需要的参数,如 name、type、title、options、auth_node
// 返回控件html
public function build(array $item){
$options = $item['options'] instanceof Select2Builder ? $item['options'] :
$this->buildDefBuilder($item['options']);
!$options->getPlaceholder() && $options->setPlaceholder($item['title']);
$view = new View();
$view->assign('item', $item);
$view->assign('gid', $options->getGid());
$view->assign('options', $options->getData());
$view->assign('select2_opt', $options->toArray());
$view->assign('value', I('get.'.$item['name']));
$content = $view->fetch(__DIR__ . '/select2.html');
return $content;
}
protected function buildDefBuilder(array $options):Select2Builder{
return new Select2Builder($options);
}
}
没有列出示例代码的组件扩展都与以上的扩展方法类似,可直接参考上面的代码