YFCMF3 开发手册

序言

YFCMF是采用ThinkPHP5.1.*+国外ACE1.40的UI模板的后台内容管理框架。YFCMF秉承极简、极速、极致的开发理念,方便开发者快速二次开发。

功能特性

Wiget构建神器

使用YFCMF自主开发的Wiget类,您可以轻松的应对复杂多变的表单、数据列表。数据列表集成快速筛选、排序、模糊搜索、AJAX编辑等功能,表单页集成常用的文本、下拉框、单选、多选、关键词、编辑器、文件上传、图片上传、图片裁切等控件。

模块插件化

低耦合、高内聚、无重用,保证了应用程序的高内聚低耦合。

跨平台支持

YFCMF集成BootStrap、JQuery、Select2等优秀的前端开源框架,基于ThinkPHP5出色的性能和REST支持、远程调试和更好的支持API开发。让您可以一次开发即可直接兼容PC、移动设备和微信界面,通过简单的配置即可快速构建属于自己的Android、IOS的APP。

鸣谢

感谢ThinkPHPJQueryBootstraplayerSelect2等优秀开源项目。

环境搭建

Windows环境

在Windows环境下,建议开发者使用phpStudy环境套件,下面引用官方的介绍:

该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序绿色小巧简易迷你仅有32M,有专门的控制面板。总之学习PHP只需一个包。 对学习PHP的新手来说,WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事。因此无论你是新手还是老手,该程序包都是一个不错的选择。 全面适合 Win2000/XP/2003/win7/win8/win2008 操作系统 ,支持Apache、IIS、Nginx和LightTPD。

新特征:完美支持win10,支持自定义php版本

下载地址:phpStudy

Linux环境

在Linux环境下,可使用宝塔面板,该面板使用起来简单,功能强大。

要求

  1. PHP >= 5.6.0
  2. PDO PHP Extension
  3. MBstring PHP Extension
  4. CURL PHP Extension
  5. 开启静态重写(方法参考:https://www.kancloud.cn/manual/thinkphp5_1/353955)
  6. 要求环境支持pathinfo

YFCMF安装

下载

当前为3.0.0版,手册内容还有待补充,如果您在使用过程中发现问题,或者有更好的建议,欢迎加入我们。

官方QQ群1(213321650

开发者讨论区

http://sns.yfcmf.net/

后台演示

http://v3.yfcmf.net/manage/

安装

  1. 搭建环境
  2. 设置虚拟主机域名
  3. 访问http(s)://yourdomain/
  4. 按安装向导进行安装

目录结构

目录结构

│
├─addons                             插件目录
│  │  info                           info插件
│  │  maintain                       maintain插件
│  │  security                       security插件
│  └──team                           team插件
├─app                                应用目录
│  │  common.php                     应用公共(函数)文件
│  │  tags.php                       应用行为扩展定义文件
│  │
│  ├─admin                           系统模块目录
│  │
│  ├─common                          公共模块目录
│  │  ├─behavior                     行为目录
│  │  │
│  │  ├─widget                       widget表单构造器目录
│  │  │  ├─Widget.php                表单构造器类
│  │  │  │
│  │  │  └─form                      表单构建器目录
│  │  │     │
│  │  │     ├─ButtonDropdownForm.php 下拉按钮
│  │  │     │
│  │  │     ├─ButtonDropdownForm.php 按钮
│  │  │     │
│  │  │     │...                     其它表单项
│  │  │
│  │  ├─controller                   公共模块控制器目录
│  │  ├─validate                     公共模块验证器目录
│  │  └─model                        公共模块模型目录
│  ├─install                         安装模块目录
│  └─home                            前台模块目录
│
├─config                             配置文件目录
│  ├─app.php                         应用配置
│  ├─cache.php                       缓存配置
│  ├─cookie.php                      Cookie配置
│  ├─database.php                    数据库配置
│  ├─log.php                         日志配置
│  ├─session.php                     Session配置
│  ├─template.php                    模板引擎配置
│  ├─trace.php                       Trace配置
│  └─yfcmf.php                       yfcmf自定义配置
│
├─data                               上传数据目录
├─extend                             扩展类库目录
│  └─util
│    ├─ip                            IP数据
│    ├─Ip.php                        Ip扩展类库
│    ├─Qiniu.php                     七牛上传扩展类库
│    ├─ReadClass.php                 类文件分析扩展类库
│    ├─Tree.php                      树形类相关扩展
│
├─public                             外部资源目录
│
├─route                              路由设置目录
│
├─runtime                            应用的运行时目录
│
├─thinkphp                          框架系统目录
│
└─vendor                            第三方类库目录(Composer)

开发规范

PSR-2

代码风格规范

本篇规范是 PSR-1 基本代码规范的继承与扩展。

本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便。

当多名程序员在多个项目中合作时,就需要一个共同的编码规范, 而本文中的风格规范源自于多个不同项目代码风格的共同特性, 因此,本规范的价值在于我们都遵循这个编码风格,而不是在于它本身。

关键词 “必须”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、 “将会”("SHALL")、“不会”("SHALL NOT")、“应该”("SHOULD")、“不该”("SHOULD NOT")、 “推荐”("RECOMMENDED")、“可以”("MAY")和”可选“("OPTIONAL")的详细描述可参见 RFC 2119

  1. 概览

  • 代码必须遵循 PSR-1 中的编码规范 。

  • 代码必须使用4个空格符而不是 tab键 进行缩进。

  • 每行的字符数应该软性保持在80个之内, 理论上一定不可多于120个, 但一定不能有硬性限制。

  • 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行。

  • 类的开始花括号({)必须写在其声明后自成一行,结束花括号(})也必须写在其主体后自成一行。

  • 方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。

  • 类的属性和方法必须添加访问修饰符(privateprotected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后。

  • 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有。

  • 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。

  • 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。

1.1. 例子

以下例子程序简单地展示了以上大部分规范:

 $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}
  1. 通则

2.1 基本编码准则

代码必须符合 PSR-1 中的所有规范。

2.2 文件

所有PHP文件必须使用Unix LF (linefeed)作为行的结束符。

所有PHP文件必须以一个空白行作为结束。

纯PHP代码文件必须省略最后的 ?> 结束标签。

2.3. 行

行的长度一定不能有硬性的约束。

软性的长度约束一定要限制在120个字符以内,若超过此长度,带代码规范检查的编辑器一定要发出警告,不过一定不可发出错误提示。

每行不应该多于80个字符,大于80字符的行应该折成多行。

非空行后一定不能有多余的空格符。

空行可以使得阅读代码更加方便以及有助于代码的分块。

每行一定不能存在多于一条语句。

2.4. 缩进

代码必须使用4个空格符的缩进,一定不能用 tab键 。

备注: 使用空格而不是tab键缩进的好处在于, 避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。 并且,使用空格缩进,让对齐变得更方便。

2.5. 关键字 以及 True/False/Null

PHP所有 关键字必须全部小写。

常量 truefalsenull必须全部小写。

  1. namespace 以及 use 声明

namespace 声明后 必须 插入一个空白行。

所有 use 必须 在 namespace 后声明。

每条 use 声明语句 必须 只有一个 use 关键词。

use 声明语句块后 必须 要有一个空白行。

例如:

  1. 类、属性和方法

此处的“类”泛指所有的class类、接口以及traits可复用代码块。

4.1. 扩展与继承

关键词 extendsimplements必须写在类名称的同一行。

类的开始花括号必须独占一行,结束花括号也必须在类主体后独占一行。

implements 的继承列表也可以分成多行,这样的话,每个继承接口名称都必须分开独立成行,包括第一个。

4.2. 属性

每个属性都必须添加访问修饰符。

一定不可使用关键字 var 声明一个属性。

每条语句一定不可定义超过一个属性。

不要使用下划线作为前缀,来区分属性是 protected 或 private。

以下是属性声明的一个范例:

4.3. 方法

所有方法都必须添加访问修饰符。

不要使用下划线作为前缀,来区分方法是 protected 或 private。

方法名称后一定不能有空格符,其开始花括号必须独占一行,结束花括号也必须在方法主体后单独成一行。参数左括号后和右括号前一定不能有空格。

一个标准的方法声明可参照以下范例,留意其括号、逗号、空格以及花括号的位置。

4.4. 方法的参数

参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不能有空格。

有默认值的参数,必须放到参数列表的末尾。

参数列表可以分列成多行,这样,包括第一个参数在内的每个参数都必须单独成行。

拆分成多行的参数列表后,结束括号以及方法开始花括号 必须 写在同一行,中间用一个空格分隔。

4.5. abstractfinal 、 以及 static

需要添加 abstractfinal 声明时, 必须写在访问修饰符前,而 static必须写在其后。

4.6. 方法及函数调用

方法及函数调用时,方法名或函数名与参数左括号之间一定不能有空格,参数右括号前也 一定不能有空格。每个逗号前一定不能有空格,但其后必须有一个空格。

bar($arg1);
Foo::bar($arg2, $arg3);

参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。

bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);
  1. 控制结构

控制结构的基本规范如下:

  • 控制结构关键词后必须有一个空格。
  • 左括号 (一定不能有空格。
  • 右括号 ) 前也一定不能有空格。
  • 右括号 ) 与开始花括号 {一定有一个空格。
  • 结构体主体一定要有一次缩进。
  • 结束花括号 } 一定在结构体主体后单独成行。

每个结构体的主体都必须被包含在成对的花括号之中, 这能让结构体更加结构话,以及减少加入新行时,出错的可能性。

5.1. ifelseifelse

标准的 if 结构如下代码所示,留意 括号、空格以及花括号的位置, 注意 elseelseif 都与前面的结束花括号在同一行。

