#### 如何开发composer扩展包
以下说明需要具备composer包开发的相关基础
+ 新增provider
> ```php
> class CustomProvider implements \Bootstrap\Provider {
>
> public function register(){
> // 相关注册代码
> }
> }
> ```
+ 注册迁移目录
> ```php
> class CustomProvider implements \Bootstrap\Provider, \Bootstrap\LaravelProvider {
>
> public function register(){
> // 相关注册代码
> }
>
> public function registerLara(){
> //注册迁移目录代码
> }
>
> // register的方法是由TP发起的,TP相关的常量,函数可以使用
> // registerLara是由laravel发起的,这里不要使用TP的内置方法,仅可执行TP的注册迁移函数
> }
> ```
+ 框架提供的注册接口 (RegisterContainer类)
> 1. registerController
>> + 说明:注册controller
>> + 参数:module_name 模块、 controller_name 控制器、controller_cls 需要映射的controller类名
>
> 2. registerListTopButton
>> + 说明: 注册列表按钮类型
>> + 参数:type 类型、 type_cls 继承\Qscmf\Builder\ButtonType\ButtonType的实现类
>
> 3. registerFormItem
>> + 说明:注册表单控件
>> + 参数:type 类型、 type_cls 继承\Qscmf\Builder\FormType\FormType的实现类
>
> 4. registerSymLink
>> + 说明: 注册软连接
>> + 参数:link_path 软连接绝对路径、 source_path 源绝对路径
>
> 5. registerListSearchType
>> + 说明: 注册列表搜索控件
>> + 参数: type 类型、 type_cls 继承\Qscmf\Builder\ListSearchType\ListSearchType的实现类
>
> 6. registerListRightButtonType
>> + 说明: 注册列表表格按钮
>> + 参数: type 类型、 type_cls 继承\Qscmf\Builder\ListRightButton\ListRightButton的实现类
>
> 7. registerMigration
>> + 说明:注册迁移文件目录
>> + 参数: paths 迁移文件存放的目录数组,只有一个目录时,可以只写一个字符串
>
> 8. registerHeadJs
>> + 说明:
>>
>> 将组件的js注入dashboard_layout头部,
>>
>> 也可以通过在模板文件添加__QS_REGISTER_JS_TAG_BEGIN__和__QS_REGISTER_JS_TAG_END__指定js注入的位置
>>
>> + 参数:
>> + src js连接地址
>> + async 是否异步加载(默认false)
>
> 9. registerListColumnType
>> + 说明: 注册ListBuilder column类型组件
>> + 参数:
>> + type 类型
>> + type_cls 继承\Qscmf\Builder\ColumnType\ColumnType的实现类
>
> 10. registerHeadCss
>> + 说明:
>>
>> 将组件的css注入dashboard_layout头部,
>>
>> 也可以通过在模板文件添加__QS_REGISTER_CSS_TAG_BEGIN__和__QS_REGISTER_CSS_TAG_END__指定css注入的位置
>>
>> + 参数:
>> + src css连接地址
>
> 11. registerBodyHtml
>> + 说明:
>>
>> 将组件的html注入dashboard_layout body的底部,
>>
>> 也可以通过在模板文件添加__QS_REGISTER_BODY_TAG_BEGIN__和__QS_REGISTER_BODY_TAG_END__指定html注入的位置
>>
>> + 参数:
>> + html 需要注入的html
>
> 12. registerHeaderNavbarRightHtml
>> + 说明:
>>
>> 向dashboard_layout 的header元素注入右侧导航项
>>
>> + 参数:
>> + html 需要注入的html
+ 配置composer.json
> 在composer.json文件添加下面注册信息, 框架可通过该配置自动完成provider注册
> ```php
> "qscmf": {
> "providers": [
> #扩展包provider类名#
> ]
> }
> ```
#### 扩展的自定义配置
读取扩展的自定义配置,可在扩展代码的任意位置通过该函数读取到用户定义的配置
配置文件: 放在根目录下的PackageConfig.php
packageConfig($package_name, $config)
参数:
package_name 扩展名
config 配置名
举例:
```php
//PackageConfig.php
return [
//quansitech/send-msg 扩展名
//module 配置名
'quansitech/send-msg' => [
'module' => 'extendAdmin'
]
];
```
#### 如何开发表单控件
```php
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;
}
}
```
#### 如何开发列表按钮扩展
```php
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
public function build(array $option){
//默认配置值
$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 <<getSaveTargetForm();
return "";
}
}
```
```text
subBuilder共用ColumnType的列类型
```
```text
避免重复加载静态文件,需要提供以下方法引入不同模式下的静态资源。
```
***之后会强制ColumnType实现以下方法,需要升级对应组件***
+ 只读模式 registerCssAndJs
```php
static public function registerCssAndJs():?array {
return [
"",
"",
"",
"",
];
}
```
+ 可编辑模式 registerEditCssAndJs
```php
static public function registerEditCssAndJs():?array {
return [
"",
"",
"",
"",
];
}
```
#### 如何开发列表列右边按钮或者表单页按钮
```php
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;
}
}
```
#### 如何开发列表搜索控件
```php
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);
}
}
```
没有列出示例代码的组件扩展都与以上的扩展方法类似,可直接参考上面的代码
#### 扩展列表
+ [阿里云视频点播vod](https://github.com/quansitech/qscmf-formitem-vod)
+ [七牛音视频组件](https://github.com/quansitech/qscmf-formitem-qiniu)
+ [文件批量导出并打包(zip)](https://github.com/quansitech/qscmf-topbutton-download)
+ [xlsx导出excel](https://github.com/quansitech/qscmf-topbutton-export)