homepagePHP/docs/Extends.md

353 lines
11 KiB
Markdown
Executable File
Raw Permalink 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.

#### 如何开发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 <<<HTML
{$content}
HTML;
}
}
```
#### 如何开发列表列字段扩展
```php
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();
return "<input class='{$class}' type='number' name='{$option['name']}[]' value={$data[$option['name']]} />";
}
}
```
```text
subBuilder共用ColumnType的列类型
```
```text
避免重复加载静态文件,需要提供以下方法引入不同模式下的静态资源。
```
***之后会强制ColumnType实现以下方法需要升级对应组件***
+ 只读模式 registerCssAndJs
```php
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
```php
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>",
];
}
```
#### 如何开发列表列右边按钮或者表单页按钮
```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)