应该使用关键词 elseif 代替所有 else if ,以使得所有的控制关键字都像是单独的一个词。

5.2. switchcase

标准的 switch 结构如下代码所示,留意括号、空格以及花括号的位置。 case 语句必须相对 switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须 相对 case 进行一次缩进。 如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。

5.3. whiledo while

一个规范的 while 语句应该如下所示,注意其 括号、空格以及花括号的位置。

标准的 do while 语句如下所示,同样的,注意其 括号、空格以及花括号的位置。

5.4. for

标准的 for 语句如下所示,注意其 括号、空格以及花括号的位置。

5.5. foreach

标准的 foreach 语句如下所示,注意其 括号、空格以及花括号的位置。

 $value) {
    // foreach body
}

5.6. try, catch

标准的 try catch 语句如下所示,注意其 括号、空格以及花括号的位置。

  1. 闭包

闭包声明时,关键词 function 后以及关键词 use 的前后都必须要有一个空格。

开始花括号必须写在声明的同一行,结束花括号必须紧跟主体结束的下一行。

参数列表和变量列表的左括号后以及右括号前,必须不能有空格。

参数和变量列表中,逗号前必须不能有空格,而逗号后必须要有空格。

闭包中有默认值的参数必须放到列表的后面。

标准的闭包声明语句如下所示,注意其 括号、逗号、空格以及花括号的位置。

参数列表以及变量列表可以分成多行,这样,包括第一个在内的每个参数或变量都必须单独成行,而列表的右括号与闭包的开始花括号必须放在同一行。

以下几个例子,包含了参数和变量列表被分成多行的多情况。

注意,闭包被直接用作函数或方法调用的参数时,以上规则仍然适用。

bar(
    $arg1,
    function ($arg2) use ($var1) {
        // body
    },
    $arg3
);
  1. 总结

以上规范难免有疏忽,其中包括但不仅限于:

  • 全局变量和常量的定义
  • 函数的定义
  • 操作符和赋值
  • 行内对齐
  • 注释和文档描述块
  • 类名的前缀及后缀
  • 最佳实践

本规范之后的修订与扩展将弥补以上不足。

PSR-4-autoloader

Autoloader

关键词 “必须”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、 “将会”("SHALL")、“不会”("SHALL NOT")、“应该”("SHOULD")、“不该”("SHOULD NOT")、 “推荐”("RECOMMENDED")、“可以”("MAY")和”可选“("OPTIONAL")的详细描述可参见 [RFC 2119][http://tools.ietf.org/html/rfc2119] 。

1. 概述

本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路径规范。

2. 详细说明

  1. 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。

  2. 一个完整的类名需具有以下结构:

     \<命名空间>(\<子命名空间>)*\<类名>
    
    1. 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";

    2. 完整的类名可以有一个或多个子命名空间;

    3. 完整的类名必须有一个最终的类名;

    4. 完整的类名中任意一部分中的下划线都是没有特殊含义的;

    5. 完整的类名可以由任意大小写字母组成;

    6. 所有类名都必须是大小写敏感的。

  3. 当根据完整的类名载入相应的文件……

    1. 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;

    2. 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。

    3. 末尾的类名必须与对应的以 .php 为后缀的文件同名。

    4. 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。

3. 例子

下表展示了符合规范完整类名、命名空间前缀和文件基目录所对应的文件路径。

完整类名 命名空间前缀 文件基目录 文件路径
File_Writer Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
Status Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
Request Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php

关于本规范的实现,可参阅 相关实例
注意:实例并属于规范的一部分,且随时有所变动。

ThinkPHP5.1开发规范

命名规范

ThinkPHP5.1遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:

目录和文件

  • 目录使用小写+下划线;
  • 类库、函数文件统一以.php为后缀;
  • 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
  • 类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
  • 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);

函数和类、属性命名

  • 类的命名采用驼峰法(首字母大写),例如 UserUserType,默认不需要添加后缀,例如UserController应该直接命名为User
  • 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip
  • 方法的命名使用驼峰法(首字母小写),例如 getUserName
  • 属性的命名使用驼峰法(首字母小写),例如 tableNameinstance
  • 特例:以双下划线__打头的函数或方法作为魔术方法,例如 __call__autoload

常量和配置

  • 常量以大写字母和下划线命名,例如 APP_PATH
  • 配置参数以小写字母和下划线命名,例如 url_route_onurl_convert
  • 环境变量定义使用大写字母和下划线命名,例如APP_DEBUG

数据表和字段

  • 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表及字段命名。

请理解并尽量遵循以上命名规范,可以减少在开发过程中出现不必要的错误。

请避免使用PHP保留字(保留字列表参见 http://php.net/manual/zh/reserved.keywords.php )作为常量、类名和方法名,以及命名空间的命名,否则会造成系统错误。

YFCMF开发规范

命名规范

YFCMF遵循PSR-2命名规范和PSR-4自动加载规范及ThinkPHP5.1的开发规范,并且注意如下规范:

数据库规范

1.数据库表名

数据库表名命名遵循以下规范:

  • 表名均使用小写字母;
  • 表名使用统一前缀,且前缀不能为空(模块化,且可有效规避MySQL保留字)
  • 对于多个单词组成的表名,使用_间隔; 例子:user_info 和 book_store等。

2.数据库字段

数据库字段命名遵循以下规范:

  • 全部使用小写;
  • 多个单词间使用_间隔。
  • 避免使用关键字和保留字。

例子:user_name、rose_price等。

Widget表单构造器

YFCMF内置了强大的快速构建器,可以帮助开发者快速构建表单页面、数据表格,以便让开发者专注于业务逻辑,而不用把过多的精力放在制作各种页面上。

注意:目前Widget只能用于后台,暂不支持在前台使用。

基本使用

YFCMF的所有快速构建器都统一由Widget来调用和处理,在使用前只需要引入Widget即可方便的使用各种构建器。

1.引入Widget

use app\common\widget\Widget;

2.调用fetch渲染页面

namespace app\admin\controller;

use app\common\widget\Widget;

class Help extends Base
{
    public function softIndex()
    {
        //表格字段
        $fields=[
            ['title'=>'软件名称','field'=>'name'],
            ['title'=>'说明','field'=>'desc'],
            ['title'=>'上传日期','field'=>'date'],
        ];
        //主键
        $pk='id';
        //数据
        $data=[
            [
            'id'=>1,
            'name'=>'谷歌浏览器',
            'desc'=>'更好的体验html5+css3效果,下载后解压进行安装',
            'date'=>'2015-11-5',
            'download'=>'http://dlsw.baidu.com/sw-search-sp/soft/9d/14744/ChromeStandalone_50.0.2661.87_Setup.1461306176.exe'
            ],
            [
            'id'=>2,
            'name'=>'winrar压缩解压软件',
            'desc'=>'用于解压压缩包文件,这里主要用于解压本系统软件包。',
            'date'=>'2015-11-5',
            'download'=>'http://dlsw.baidu.com/sw-search-sp/soft/2e/10849/wrar_5.30.0.0sc.1452057954.exe'
            ]
        ];
        //右侧操作按钮
        $right_action=[
            'download'=>['title'=>'下载','field'=>'download','icon'=>'fa fa-cloud-download'],
        ];
        //实例化表单类
        $widget=new Widget();
        return $widget
            ->addtable($fields,$pk,$data,$right_action)
            ->setButton([])
            ->fetch();
    }
}

form表单项

form表单项是Widget中的核心部分,YFCMF内置了几十种常用的表单,通过传递简单的参数,可以达到快速创建form和table的管理页面,真正释放开发者的双手,将更多的精力放到功能的设计与开发上面。

序号 表单项 调用
1 按钮 addButton($title='',$attr=[],$id='',$type='')
2 下拉按钮 addButtondropdown($button=[],$groups=[],$has_drbtn=false,$class='',$dr_class='')
3 按钮组 addButtongroup($groups=[],$class='')
4 验证码 addCaptcha($name, $id = '', $title = '', $attr = [], $extra_attr_input = '', $extra_class_input = 'col-xs-10 col-sm-5', $extra_css_input = '', $extra_attr_img = '', $extra_class_img = 'col-xs-10 col-sm-3', $extra_css_img = 'cursor: pointer;border: 1px solid #d5d5d5;height:34px;margin-left:10px;')
5 复选框 addCheckbox($name,$title,$options=[],$default='',$disabled =[],$attr=[],$extra_class='',$extra_attr='')
6 颜色选择框 addColor($name,$title,$default='',$help_text='',$format='hex',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
7 日期框 addDate($name,$title,$default='',$help_text='',$format='yyyy-mm-dd',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
8 日期区间 addDaterange($name,$title,$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
9 日期时间 addDatetime($name,$title,$default='',$help_text='',$format='yyyy-mm-dd hh:ii:ss',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
10 单文件上传 addFile($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')
11 多文件上传 addFiles($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')
12 tab分组 addGroup($groups=[],$id='',$position='',$color='',$tab_space=0,$tab_padding=0,$content_padding=0,$content_noborder=false)
13 图标选择 addIcon($name,$title,$default='0',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
14 单图片上传 addImage($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')
15 多图片上传 addImages($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')
16 图片剪裁 addJcrop($name='',$title='',$default='',$attr=[],$extra_class='col-xs-10 col-sm-5')
17 多级联动 addLinkage($title='',$data=[],$attr=[])
18 格式文本 addMask($name,$title,$default='',$help_text='',$format='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
19 单选表单 addRadio($name,$title,$options=[],$default='',$disabled=[],$attr=[],$extra_class='',$extra_attr='')
20 范围 addRange($name,$title,$default='0',$help_text='',$attr=[],$extra_class='',$extra_attr='')
21 单选下拉框 addSelect($name,$title,$options=[],$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
22 多选下拉框 addSelects($name,$title,$options=[],$default='',$help_text='',$extra_attr='',$optgroups=[],$attr=[],$extra_class='')
23 开关 addSwitch($name,$title,$default='0',$extra_attr='',$attr=[],$extra_class='')
24 表格 addTable($fields,$pk='id',$datas=[],$right_actions=[],$page='',$order=false,$delall=false,ajax=false)
25 tag标签 addTag($name,$title,$data=[],$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
26 单行文本框 addText($name,$title,$default='',$help_text='',$extra_attr='',$type='text',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_css='')
27 多行文本框 addTextarea($name,$title,$default='',$help_text='',$extra_attr='',$attr=[],$extra_class='col-xs-10 col-sm-5')
28 时间框 addTime($name,$title,$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')
29 百度编辑器 addUeditor($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-12')
30 表格顶部按钮搜索 addToparea($default=[],$custom=[],$items=[],$form=[])

其它表单会陆续增加...

按钮

方法:addButton($title='',$attr=[],$id='',$type='')

标识符:button

参数 含义 类型
title 标题 string
attr 属性 array
id 按钮id string
type 按钮类型
'a'=a标签按钮,''=正常按钮
string

返回:Widget

attr参数如下

属性 含义 类型 取值
class 样式 string 颜色:btn-default btn-primary btn-info btn-success btn-warning btn-danger btn-inverse btn-pink btn-purple btn-yellow btn-grey btn-light btn-link btn-white
应用按钮:btn-app
圆角:radius-4 no-radius
尺寸: btn-lg '' btn-sm btn-xs btn-minier
边框: no-border '' btn-bold btn-round
块按钮:btn-block ''
type 按钮type string '' 'submit' 'reset' 'back'
icon_l 按钮左侧icon string
icon_r 按钮右侧icon string
disabled 禁用 bool true or false
tips 提示 string
span 按钮后面的标签badge array ['title'=>'','class'=>'']
href a标签按钮时链接 string
target a标签按钮时打开方式 string '_self'
data 附加属性,通过data-id等方式 array []

普通按钮

$widget=new Widget();
return $widget
       ->addButton('我是按钮')
       ->fetch();

普通按钮

a标签按钮

$widget=new Widget();
return $widget
       ->addButton('我是按钮',['href'=>'http://www.baidu.com/'],'','a')
       ->fetch();

a标签按钮

其它按钮属性

$widget=new Widget();
return $widget
       ->addButton('我是按钮',
         [
           'class'=>'btn btn-purple btn-app radius-4',
           'icon_l'=>'ace-icon fa fa-envelope bigger-200',
           'span'=>['title'=>'6+', 'class'=>'label label-inverse arrowed-in']
         ]
        )
       ->fetch();

其它按钮

详细按钮参考ace1.40

下拉按钮

方法:addButtondropdown($button=[],$groups=[],$has_drbtn=false,$class='',$dr_class='')

标识符:buttondropdown

参数 含义 类型
button 顶部按钮,元素参数见button,须为关联数组 array
groups 每个元素参数见button,须为关联数组 array
has_drbtn 是否单独下拉按钮 bool
class 'dropup'=上拉显示 ''=下拉 string
dr_class 下拉class样式
dropdown-menu-right
dropdown-default
dropdown-danger..等
string

返回:Widget

$widget=new Widget();
return $widget
       ->addButtondropdown(
	   ['title'=>'Action'],
	   [
	    ['title'=>'post'],
		['title'=>'get']
	   ]
	   )
       ->fetch();

普通下拉菜单

groups每个按钮元素可以设置是否为分隔符,如:

$widget=new Widget();
return $widget
       ->addButtondropdown(
	   ['title'=>'Action'],
	   [
	    ['title'=>'post'],
	    ['title'=>'get'],
		['is_divider'=>1],
		['title'=>'head']
	   ]
	   )
       ->fetch();

分隔符下拉菜单

设置单独下拉按钮

$widget=new Widget();
return $widget
       ->addButtondropdown(
	   ['title'=>'Action'],
	   [
	    ['title'=>'post'],
		['title'=>'get'],
		['is_divider'=>1],
		['title'=>'head']
	   ],
	   true
	   )
       ->fetch();

单独下拉按钮

上拉下拉设置

$widget=new Widget();
return $widget
       ->addButtondropdown(
	   ['title'=>'Action'],
	   [['title'=>'post'],
	   ['title'=>'get'],
	   ['is_divider'=>1],
	   ['title'=>'head']],
	   true,
	   'dropup'
	   )
       ->fetch();

下拉class样式

$widget=new Widget();
return $widget
       ->addButtondropdown(
	   ['title'=>'Action'],
	   [
	    ['title'=>'post'],
		['title'=>'get'],
		['is_divider'=>1],
		['title'=>'head']
	   ],
	   true,
	   '',
	   'dropdown-danger'
	   )
       ->fetch();

下拉class样式

其它各种样式参考ace1.4

按钮组

方法:addButtongroup($groups=[],$class='')

标识符:buttongroup

参数 含义 类型
groups 按钮,每个元素参数见button,须为关联数组 array
class 样式 string

返回:Widget

普通按钮组

$widget=new Widget();
return $widget
       ->addButtongroup([['title'=>'1'],['title'=>'2'],['title'=>'3'],['title'=>'4']])
       ->fetch();

普通按钮组

圆角按钮组

$widget=new Widget();
return $widget
       ->addButtongroup([['title'=>'1'],['title'=>'2'],['title'=>'3'],['title'=>'4']],'btn-group btn-corner')
       ->fetch();

圆角按钮组

其它各种样式参考ace1.4

验证码

方法:addCaptcha($name, $id = '', $title = '', $attr = [], $extra_attr_input = '', $extra_class_input = 'col-xs-10 col-sm-5', $extra_css_input = '', $extra_attr_img = '', $extra_class_img = 'col-xs-10 col-sm-3', $extra_css_img = 'cursor: pointer;border: 1px solid #d5d5d5;height:34px;margin-left:10px;')

标识符:captcha

参数 含义 类型
name 表单name string
id 验证码标识 string
title 表单标签 string
attr 属性 array
extra_attr_input input额外属性 string
extra_class_input input额外class string
extra_css_input input额外style string
extra_attr_img img额外属性 string
extra_class_img img额外class string
extra_css_img img额外style string

返回:Widget

$widget = new Widget();
return $widget
       ->addItem('captcha', 'verify','','验证码', [], 'required')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

验证码

复选框

方法:addCheckbox($name,$title,$options=[],$default='',$disabled =[],$attr=[],$extra_class='',$extra_attr='')

标识符:checkbox

参数 含义 类型
name 表单name string
title 表单标签 string
options 数据 array
default 默认值 string
disabled 禁用项 array
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
$options=['sh'=>'上海','gz'=>'广州','sz'=>'深圳','wh'=>'武汉'];
return $widget
       ->addCheckbox('city','城市选择',$options,'sh',['sz'])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

复选框

颜色选择框

方法:addColor($name,$title,$default='',$help_text='',$format='hex',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:color

参数 含义 类型
name 表单name string
title 表单标签 string
help_text 帮助文本 string
format 颜色格式 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
return $widget
       ->addColor('color1','选择颜色','','我是帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

颜色选择框

日期框

方法:addDate($name,$title,$default='',$help_text='',$format='yyyy-mm-dd',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:date

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
format 格式 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
return $widget
       ->addDate('date1','显示日期','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

日期框

日期区间

方法:addDaterange($name,$title,$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:daterange

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
return $widget
       ->addDaterange('date1','显示日期','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

日期期间

日期时间

方法:addDatetime($name,$title,$default='',$help_text='',$format='yyyy-mm-dd hh:ii:ss',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:datetime

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
format 格式 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
return $widget
       ->addDatetime('datetime1','日期时间','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

日期时间

单文件上传

方法:addFile($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:file

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
size 限制大小(单位kb) int 0
save_original 保存原文件名,0=否 1=是 int 0
save_filename 指定文件名,save_original=0时生效 string ''
ext 限制后缀 string ''
url 上传路径 string ''
$widget=new Widget();
return $widget
       ->addFile('name1','单文件','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

单文件

多文件上传

方法:addFiles($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:files

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
size 限制大小(单位kb) int 0
save_original 保存原文件名,0=否 1=是 int 0
ext 限制后缀 string ''
url 上传路径 string ''
$widget=new Widget();
return $widget
       ->addFiles('name1','多文件','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多文件

tab分组

方法:addGroup($groups=[],$id='',$position='',$color='',$tab_space=0,$tab_padding=0,$content_padding=0,$content_noborder=false)

标识符:group

参数 含义 类型
groups 分组数据,每个元素如下结构 array
id 分组id string
position tab位置,如tabs-below tabs-left tabs-right string
color tab的颜色,如blue string
tab_space tab的间距 0-4 int
tab_padding tab的左间距 0 2 4 ...32 int
content_padding 内容的内间距 0 2 4 ...32 int
content_noborder 内容的边框 bool

返回:Widget

groups每个元素数组结构如下

含义 类型 是否必要
title tab标题 string Y
href 跳转url string N
items 表单项,结构如下 array Y
is_active 是否激活 bool N
form_url 单个tab表单提交url string N
form_class tab表单样式 string N
form_name tab表单name string N
attr_left tab标题左 string N
attr_right tab标题右 string N
dropdown 下拉tabs,结构如下 array N
html 其它附加html string N

items每个元素数组结构如下

第一个参数是表单项的标识符,其他为该表单项的参数,参数顺序与标识符所代表的表单项参数顺序一致。比如下面的标识符是text,那么标识该表单项为单行文本框,参数顺序要按单行文本框的写。

['text','site_name','站点名称',isset($sys['site_name'])?$sys['site_name']:'',' *','required'],

dropdown每个元素结构如下

含义 类型 是否必要
title tab标题 string Y
href 跳转url string N
items 表单项,结构如上 array Y
is_active 是否激活 bool N
html 其它附加html string N

例如:站点设置代码如下

        //主题get
        $tpls=get_themes();
        $sys=OptionsModel::getOptions('base',$this->lang);
        $widget=new Widget();
        return $widget
            ->addGroup(
                [
                    //基本设置
                    [
                        'title'=>'基本设置',
                        'href'=>'',
                        'items'=>[
                            ['text','site_name','站点名称',isset($sys['site_name'])?$sys['site_name']:'',' *','required'],
                            ['text','site_host','站点网址',isset($sys['site_host'])?$sys['site_host']:'',' *','required'],
                            ['select','site_tpl','站点主题(PC)',$tpls,$sys['site_tpl'],' *', 'required',['default'=>'']],
                            ['select','site_tpl_m','站点主题(手机)',$tpls,$sys['site_tpl_m'],' *','required',['default'=>'']],
                            ['image','site_logo','网站logo',$sys['site_logo']],
                            ['text','site_icp','备案信息',$sys['site_icp']],
                            ['textarea','site_tongji','统计代码',$sys['site_tongji'],'字数限制500','',['maxlength'=>500,'autosize'=>true]],
                            ['textarea','site_copyright','版权信息',$sys['site_copyright'],'字数限制150','',['maxlength'=>150,'autosize'=>true]],
                        ]
                    ],
                    //联系方式
                    [
                        'title'=>'联系方式',
                        'href'=>'',
                        'items'=>[
                            ['text','site_co_name','公司名称',$sys['site_co_name'],'获取map'],
                            ['text','site_address','公司地址',$sys['site_address'],'获取map'],
                            ['text','map_lat','地图lat',$sys['map_lat']],
                            ['text','map_lng','地图lng',$sys['map_lng']],
                            ['text','site_tel','联系电话',$sys['site_tel']],
                            ['text','site_admin_email','站长邮箱',$sys['site_admin_email'],'','','email'],
                            ['text','site_qq','站长QQ',$sys['site_qq'],'','','number']
                        ]
                    ],
                    //SEO设置
                    [
                        'title'=>'SEO设置',
                        'href'=>'',
                        'items'=>[
                            ['text','site_seo_title','首页SEO标题',$sys['site_seo_title']],
                            ['textarea','site_seo_keywords','首页SEO关键字',$sys['site_seo_keywords'],'字数限制100,多个关键字以英文 , 号隔开','',['maxlength'=>100,'autosize'=>true]],
                            ['textarea','site_seo_description','首页SEO描述',$sys['site_seo_description'],'字数限制200','',['maxlength'=>200,'autosize'=>true]]
                        ]
                    ]
                ]
            )
            ->setUrl(url('baseUpdate'))
            ->setAjax('ajaxForm-noJump')
            ->fetch();

tab分组

图标选择

方法:addIcon($name,$title,$default='0',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:icon

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

$widget=new Widget();
return $widget
       ->addicon('icon','图标','','只针对顶级栏目有效,例如:fa fa-tachometer')
       ->setUrl(url('ruleSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

图标选择

单图片上传

方法:addImage($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:image

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
size 限制大小(单位kb) int 0
save_original 保存原文件名,0=否 1=是 int 0
save_filename 指定文件名,save_original=0时生效 string ''
ext 限制后缀 string ''
url 上传路径 string ''
$widget=new Widget();
return $widget
       ->addImage('name1','单图片','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

单图片 单图片2

多图片上传

方法:addImages($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:images

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
size 限制大小(单位kb) int 0
save_original 保存原文件名,0=否 1=是 int 0
ext 限制后缀 string ''
url 上传路径 string ''
$widget=new Widget();
return $widget
       ->addImages('name1','多图片','',$help_text='帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多图片 多图片2

图片剪裁

方法:addJcrop($name='',$title='',$default='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:jcrop

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
id 表单项id string ''
$widget=new Widget();
return $widget
       ->addJcrop('name1','图片剪切')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

图片剪裁

多级联动

方法:addLinkage($title='',$data=[],$attr=[])

标识符:linkage

参数 含义 类型
title 表单标签 string
data 数据项 array
attr 属性 array

返回:Widget

data每个元素结构如下

属性 含义 类型 取值
name 表单项name string
title 表单标签 string ''
data 数组数据 array
url 通过url获取数据 string
id 表单项id string
value 表单项值 mixed ''
default 默认显示文本 string '请选择'
$widget=new Widget();
$data=[
        ['name'=>'province','data'=>['2'=>'北京','6'=>'广东'],'value'=>6],
        ['name'=>'city','url'=>url('Ajax/getRegion'),'default'=>'请选择'],
        ['name'=>'town','url'=>url('Ajax/getRegion'),'default'=>'请选择']
      ];
return $widget
       ->addLinkage('联动表单',$data)
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多级联动 多级联动2 多级联动3

格式文本

方法:addMask($name,$title,$default='',$help_text='',$format='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:mask

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
format 文本格式 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
placeholder 预设值 string ''
disabled 是否禁止 bool false
tips 提示 string ''
icon 图标['left'=>'','right'=>''] array []
addon_icon 图标组['left'=>'','right'=>''] array []
$widget=new Widget();
return $widget
       ->addMask('name1','mask表单','','','9999/99/99')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

格式文本

单选表单

方法:addRadio($name,$title,$options=[],$default='',$disabled=[],$attr=[],$extra_class='',$extra_attr='')

标识符:radio

参数 含义 类型
name 表单name string
title 表单标签 string
options 数据数组 array
default 默认值 string
disabled 禁用数组 array
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
size 大小'sm'、'lg' string 'sm'
$widget=new Widget();
return $widget
       ->addRadio('name','城市:',['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'],'sz',['sh'])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

单选表单

范围

方法:addRange($name,$title,$default='0',$help_text='',$attr=[],$extra_class='',$extra_attr='')

标识符:range

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
tips 提示 string ''
data_type 类型 string 'single'
... 详见rangeSlider ... ...
$widget=new Widget();
return $widget
       ->addRange('name1','年龄:','20','',['tips'=>'范围','data_min'=>18,'data_max'=>40])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

范围

单选下拉框

方法:addSelect($name,$title,$options=[],$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:select

参数 含义 类型
name 表单name string
title 表单标签 string
options 数据数组 array
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
title 显示title string ''
disabled 禁用 bool false
is_formgroup 是否formgroup
表格过滤时设置false
bool true
default 默认文本 string '请选择'
$widget=new Widget();
return $widget
       ->addSelect('city', '选择城市', ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'],'sz')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

单选下拉框

多选下拉框

方法:addSelects($name,$title,$options=[],$default='',$help_text='',$extra_attr='',$optgroups=[],$attr=[],$extra_class='')

标识符:selects

参数 含义 类型
name 表单name string
title 表单标签 string
options (普通情况下使用)
数据数组
每个元素结构如下
array
default 默认值 string
help_text 帮助文本 string
extra_attr 额外属性 string
attr 属性 array
optgroups (分组情况下使用)
分组
array
extra_class 额外样式 string

返回:Widget

options每个数组元素结构如下

  • 分隔线
属性 含义 类型 取值
divider 分隔线 string 'divider'
  • 其它
属性 含义 类型 取值
title 显示title string ''
value mixed
name 显示文本 string
class class样式 string ''
icon 图标 string ''
subtext 子文本 string ''
disabled 禁用 bool false

optgroups每个数组元素结构如下

(详见:bootstrap-select

属性 含义 类型 取值
label 分组标题 string
options 数据数组
每个元素结构如下
array
max 最大显示个数 string
disabled 禁用 bool false

optgroups里的options每个数组元素结构如下

属性 含义 类型 取值
divider 是否分隔线 bool false
title 显示title string ''
value mixed
name 显示文本 string
class class样式 string ''
icon 图标 string ''
subtext 子文本 string ''
disabled 禁用 bool false
  • 普通模式
$widget=new Widget();
$options=[
            ['value'=>'gz','name'=>'广州'],
            ['value'=>'sz','name'=>'深圳'],
            ['value'=>'sh','name'=>'上海']
        ];
return $widget
       ->addSelects('city', '选择城市', $options,'gz,sh')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多选下拉

  • 分组模式
$widget=new Widget();
$optgroups=[
             [
                'label'=>'广东',
                'options'=>[
                    ['value'=>'gz','name'=>'广州'],
                    ['value'=>'sz','name'=>'深圳'],
                    ['value'=>'dg','name'=>'东莞']
                ]
             ],
             [
                'label'=>'江西',
                'options'=>[
                    ['value'=>'nc','name'=>'南昌'],
                    ['value'=>'ja','name'=>'吉安'],
                    ['value'=>'jj','name'=>'九江']
                ]
             ]
        ];
return $widget
       ->addSelects('city', '选择城市', [],'gz,jj','','',$optgroups)
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多选下拉2

开关

方法:addSwitch($name,$title,$default='0',$extra_attr='',$attr=[],$extra_class='')

标识符:switch

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
extra_attr 额外属性 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
style 类型 int 1-4
text 文字 array ['ON','OFF']
btn 按钮类型 string 'flat'
disabled 禁用 bool false
$widget=new Widget();
return $widget
       ->addSwitch('name1','开关')
       ->addSwitch('name2','是否审核',1,'',['text'=>['是',' 否']])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

开关

表格

方法:addTable($fields,$pk='id',$datas=[],$right_actions=[],$page='',$order=false,$delall=false,ajax=false)

标识符:table

参数 含义 类型
fields 字段 array
pk 主键字段 string
datas 数据 array
right_actions 右侧操作按钮 array
page 分页页码 string
order 排序url/false string/bool
delall 全删url/false string/bool
ajax 是否ajax bool

返回:Widget

fields数组元素结构如下

属性 含义 类型 取值
title 标题 string
field 字段name string
class 列class样式 string
type 列数据类型
text,datetime,date,html
array,number,switch,input
string 'text'
default 默认值 string ''
array type为array时设置 array []
options type为switch时设置 array ['禁用','启用']
url type为switch时设置 string ''

right_actions数组元素结构如下

'键名'=>[]或url;

  • 键名为'edit','delete'为系统默认按钮,'edit'键值可以为string或array型;'delete'键值只能string。当键值为string时,表示该操作的url地址 例如: 'edit'=>url('edit')
  • 其余为自定义按钮,键值需为array型

键名为edit,键值为array时,结构如下

属性 含义 类型 取值
is_pop 是否弹窗形式 bool true
href 操作url string ''

键名为delete,键值只能为string型,表示操作url

键名为自定义,键值为array时,结构如下

  • 含有条件时
属性 含义 类型 取值
condition 按条件显示 array 如['status','=',1]
true 条件为真时 array 结构参考不含条件时的结构
false 条件为假时 array 结构参考不含条件时的结构
  • 不含条件时
属性 含义 类型 取值
is_pop 是否弹窗形式 bool true
class 样式 string ''
href 操作url string ''
field 字段name string
title 显示文字 string ''
target 打开方式 string '_self'
extra_attr 额外属性 string ''
icon 图标 string ''
        //表格字段
        $fields=[
            ['title'=>'ID','field'=>'id'],
            ['title'=>'留言人名','field'=>'name'],
            ['title'=>'留言邮箱','field'=>'email'],
            ['title'=>'留言内容','field'=>'content'],
            ['title'=>'留言时间','field'=>'create_time','type'=>'date']
        ];
        //主键
        $pk='id';
        $delall=url('guestbookAlldel');
        $list=$this->model->order('status,create_time desc')->paginate(config('paginate.list_rows'));
        $page=$list->render();
        $page=preg_replace("(]*page[=|/](\d+).+?>(.+?)<\/a>)","$2",$page);
        $data=$list->items();
        foreach ($data as &$value){
            $value['reply_href']=url('guestbookReply',['id'=>$value['id']]);
        }
        //右侧操作按钮
        $right_action=[
            'reply'=>[
                'condition'=>['status','=',1],
                'true'=>['field'=>'reply_href','title'=>'回复','icon'=>'ace-icon fa fa-envelope-o bigger-130','class'=>'green','is_pop'=>1],
                'false'=>['field'=>'reply_href','title'=>'回复','icon'=>'ace-icon fa fa-envelope bigger-130','class'=>'red','is_pop'=>1]
            ],
            'delete'=>url('guestbookDel')
        ];
        //实例化表单类
        $widget=new Widget();
        if(request()->isAjax()){
            return $widget
                ->form('table',$fields,$pk,$data,$right_action,$page,'',$delall,1);
        }else{
            return $widget
                ->addtable($fields,$pk,$data,$right_action,$page,'',$delall)
                ->setButton()
                ->fetch();
        }

表格

tag标签

方法:addTag($name,$title,$data=[],$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:tag

参数 含义 类型
name 表单name string
title 表单标签 string
data 标签数据组 array
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
placeholder 预设值 string ''
disabled 是否禁止 bool false
tips 提示 string ''
$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

tag标签

单行文本框

方法:addText($name,$title,$default='',$help_text='',$extra_attr='',$type='text',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_css='')

标识符:text

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
extra_attr 额外属性 string
type 类型,默认text,参考html5 string
attr 属性 array
extra_class 额外样式 string
extra_css 额外css string

返回:Widget

attr参数如下

属性 含义 类型 取值
placeholder 预设值 string ''
disabled 是否禁止 bool false
tips 提示 string ''
icon 图标,前后图标只能1个 array ['left'=>'','right'=>'']
addon_icon 图标组 array ['left'=>'','right'=>'']
is_formgroup 是否formgroup bool false
id 表单项id string ''
$widget=new Widget();
return $widget
       ->addText('name1','文本','','帮助文本','required','text',['icon'=>['right'=>'','left'=>'ace-icon fa fa-leaf blue']])
       ->addText('name1','文本','','帮助文本','required','text',['icon'=>['left'=>'','right'=>'ace-icon fa fa-leaf red']])
       ->addText('name1','文本','','帮助文本','required','email',['addon_icon'=>['left'=>'ace-icon fa fa-envelope-o','right'=>'']])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

单行文本框

多行文本框

方法:addTextarea($name,$title,$default='',$help_text='',$extra_attr='',$attr=[],$extra_class='col-xs-10 col-sm-5')

标识符:textarea

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
extra_attr 额外属性 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

attr参数如下

属性 含义 类型 取值
placeholder 预设值 string ''
disabled 是否禁止 bool false
tips 提示 string ''
rows 初始行数 int 3
maxlength 最大字数 int 0为不限制
autosize 自动大小 bool false
$widget=new Widget();
return $widget
       ->addTextarea('name1','多行文本','','帮助文本','',['placeholder'=>'请输入您的意见','autosize'=>true,'maxlength'=>500])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

多行文本 多行文本2 多行文本3

时间框

方法:addTime($name,$title,$default='',$help_text='',$attr=[],$extra_class='col-xs-10 col-sm-5',$extra_attr='')

标识符:time

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string
extra_attr 额外属性 string

返回:Widget

attr参数如下

属性 含义 类型 取值
placeholder 预设值 string ''
disabled 是否禁止 bool false
tips 提示 string ''
$widget=new Widget();
return $widget
       ->addTime('name1','时间',date('H:i:s'),'帮助文本')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

时间框 时间框2

百度编辑器

方法:addUeditor($name='',$title='',$default='',$help_text='',$attr=[],$extra_class='col-xs-12')

标识符:ueditor

参数 含义 类型
name 表单name string
title 表单标签 string
default 默认值 string
help_text 帮助文本 string
attr 属性 array
extra_class 额外样式 string

返回:Widget

$widget=new Widget();
return $widget
       ->addUeditor('name','内容','','',[],$extra_class='col-xs-10')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

百度编辑框

表格顶部按钮及搜索

方法:addToparea($default=[],$custom=[],$items=[],$form=[])

参数 含义 类型
default 默认按钮 array
custom 自定义按钮 array
items 搜索表单项 array
form 搜索表单form array

返回:Widget

default参数如下

['add'=>[$href,$is_pop],'delete','disable','enable'] 可以是其中1个按钮或多个按钮,其中add按钮可以设置是否弹窗

custom数组元素结构,数见button,须为关联数组


## items数组元素结构 第一个参数是表单项的标识符,其他为该表单项的参数,参数顺序与标识符所代表的表单项参数顺序一致。比如下面的标识符是text,那么标识该表单项为单行文本框,参数顺序要按单行文本框的写。 > 注意:部分表单项attr有'is_formgroup'属性的需要设置为**false**

form参数

参数 含义 类型
href form的url string
class form的样式 string
id form的id string
    /**
     * 文章列表
     */
	public function newsIndex()
	{
		$keytype=input('keytype','title');
		$key=input('key','');
		$lang=input('lang','');
		$status=input('status','');
		$cid=input('cid','');
		$diyflag=input('diyflag','');
		//查询:时间格式过滤 获取格式 2015-11-12 - 2015-11-18
		$sldate=input('reservation','');
		$arr = explode(" - ",$sldate);
        $map=[];
        if(count($arr)==2){
            $arrdateone=strtotime($arr[0]);
            $arrdatetwo=strtotime($arr[1].' 23:55:55');
            $map[] =['a.create_time','between',[$arrdateone,$arrdatetwo]];
        }
		//map架构查询条件数组
		$map[]= ['is_back','=',0];
		if(!empty($key)){
			if($keytype=='title'){
				$map[]= ['a.title','like',"%".$key."%"];
			}elseif($keytype=='username'){
				$map[]= array('b.username','like',"%".$key."%");
			}else{
				$map[]= [$keytype,'=',$key];
			}
		}
		if ($status!=''){
			$map[]= array('a.status','=',$status);
		}
		if (!empty($lang)){
			$map[]= array('a.lang','=',$lang);
		}
        if(!config('lang_switch_on')){
            $map[]=['a.lang','=',$this->lang];
        }
		if ($cid){
			$ids=get_menu_byid($cid,1,2);
			$map[]= array('a.cid','in',implode(",", $ids));
		}
        if($diyflag){
		    $map[]=['','exp',Db::raw("FIND_IN_SET('$diyflag',flags)")];;
        }
		$news_model=new NewsModel;
		$news=$news_model->alias("a")->field('a.*,b.username,c.name')
				->join(config('database.prefix').'user b','a.author =b.id')
				->join(config('database.prefix').'menu c','a.cid =c.id')
				->where($map)->order('a.create_time desc')->paginate(config('paginate.list_rows'),false,['query'=>get_query()]);
        $page = $news->render();
        $page=preg_replace("(]*page[=|/](\d+).+?>(.+?)<\/a>)","$2",$page);
        $data=$news->items();
		//文章属性数据
        $common_model=new CommonModel();
        $diyflag_list=Cache::get('flags');
        if(!$diyflag_list){
            $diyflag_list=$common_model->setTable(config('database.prefix').'flags')->setPk('id')->column('name','value');
            Cache::set('flags',$diyflag_list);
        }
		//栏目数据
		$menu_text=menu_text($this->lang);
        //表格字段
        $fields=[
            ['title'=>'排序','field'=>'sort','type'=>'input'],
            ['title'=>'ID','field'=>'id'],
            ['title'=>'作者','field'=>'username'],
            ['title'=>'文章标题','field'=>'title'],
            ['title'=>'所属栏目','field'=>'name'],
            ['title'=>'状态','field'=>'status','type'=>'switch','url'=>url('newsState')],
            ['title'=>'发布时间','field'=>'create_time','type'=>'date']
        ];
        $pk='id';
        //右侧操作按钮
        $right_action=[
            'edit'=>['href'=>url('newsEdit'),'is_pop'=>1],
            'delete'=>url('newsDel')
        ];
        $order=url('newsOrder');
        $delall=url('newsAlldel');
        $search=[
            ['select','keytype','',['title'=>'按标题','author'=>'按发布人ID','username'=>'按发布人名'],$keytype,'','',['is_formgroup'=>false],'class'=>''],
            ['select','cid','',$menu_text,$cid,'','',['is_formgroup'=>false,'default'=>'按栏目'],'class'=>'ajax_change'],
            ['select','lang','',['zh-cn'=>'中文','en-us'=>'英语'],$lang,'','',['is_formgroup'=>false,'default'=>'按语言'],'ajax_change'],
            ['select','diyflag','',$diyflag_list,$diyflag,'','',['is_formgroup'=>false,'default'=>'按属性'],'ajax_change'],
            ['select','status','',['1'=>'已启用','0'=>'未启用'],$status,'','',['is_formgroup'=>false,'default'=>'按状态'],'ajax_change'],
            ['daterange','reservation','',$sldate,'',['is_formgroup'=>false,'placeholder'=>'点击选择日期范围'],'','height:30px;margin:auto 2px;'],
            ['text','key','',$key,'','','text',['placeholder'=>'输入需查询的关键字','is_formgroup'=>false],'search-query'],
            ['button','搜索',['class'=>'btn btn-purple btn-sm search-query ajax-search-form','type'=>'submit','icon_l'=>'ace-icon fa fa-search icon-on-right bigger-110']]
        ];
        $form=[
            'href'=>url('newsIndex'),
            'class'=>'form-search',
            'id'=>'list-filter'
        ];
        //实例化表单类
        $widget=new Widget();
		if(request()->isAjax()){
            return $widget
                ->form('table',$fields,$pk,$data,$right_action,$page,$order,$delall,1);
		}else{
            return $widget
                ->addToparea(['add'=>['href'=>url('newsAdd'),'is_pop'=>1]],[],$search,$form)
                ->addtable($fields,$pk,$data,$right_action,$page,$order,$delall)
                ->setButton()
                ->fetch();
		}

顶部按钮及搜索

取单个表单项文本

方法:form($name,...)

参数 含义 类型
name 表单项标识 string

其它参数按照每个表单项参数顺序提供

返回:html文本

//实例化表单类,完整代码参考News/newsIndex
$widget=new Widget();
if(request()->isAjax()){
    return $widget
           ->form('table',$fields,$pk,$data,$right_action,$page,$order,$delall,1);
}else{
    return $widget
           ->addToparea(['add'=>['href'=>url('newsAdd'),'is_pop'=>1]],[],$search,$form)
           ->addtable($fields,$pk,$data,$right_action,$page,$order,$delall)
           ->setButton()
           ->fetch();
}

代码中,当ajax时,只需要返回html代码即可

添加表单项

方法:addItem($type,...)

参数 含义 类型
type 表单项标识 string

其它参数按照每个表单项参数顺序提供

返回:Widget

$widget=new Widget();
return $widget
       ->addItem('ueditor','name','内容','','',[],$extra_class='col-xs-10')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

等同于

$widget=new Widget();
return $widget
       ->addUeditor('name','内容','','',[],$extra_class='col-xs-10')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

批量添加表单项

方法:addItems($items=[], $formdata = [])

参数 含义 类型
items 表单项数组 array
formdata 表单项数据 array

每个数组元素结构[$type,...]

返回:Widget

$widget=new Widget();
$items=[
         ['text','title','文章标题','','','required','text',['placeholder'=>'必填:文章标题']],
         ['text','stitle','短标题','','','required','text',['placeholder'=>'短标题']]
       ];
return $widget
       ->addItems($items)
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

等同于

$widget=new Widget();
return $widget
       ->addItem('text','title','文章标题','','','required','text',['placeholder'=>'必填:文章标题'])
       ->addItem('text','stitle','短标题','','','required','text',['placeholder'=>'短标题'])
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

批量添加表单项

可以通过传递表单项数据数组,一般用于插件或模块配置,插件或模块的表单项为items数组,而数据通常保存在数据库中.

例如模块模型中,定义配置设置表单:

public function moduleConfig($url)
{
    $module = request()->module();
    $module_info = self::getInfoFromFile($module);
    $items       = $module_info['config'];
    $trigger     = isset($module_info['trigger']) ? $module_info['trigger'] : [];
    // 数据库保存的配置
    $config = self::where('name', $module)->value('config');
    $config = json_decode($config, true);
    // 构造器创建表单
    $widget = new Widget();
    return $widget
        ->addItems($items, $config)
        ->setTrigger($trigger)
        ->setUrl($url)
        ->setAjax('ajaxForm-noJump')
        ->fetch();
}

在实际模块控制器中,可以直接调用模块模型的配置表单方法:

public function cmsAdmin()
{
    $model = new Module();
    if (request()->isAjax()) {
        $data = $this->request->post();
        $data = json_encode($data);
        if (false !== $model->where('name', 'cms')->update(['config' => $data])) {
            cache('module_config_cms', null);
            $this->success('更新成功', 'categoryIndex', ['is_frame' => 1]);
        } else {
            $this->error('更新失败');
        }
    } else {
        return $model->moduleConfig(url('cmsAdmin'));
    }
}

模块配置文件中的config表单项如下:

'config' => [
    ['text', 'appid', 'AppId', '', '应用ID,登录 微信公众平台 查看'],
    ['text', 'secret', 'AppSecret', '', '应用密钥,登录 微信公众平台 查看'],
    ['text', 'token', 'Token', '', '令牌,用于接口验证,登录 微信公众平台,在【基本配置】中设置'],
    ['text', 'aeskey', 'EncodingAESKey', '', '消息加解密密钥,登录 微信公众平台,在【基本配置】中设置'],
]

调用cmsAdmin控制器方法后,直接创建出配置表单项:

设置表单page-header

方法:setHeader($header=[])

header=['一级标题','二级标题',是否显示刷新本页]

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setHeader(['帮助中心','表单测试',1])
       ->setAjax('ajaxForm-noJump')
       ->fetch();

page-header

提示框

方法:setAlert($alert=[])

alert参数

参数 含义 类型
alert_class alert的class
可以是alert-danger,alert-warning,alert-success,alert-info
string
alert_html 提示内容,可以是html string

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setAlert(['alert_class'=>'alert-warning','alert_html'=>'提示内容'])
       ->setAjax('ajaxForm-noJump')
       ->fetch();

alert

设置渲染模板

方法:setTemplate($template='')

默认:app/common/widget/form/layout_content.html(不含头部 尾部 左侧菜单)

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setTemplate(Env::get('app_path').'common/widget/form/layout.html')
       ->setAjax('ajaxForm-noJump')
       ->fetch();

//以上代码指定渲染模板为带头尾 左侧菜单的基模板 模板

设置表单提交url

方法:setUrl($url='')

注意:如果不设置或设置url为空,则表示不使用form表单提交

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->fetch();

设置url

设置form的按钮

方法:setButton($buttons=[])

注意:默认是含确认 重置按钮,如果需要自定义按钮,可以通过此方法设置 每个数组元素的结构参考button

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
       ->setButton([
                ['提交',['class'=>'btn btn-info','type'=>'submit','icon_l'=>'ace-icon fa fa-check bigger-110']],
                ['重置',['class'=>'btn','type'=>'reset','icon_l'=>'ace-icon fa fa-undo bigger-110']],
                ['返回',['class'=>'btn','type'=>'back','icon_l'=>'ace-icon fa fa-undo bigger-110',]]
            ])
        ->fetch();

form按钮

设置ajax提交

方法:setAjax($ajax_class='ajaxForm')

注意:默认是普通提交,可以通过此方法设置ajax提交

  • "ajaxForm" 失败跳转,不检查表单
  • "ajaxForm-noJump" 失败不跳转 不检查表单
  • "ajaxForm-hasVerify" 失败不跳转 验证码表单
  • "ajaxForm-allDel" 多选删除 检查是否选择
  • "ajaxForm-checkForm" 失败跳转,检查表单

返回:Widget

$widget=new Widget();
return $widget
       ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
       ->setUrl(url('newsSave'))
       ->setAjax('ajaxForm-noJump')
        ->fetch();

设置触发器

方法:setTrigger($trigger = '', $values = '', $show = '', $clear = true)

参数 含义 类型
trigger 触发表单项 array/string
values 触发表单为此值时触发 string
show 要显示的表单项 string
clear 是否清除值 bool

返回:Widget

$adtype_list=$this->adtype_model->order('sort')->column('name','id');//获取所有广告位
$widget=new Widget();
return $widget
       ->addSelect('adtypeid','广告位',$adtype_list)
       ->addSelect('lang','语言',[''=>'选择语言','zh-cn'=>'中文','en-us'=>'英语'])
       ->addText('name','广告名称','','','required','text',['placeholder'=>'输入广告名称'])
       ->addRadio('type','广告模式',['1'=>'图片模式','2'=>'JS代码'],1)
       ->addImage('img','广告图片')
       ->addTextarea('js','JS代码','','','',['placeholder'=>'输入JS代码'])
       ->addText('url','链接URL','','必须是以http(s)://开头','','text',['placeholder'=>'输入链接URL'])
       ->addSwitch('status','是否启用',0,'默认不启用')
       ->addText('sort','排序','50','* 从小到大排序','required','number')
       ->addTextarea('content','内容','','广告文字内容')
       ->setUrl(url('adSave'))
       ->setTrigger('type',"1",'img',false)
       ->setTrigger('type',"2",'js',false)
       ->setAjax()
       ->fetch();

触发器 触发器2

取构造器数据

方法:make()

返回:array,['html'=>$this->html,'js_list'=>$this->js_list,'css_list'=>$this->css_list,'attr_data'=>$this->data]

$widget=new Widget();
dump($widget
        ->addTag('name1','tag标签',['sz','sh','yfcmf'],$default='yfcmf')
        ->setUrl(url('newsSave'))
        ->setAjax('ajaxForm-noJump')
        ->make());

取构造器数据

添加额外js文件引用

方法:addJs($js)

参数 含义 类型
js js文件路径 string

返回:Widget

$widget = new Widget();
return $widget
    ->setUrl(url('newsSave'))
    ->setAjax('ajaxForm-noJump')
    ->addJs(__ROOT__ . '/public/bootstrap-timepicker/js/bootstrap-timepicker.min.js')
    ->fetch();

addJs

添加额外css文件引用

方法:addCss($css)

参数 含义 类型
css css文件路径 string

返回:Widget

$widget = new Widget();
return $widget
    ->setUrl(url('newsSave'))
    ->setAjax('ajaxForm-noJump')
    ->addCss(__ROOT__ . '/public/bootstrap-timepicker/css/bootstrap-timepicker.min.css')
    ->fetch();

addCss

添加额外js代码

方法:setExtraJs($extra_js = '')

参数 含义 类型
extra_js 额外的js代码 string

返回:Widget

$extra_js = '<script type="text/javascript">$(function () { alert("额外js代码"); });</script>';

$widget = new Widget();
return $widget
    ->setUrl(url('newsSave'))
    ->setAjax('ajaxForm-noJump')
    ->setExtraJs($extra_js)
    ->fetch();

额外js代码1 额外js代码2

添加额外css代码

方法:setExtraJs($extra_js = '')

参数 含义 类型
extra_js 额外的js代码 string

返回:Widget

$extra_css = '';
$widget = new Widget();
return $widget
    ->setUrl(url('newsSave'))
    ->setAjax('ajaxForm-noJump')
    ->setExtraCss($extra_css)
    ->fetch();

css代码1css代码2

插件开发

YFCMF可以自由快速开发各种插件,极大方便了开发者对系统进行扩展. 插件位于根目录下的addons文件夹。

addons [插件总目录]
├─info [插件目录,小写]
│  ├─config.php [插件参数配置文件]
│  ├─Info.php [插件入口文件]
│  ├─install.sql [数据库安装文件,可选]
│  ├─uninstall.sql [数据库卸载文件,可选]
│  │
│  ├─controller [插件控制器目录,可选]
│  │  └─Admin.php [插件控制器,可选]
│  │
│  ├─model [插件模型目录,可选]
│  │
│  │
│  ├─validate [插件验证器目录,可选]
│  │
│  └─view [插件视图目录,可选]
│      │
│      ├─admin        [管理控制器视图目录]
│      ├─sysinfo.html [sysinfo视图]
│      └─gitinfo.html [gitinfo视图]
│

插件目录

addons [插件总目录]
├─info [插件目录,小写]
│  ├─config.php [插件参数配置文件]
│  ├─Info.php [插件入口文件]
│  ├─install.sql [数据库安装文件,可选]
│  ├─uninstall.sql [数据库卸载文件,可选]
│  │
│  ├─controller [插件控制器目录,可选]
│  │  └─Admin.php [插件控制器,可选]
│  │
│  ├─model [插件模型目录,可选]
│  │
│  │
│  ├─validate [插件验证器目录,可选]
│  │
│  └─view [插件视图目录,可选]
│      │
│      ├─admin        [管理控制器视图目录]
│      ├─sysinfo.html [sysinfo视图]
│      └─gitinfo.html [gitinfo视图]
│

插件入口文件

插件入口文件

每个插件都有一个入口文件,命名方式为插件名称.php,这里以HelloWorld为例。

插件目录

在addons目录下建立一个新插件目录hello_world,再新建一个HelloWorld.php的入口文件。

目录名以小写字母和下划线命名 入口文件使用驼峰法命名(首字母大写)

addons
├─hello_world
│  │  HelloWorld.php

插件入口文件

入口文件方法

插件有一个独立的顶级命名空间”addons“,所有插件入口文件必须继承\app\common\controller\Addons,并且必须实现两个方法:install()和uninstall()。

比如:


namespace addons\hello_world;
use app\common\controller\Addons;

/**
 * 演示插件
 */
class HelloWorld extends Addons
{
    /**
     * 安装方法必须实现
     */
    public function install(){
        return true;
    }

    /**
     * 卸载方法必须实现
     */
    public function uninstall(){
        return true;
    }
}

入口文件属性

/**
* @var array 插件基本信息
*/
public $info

/**
* @var string 原数据库表前缀
* 用于在导入插件sql时,将原有的表前缀转换成系统的表前缀
* 一般插件自带sql文件时才需要配置
*/
public $database_prefix

/**
* @var array 插件钩子
*/
public $hooks

/**
* @var array 插件管理方法,格式:['控制器/操作方法',[参数数组]])
*/
public $admin_actions

1、需要定义插件的相关信息$info参数。 2、如果开启后台管理功能,需要配置$admin_actions,也就是说

当$info['admin']=1的时候需要配置$admin_actions

示例

namespace addons\hello_world;
use app\common\controller\Addons;

/**
 * 演示插件
 */
class HelloWorld extends Addons
{
	/**
	* @var array 插件信息
	*/
	public $info = [
		//插件名[必填,不可重复]
		'name'        => 'HelloWorld',
		//插件标题[必填]
		'title'       => 'HelloWorld',
		//插件介绍
		'intro'       => 'HelloWorld',
		//插件描述[必填]
		'description' => 'HelloWorld',
		//插件状态[选填],1为默认开启状态,0默认禁用状态
		'status'      => 1,
		//插件作者[必填]
		'author'      => 'yfcmf',
		//插件版本[必填],格式采用三段式:主版本号.次版本号.修订版本号
		'version'     => '1.0.0',
		//是否有后台管理功能[必填]
		'admin'       => '1',
	];

	/**
	* @var array 插件管理方法,格式:['控制器/操作方法',[参数数组]])
	*/
	public $admin_actions = [
		'index'  => ['Admin/securityList'],//管理首页
		'config' => [],//设置页
		'edit'   => [],//编辑页
		'add'    => [],//增加页
	];

	/**
	* @var array 插件钩子
	*/
	public $hooks = [
		// 钩子名称 => 钩子说明
		'sysinfo' => '框架信息钩子'
	];

	/**
	* 安装方法必须实现
	*/
	public function install(){
		return true;
	}

	/**
	* 卸载方法必须实现
	*/
	public function uninstall(){
		return true;
	}
}

定义好之后,就可以进入后台->系统->扩展管理->插件管理,进行安装了。

插件配置信息

#插件配置信息 在插件目录下,建立config.php文件,可以定义插件的配置信息,比如对于短信插件,appid等配置信息就可以放在这里。

config.php文件直接返回一个数组,内容格式和Widget添加表单项addItem的格式一样。

比如:

return [
    ['radio', 'status', '单选', '', ['1' => '开启', '0' => '关闭'], 1],
    ['text', 'username', '用户名', '提示', 'x'],
    ['textarea', 'summary', '多行文本', '提示'],
    ['group',
        [
            '分组1' => [
                ['radio', 'status1', '单选', '', ['1' => '开启', '0' => '关闭'], 1],
                ['text', 'text1', '单行文本', '提示', 'x'],
                ['textarea', 'textarea1', '多行文本', '提示'],
                ['checkbox', 'checkbox1', '多选', '提示', ['1' => '是', '0' => '否'], 0],
            ],
            '分组2' => [
                ['textarea', 'textarea2', '多行文本', '提示'],
                ['checkbox', 'checkbox2', '多选', '提示', ['1' => '是', '0' => '否'], 0],
            ]
        ]
    ]
];

注意:此处的配置信息是插件安装时的默认配置

后台修改插件配置

1、添加后台配置网址

    /**
     * @var array 插件管理方法,格式:['控制器/操作方法',[参数数组]])
     */
    public $admin_actions = [
        'index'  => [],//管理首页
        'config' => ['Admin/config'],//设置页
        'edit'   => [],//编辑页
        'add'    => [],//增加页
    ];

2、添加后台配置控制器和方法

示例路径 addons/hello_world/controller/Admin.php

示例代码

namespace addons\hello_world\controller;

use app\common\controller\Base;
use app\common\model\Addon as AddonModel;
use app\common\widget\Widget;

class Admin extends Base
{
    protected function initialize()
    {
        //调用admin/Base控制器的初始化
        action('admin/Base/initialize');
    }

    /*
     * 设置
     * @return mixed
     */
    public function config()
    {
        $model = new AddonModel;
        if (request()->isAjax()) {
            $display = input('display', 0, 'intval');
            $rst     = $model->setConfig('info.display', $display);
            if ($rst) {
                $this->success('更新设置成功', 'admin/Addons/addonsIndex', ['is_frame' => 1]);
            } else {
                $this->error('更新设置失败', 'admin/Addons/addonsIndex', ['is_frame' => 1]);
            }
        } else {
            $config = $this->getConfig('info');
            $widget = new Widget();
            return $widget
                ->addItems([['radio', 'display', '是否显示', ['1' => '显示', '0' => '不显示'], isset($config['display']) ? $config['display'] : 1]])
                ->setUrl(addon_url('info://Admin/config'))
                ->setAjax('ajaxForm-noJump')
                ->fetch();
        }
    }
}

插件安装和卸载

插件安装和卸载

安装和卸载系统会调用如下方法:

    /**
     * 插件安装方法
     * @return bool
     */
    public function install()
    {
        return true;
    }

    /**
     * 插件卸载方法
     * @return bool
     */
    public function uninstall()
    {
        return true;
    }

如果你的插件需要数据库支持,可以在插件目录下放置install.sql文件,插件在安装的时候,会去执行该文件。

该文件可以利用phpmyadmin等工具导出。

如果插件目录下有uninstall.sql文件,则系统会在卸载插件的时候执行该文件。

模型

插件模型

插件的模型文件放在插件目录下的model文件夹下,模型命名规范请参考ThinkPHP5.0文档。

模型的用法和ThinkPHP5.1是一样的。

验证器

验证器

插件的验证器文件放在插件目录下的validate文件夹下,命名规范以及用法请参考ThinkPHP5.1文档。

插件方法参考

插件方法参考

生成插件操作链接

addon_url(链接,参数,生成后缀,是否包含域名)

 /**
	 * 插件显示内容里生成访问插件的url
	*
	* @param             $url
	* @param array       $param
	*
	* @return bool|string
	*
	* @param bool|string $suffix 生成的URL后缀
	* @param bool|string $domain 域名
	*/
	function addon_url($url, $param = [], $suffix = true, $domain = false)

示例

addon_url('nav://Admin/config')

带参数

addon_url('nav://Admin/config', ['name' => 'molly', 'age' => 12]);

模块开发

作为复杂一些的系统,可能涉及很多应用模块,比如home模块 Api模块 admin模块 user模块...,通过简单的模块开发,可以将复杂的业务拆分为多个模块,极大缩短团队开发时间和减少成本. 模块都是放置于app应用模块目录 除了YFCMF自带的模块外,基本的模块开发结构如下:

app [应用模块目录]
├─user [模块目录,小写]
│  ├─info.php [模块信息]
│  ├─menues.php [模块菜单文件(后台)]
│  ├─install.sql [数据库安装文件,可选]
│  ├─uninstall.sql [数据库卸载文件,可选]
│  │
│  ├─controller [模块控制器目录,可选]
│  │  │
│  │  ├─AdminAuth.php [模块控制器]
│  │  ├─AdminRule.php [模块控制器]
│  │  └─AdminUser.php [模块控制器,为区分前台控制器,建议前缀Admin]
│  │
│  ├─model [插件模型目录,可选]
│  │  │
│  │  ├─Role.php [模块模型]
│  │  ├─RoleAccess.php [模块模型]
│  │  ├─RoleRule.php [模块模型]
│  │  └─User.php [模块模型]
│  │
│  ├─validate [模型验证器目录,可选]
│  │
│  └─view [模型视图目录,可选]
│  │  │
│  │  ├─admin        [管理控制器视图目录]
│  │  └─default [模块视图主题]
│  │      └─xxx.html [前台模板]
│  ├─public [模块静态资源,安装后会复制到根目录下"public/模块名"文件夹]
创建模块

首先在app目录下建立模块文件夹,比如建立helloworld文件夹,并在helloworld文件夹下建立info.php文件。

info.php文件只需返回一个数组,里面设置了模块相关信息,如:

/**
 * 模块信息
 */
return [
	// 模块名[必填]
	'name'        => 'helloworld',
	// 模块标题[必填]
	'title'       => '你好',
	// 开发者[必填]
	'author'      => 'yfcmf',
	// 版本[必填],格式采用三段式:主版本号.次版本号.修订版本号
	'version'     => '1.0.0',
	// 模块简介
	'intro' => '演示模块',
	//后台模块显示图标
	'icon'=>'fa fa-leaf',
	//后台同步默认页面
	'nav_url'=> 'helloworld/Admin/index',
	// 模块描述
	'description' => '演示模块',
	'need_addon' => [
    ],
	'need_module' => [
    ],
	'tables' => [
    ]
];

以上是模块的必填信息,还有其他相关信息将在下面的章节讲解。

建立好info.php文件之后,即可登陆后台“模块管理”安装模块了。

安装模块

安装模块

打开后台-系统->扩展管理->模块列表,点击“安装”进入模块安装页面。

模块配置

模块配置

参数 含义 类型 必填
name 模块名 string 必填
title 模块标题 string 必填
author 作者 string 必填
version 版本【1.0.0】 string 必填
intro 模块简介 string 选填
icon 后台顶部模块图标 string 选填
nav_url 后台模块首页 string 必填
description 模块描述 string 选填
need_addon 前置插件 array 选填
need_module 前置模块 array 选填
tables 模块数据表 array 选填
database_prefix 模块数据表前缀 string 选填
config 模块配置信息 array 选填
控制器

控制器

前台控制器

写法参考ThinkPHP5.1。

后台控制器

继承app\admin\controller\Base。 示例: 文件 app/helloworld/controller/Admin.php

namespace app\helloworld\controller;
use app\admin\controller\Base;
class Admin extends Base
创建菜单

创建后台菜单

菜单需要在模块目录下的menus.php中配置。 示例 文件app/helloworld/menus.php

return [

    ['name'=>'helloworld/Admin/index','title'=>'后台首页','sort'=>10],
    ['name'=>'helloworld/Joinus/list','title'=>'加入我们','sort'=>10],

    ['name'=>'helloworld/Wecaht/default','title'=>'微信管理','sort'=>10,'child'=>[
        ['name'=>'helloworld/Wecaht/config','title'=>'微信配置','sort'=>10],
        ['name'=>'helloworld/Wecaht/menu','title'=>'微信菜单','sort'=>10],
    ]],
];

参数说明:

参数 含义 类型 必填
name 路径 string 必填
title 菜单标题 string 必填
icon 菜单图标 string 选填
child 子菜单 array 选填
sort 排序 int 选填
display 是否显示【0或1】 int 选填
status 状态启用或禁止【0或1】 int 选填
notcheck 是否检测 【0或1】 int 选填
控制器demo

app\helloworld\controller\Admin.php

namespace app\helloworld\controller;
use app\admin\controller\Base;
use app\common\widget\Widget;

class Admin extends Base
{
    public function index()
    {
       return (new Widget())
           ->addText('name','姓名','','请输入姓名')
           ->setTemplate(env('app_path') . 'common/widget/form/layout.html')
           ->setUrl(url('indexSave'))
           ->setAjax('ajaxForm-noJump')
           ->fetch();
    }
}

app\helloworld\info.php

/**
 * 模块信息
 */
return [
    // 模块名[必填]
    'name'        => 'helloworld',
    // 模块标题[必填]
    'title'       => '你好',
    // 开发者[必填]
    'author'      => 'yfcmf',
    // 版本[必填],格式采用三段式:主版本号.次版本号.修订版本号
    'version'     => '1.0.0',
    // 模块简介
    'intro' => '演示模块',
    //后台模块显示图标
    'icon'=>'fa fa-leaf',
    //后台同步默认页面
    'nav_url'=> 'helloworld/Admin/index',
    // 模块描述
    'description' => '演示模块',
    'need_addon' => [
    ],
    'need_module' => [
    ],
    'tables' => [
    ]
];
模块参数配置
方法参考
后台模块
前台模块
后台视图
模块插件市场安装说明

模块插件市场安装说明

  1. 官网注册账号;
  2. 在市场上购买插件;
  3. 在个人中心->个人资料->密钥设置 填写授权域名:顶级域名,不需要添加http:// ;生成安装密钥
  4. 在项目中配置密钥 文件所在位置:config/yfcmf.php 找到:
 'api_addon' => 
      array (
      'url' => 'http://api.yfcmf.net'
  ),

修改成

'api_addon' => 
      array (
      'uid' => 你的UID,
      'token' => '你的密钥',
      'url' => 'http://api.yfcmf.net',
  ),
  1. 在后台->系统->插件市场 下载安装插件
API开发
针对PC控制器书写
针对APP控制器书写
常用函数封装
安全
上传安全
目录安全

上传文件目录data/upload(其它目录同理) 为了防止传入php文件并被执行,可以设置该目录禁止访问php文件

Apache

Nginx

  1. 在配置里设置,注意在引用php配置之前设置

    location ~ ^/data/upload/.*.(php|php5)?$ { denydeny all; } } 需要写在location ~ \.php(.*)$ {之前,如:

		location ~ ^/data/upload/.*.(php|php5)?$ {
			deny all;
		}
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
  1. BT宝塔系统里设置方法,注意在引用php配置之前设置

IIS

1. iis6.0设置相关目录禁止执行脚本方法

第1步:远程连接到Windows服务器,在我的电脑图标上右键选择管理,在打开的计算机管理程序左侧找到Internet信息服务管理器并单击打开。 电脑互助网注:或是直接打开Windows控制面板,并在打开的控制面板中找到管理工具下的“Internet信息服务”,双击即可打开。

第2步:找到自己需要设置网站的相关目录(如uploads目录),在此目录中右键选择属性,在属性窗口目录选项卡中的“执行权限”中设置成无并确定即可生效。

第3步:此时在uploads目录中所有有执行权限的文件均无法执行了。

2. iis7.0设置相关目录禁止执行脚本方法

第1步:类似IIS6.0同样的方法打开iis,在网站目录中找到需要禁止执行的目录并选中,然后双击控制面板中的“处理程序映射”。

第2步:在右侧找到并单击“编辑功能权限”此项,在打开的编辑功能权限小窗口中,把“脚本”前面的勾去掉并确定。

第3步:完成之后,在网站相关目录设置的有关php的可执行文件均无法再执行了。

输入安全