RPCMS 帮助文档 V3.4+

关于RPCMS

一个轻量型内容管理/博客系统,自由方便,灵活度高

RPCMS是一款基于PHP+MYSQL的轻量型内容管理/博客系统,支持PHP5.6版本以上,支持win/Linux系统。
使用自研RP框架(OPP方式),采用MVC架构搭建的高效、稳定的内容管理系统。
灵活小巧,有着强大的扩展性、丰富的插件接口和大量的模板。
统一采用模板标签,轻松上手,让开发更方便!智能缓存机制让网站运行方面大幅度提高。

查看安装教程 查看使用教程

下载安装

环境要求

PHP:5.6+
数据库:Mysql5.6+

下载地址

更新日志详情:https://www.rpcms.cn/post/2.html

伪静态

  • Apache:
    <IfModule mod_rewrite.c>
    Options +FollowSymlinks -Multiviews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
    </IfModule>
  • Nginx:
    location / {
    	if (!-e $request_filename){
    		rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    	}
    }
    

安装

将下载的程序代码解压,并上传到你的网站根目录,然后在浏览器地址栏输入你绑定的网址,会自动跳转到安装页面:http://你的域名/install/(如果没有跳转,可手动输入网址)
在安装界面根据提示操作,输入数据库、管理员等信息后,程序会自动安装。
查看详细安装教程

升级

登录你的网站后台,打开后台的首页,点击[检测更新],程序会自动对本地系统文件进行校验。
当有文件需要升级/更新时,会在列表中显示,你可以选择更新或全部更新。

配置管理

配置文件

正确安装好rpcms后,会在根目录/setting/config/default.php生成默认配置文件,记录数据库等信息。进行数据库更换等操作时,需要手动编辑此文件来完成操作。

路由配置

系统默认有index应用的路由文件,在根目录/setting/route/index.php,你可以通过编辑此文件来更改路由规则。或通过[自定义路由规则]插件来完成。

路由规则

在V2.0版本中,优化了路由功能,可以自定义路由规则来实现个性化URL。

所有应用都支持自定义路由,其他应用若实现自定义路由可参考/setting/route/index.php文件。

规则写法

return [
	[
		'model'=>'/index/logs/detail',
		'pattern'=>'post/<id><page#_?>',
	],
	[
		'model'=>'/index/logs/dates',
		'pattern'=>'date/<date><page#_?>',
		'replace'=>['date'=>'\d{6,8}'],
		'ext'=>'php|html'
	],
];
  • model:模块路径,格式:应用/控制器/方法
  • pattern:自定义的路由规则
  • replace:变量规则
  • ext:后缀名,支持多个,未配置则默认html。(V2.5.4)

路由规则介绍

<变量名称#分割符号>,如果变量是可选变量,在后面加入英文的问号即可,如:<变量名称#分割符号?>

关于分割符号

变量分割符支持的符号有:@ ~ . , \ | _ -
斜线分隔符请用反斜线代替。
在使用分割符号的时候,要避免和别名中的符号重复(特别是index应用)
如:分类的别名为:cate_name,那么对应的路由规则中变量分隔符号就不能用 _ ,否则会造成冲突,导致数据错误。

如果变量为可选变量,且前面有其他变量,那么就必须要有分割符号,如:

1、post/<id>
此处为URL间隔符号,id变量的分隔符号可选

2、post/<id><page#_?>
page变量可选,但page变量前有id变量,那么page变量中就必须定义分割符号

关于变量规则

可以为指定变量定义指定的验证规则(正则表达式)。其中,当变量名为:page,会使用内置(\d+)规则,其他若无指定规则则使用([A-Za-z0-9-]+)

如何获取变量值

当用户访问自定义的路由地址时,系统会自动解析并给相应类的构造函数传参param(array类型),可通过此参数获取,如:$this->param['id']

主题插件

你可以通过应用中心插件来获取主题或插件。获取应用前请先启用应用中心。

获取主题

你可以在[网站后台]→[插件]→[应用中心]→[模板]中获取需要的模板主题。
手动上传需将模板主题文件夹(压缩包请先解压)上传至系统模板文件夹中。

模板路径:根目录/templates/index/

启用主题

你可以在[网站后台]→[模板]中启用你安装的模板主题,如模板主题有设置功能,可以在此对模板进行设置。

获取插件

你可以在[网站后台]→[插件]→[应用中心]→[插件]中获取需要的插件。
手动上传需将插件文件夹(压缩包请先解压)上传至系统插件文件夹中。

插件路径:根目录/plugin/

启用插件

你可以在[网站后台]→[插件]中启用你安装的插件,如插件有设置功能,可以在此对插件进行设置等操作。

开发

目录结构

RPCMS部署目录
├─index.php         入口文件
├─data              数据
│  ├─cache          数据缓存
│  ├─defend         系统静态数据
│  ├─temp           模板缓存
│  └─...            更多其他缓存数据
├─plugin            插件目录
├─setting           设置目录
│  ├─config         配置目录
│  │ ├─default.php  默认配置
│  │ └─ ...         更多其他应用配置
│  └─route          路由目录
│    ├─index.php    默认index应用路由
│    └─ ...         更多其他应用路由
├─static            静态资源
├─system            系统目录
│  ├─admin          后台应用
│  ├─api            API应用
│  ├─index          前端应用
│  ├─install        安装系统应用(安装完成后可删除)
│  └─...            更多其他应用
├─templates         视图目录
│  ├─admin          后台视图
│  ├─index          index应用视图(模板主题安装在此目录中)
│  ├─install        安装系统应用视图
│  └─...            更多其他应用视图
└─uploads           附件目录

类说明

use使用,根空间 rp

名称 方法
App 主文件,可global $App 在局部使用  
Cache 缓存 ::read 获取
::update(name) 更新
Config 配置 ::set 设置配置
::get 获取配置
::has 检查配置是否存在
Db 数据库,链式操作
Hook 钩子 ::addHook(名称,执行方法(空间命名式)) 添加钩子
::deleHook(名称,执行方法(空间命名式)) 删除钩子
::doHook(名称) 执行钩子
::getHook(名称) 获取钩子
::saveHook 保存钩子缓存文件
::setHookNull 初始化清空钩子
Plugin 插件(开发插件可exend此类) ->setConfig 保存插件配置
->getConfig 获取插件配置
::ResetAllHook 重置插件钩子
Url 前台链接地址生成
View 视图 ::assign 模板赋值变量
::display 加载模板并显示

系统钩子介绍

前置钩子

钩子 名称 说明
cms_index_run 系统运行前置 可用于IP,地域拦截等
cms_index_begin 路由拦截 需return array,array格式参照/setting/route/index.php文件

系统后台钩子

钩子 名称 说明
admin_top_menu 插件按钮 位于顶部菜单
admin_left_menu 插件按钮 位于左侧菜单
admin_logs_submenu_hook 插件按钮 位于文章列表上方
admin_logs_edit_hook 文章扩展钩子 传参$data文章数据,位于文章编辑器上方
admin_logs_edit_hook2 文章扩展钩子2 传参$data文章数据,位于文章编辑器下方
admin_logs_edit_hook3 文章扩展钩子3 传参$data文章数据,位于文章发布按钮上方
admin_logs_post 文章新增、修改前置 传参$logId、$data和$oldData(V3.5.1)
admin_logs_save 文章新增、修改 传参$logId和$oldData(V3.0.0)
admin_logs_dele 文章删除 传参$ids,如:1,2,3
admin_logs_status 文章状态更改 传参$ids,如:1,2,3
admin_pages_submenu_hook 插件按钮 位于单页列表上方
admin_pages_edit_hook 单页扩展钩子 传参$data单页数据,位于单页编辑器上方
admin_pages_edit_hook2 单页扩展钩子2 传参$data单页数据,位于单页编辑器下方
admin_pages_edit_hook3 单页扩展钩子3 传参$data单页数据,位于单页发布按钮上方
admin_pages_save 单页新增、修改 传参$pageId,如:1
admin_pages_dele 单页删除 传参$ids,如:1,2,3
admin_comment_submenu_hook 插件按钮 位于评论列表上方
admin_attach_upload 附件上传 传参$filepath,如:D:/www/aaa.jpg
可用户图片加水印
comment_reply 回复评论 传参$data(回复的数据数组)
可用于邮件通知用户

系统前端钩子

钩子 名称 说明
comment_post 前台评论前置 在保存数据前使用
comment_save 前台评论后置 在保存数据后使用
index_header 头部扩展 用于存放公共css等
index_footer 底部扩展 用于存放公共mod,js等
index_search 内容搜索
index_logs_list 文章列表扩展 传参$data文章列表数组
index_logs_detail 文章/单页内容扩展 传参$data文章/单页数据
index_comment 评论扩展 (V1.9.4新增)可用于评论内容过滤、内容置换等
index_down 附件下载前置 可用于更新下载量,授权下载等

使用钩子

引入钩子:use rp\Hook;

添加钩子

Hook::addHook(名称,执行控制器::执行方法),如:

Hook::addHook('hookName', 'plugin\demo\index::action');

删除钩子

Hook::deleHook(名称,执行控制器::执行方法),如:

Hook::deleHook('hookName','plugin\demo\index::action');

执行钩子

Hook::doHook(名称, $areg, $isReturn),如:

/*
$args为钩子的传递参数(数组形式),$isReturn默认false,
当$args传递钩子的指定方法时,$isReturn可为钩子的传递参数,第四参数可为$isReturn。
当$isReturn为true时,如果hook拥有多个,那么除第一个外其他不会执行。
举例:
*/

//运行hookName钩子
$res=Hook::doHook('hookName');

//运行hookName钩子带参数,带上&表示引用参数
$args='this is args';
$res=Hook::doHook('hookName', array(&$args));

//运行hookName钩子带参数并返回
$args='this is args';
$res=Hook::doHook('hookName', array($args), true);

//运行hookName钩子的指定方法
$action='plugin\demo\index::action';
$res=Hook::doHook('hookName', $action);

//运行hookName钩子的指定方法并返回
$action='plugin\demo\index::action';
$res=Hook::doHook('hookName', $action, true);

//运行hookName钩子的指定方法并带参数
$action='plugin\demo\index::action';
$res=Hook::doHook('hookName', $action, array('this is args'));

//运行hookName钩子的指定方法带参数并返回
$action='plugin\demo\index::action';
$res=Hook::doHook('hookName', $action, array('this is args'), true);

/*
提示:
钩子是以数组形式返回执行结果,若同一个Hook有多个对应方法,则返回[res1,res2,res3,...],res是字符串还是其他形式取决于hook对应方法的返回数据。
如果hook只有一个对应方法,想获取执行结果,则使用$res[0]调用。
*/

获取钩子

Hook::getHook(名称)

判断钩子是否存在

Hook::hasHook(名称)

保存钩子缓存文件

Hook::saveHook()

初始化清空钩子

Hook::setHookNull()

视图介绍

引入视图:use rp\View;

赋值:

View::assign(name, value)

渲染:

View::display(文件名称)
///名称应用视图根目录读取,否则从应用视图目录/控制器目录下读取

视图判断:

View::checkTemp(文件名称)
//判断视图文件是否存在

缓存介绍

引入缓存:use rp\Cache;

设置自定义缓存(V2.5.5)

Cache::set(data, name, expire);
//此方法任何应用中都可以使用,更新自定义缓存同样调用此方法;读取缓存使用Cache::read()读取。
/*
*data:缓存的数据,支持字符串、数组。
*name:缓存名称
*expire:过期时间,单位秒,默认0,表示不过期。
*/

更新缓存

Cache::update(name);
//当name为空的时候,更新所有缓存(仅index应用)

获取缓存

Cache::read(name);

缓存类别

  • category:分类缓存
  • hook:钩子缓存
  • links:友链缓存
  • logRecord:文章归档缓存
  • nav:导航缓存
  • option:后台配置缓存
  • pages:单页缓存
  • tages:标签缓存
  • template:使用模板&模板配置缓存
  • waptemplate:手机端使用模板&模板配置缓存
  • total:统计缓存,文章/单页数量(总数量,草稿数量,待审数量,下架数量,发布数量),评论数量(总数量,待审数量,发布数量)
  • user:用户缓存
  • special:专题缓存

配置介绍

引入配置:use rp\Config;

设置配置:Config::set(name , value)

//value可以为字符串或数组或二维数组,如:
Config::set('name1', 'this is name1');
Config::set('name2', ['value1','value2']);
Config::set('name3', ['name3_1'=>'value3_1', 'name3_2'=>'value3_2']);
Config::set(['name4_1'=>'value4_1', 'name4_2'=>'value4_2']);

获取配置:Config::get(name),如:

Config::get('name1');
Config::get('name3.name3_1');
Config::get('name4_1');

获取网站后台[设置]中的配置

Config::get('webConfig.webName');

链接

引入URL:use rp\Url;

设置HTTP状态码

Url::setCode(code);

生成URL(后端推荐使用)

Url::setUrl('/index/log/index', [$data=array, $isDomain=boolean]);
或 url('/index/log/index', [$data=array, $isDomain=boolean]);

获取当前链接

Url::now([$isDomain=boolean, $isQuery=boolean]);

跳转链接

Url::redirect(str);

index应用链接地址:

文章URL:Url::logs(id, page);
分类URL:Url::cate(id, page);
专题URL:Url::special(id, page);
单页URL:Url::page(id);
标签URL:Url::tag(id, page);
导航URL:Url::nav(type, id, url); //type:2分类, 3单页, 4自定义;url:自定义的URL
插件URL:Url::plugin(name, action, page); //name:插件文件夹名称;action(array):'执行的控制器,执行的方法'
其他URL:Url::other(name, data, page); //name:类别名称;data:类别数据

other的name说明

  • index:首页
  • author:作者
  • date:日期
  • captcha:验证码
  • comment:留言列表
  • search:搜索

获取请求数据

请求参数

若POST,GET,REQUEST,SERVER获取全部数据是,写法:input('post.')

  • 获取POST:input('post.name', '默认值')
  • 获取GET:input('get.name', '默认值')
  • 获取REQUEST:input('request.name', '默认值')

session

  • 设置SESSION:session(名称, 值)
  • 获取SESSION:session(name)
  • 删除SESSION:session(name, NULL)
  • 设置COOKIE:cookie(名称, 值, 时长, path)
  • 获取COOKIE:cookie(name)
  • 删除COOKIE:cookie(name, NULL)

server

  • 获取SERVER:$App::server(name) 或者 input('server.name', '默认值')

辅助函数

可全局使用

  • psw(str):密码加密
  • _encrypt(str):数据加密
  • _decrypt(str):数据解密
  • getGuid():生成唯一序列号
  • json(array):返回json格式数据
  • checkForm(类型, 数据):验证数据,支持 网址(url)、邮箱(email)、手机(phone)、电话(telephone)、英文字母(en)、400电话(400phone)
  • ip:获取客户端IP
  • isMobile:判断是否手机访问
  • redirect(网址, 状态码):跳转链接,默认302
  • url(str, data=array()):生成网址,支持模块生成,如:index/a 或者 /admin/index/b
  • urlOther(type,str,page):其他类型URL生成,参考“进阶教程->链接->other的name说明“
  • pageInationHome:前台分页,参数(总数量, 分页大小, 当前页, 前台模块, 附加值)
  • RemoveSpaces(str):删除连续空格
  • array_filter_key(array, field):二维数组去除空元素,可根据指定字段去除
  • arraySequence(array, field, 方式):二维数组排序,可根据字段排序。排序方式:SORT_DESC 降序;SORT_ASC 升序
  • getContentByLength(内容, 长度):截取字符串指定长度,默认180
  • formatBysize(size):文件大小格式化
  • formatNumber(number):(V2.0)数字格式化
  • formatByte(number):(V2.0)存储单位格式化
  • formatDate(date, level, format):日期格式化,支持格式级别。级别排序:秒,分,时,天,周,月,年,level默认7。format为未匹配日期格式化方式,如:'Y-m-d'
  • content2keyword(str,limit):内容中的标签字符替换成内链,limit为每一个标签替换的次数,默认1
  • subString(str, start, end):从指定位置截取字符串指定长度
  • randStr(长度, 是否包含特殊符号, 数据池):随机生成指定长度字符串,默认不包含特殊字符,数据池默认为A-Za-z0-9
  • hideStr(type, str, replace='*'):(V2.5.1)数据隐私保护。支持类型:手机号中间四位(phone1)、手机号只保留前三位(phone2)、邮箱(email)、姓名保留姓氏(name)、其他类型会隐藏中间数据
  • arrayIdFilter(str):将1,2,3格式的数据过滤并格式化
  • clear_html(content, tages, retainContent=false):(V2.2)过滤指定的html标签(script,iframe,style,all,[...]);retainContent为是否保留内容,即仅过滤标签不删除内容,默认不保留。
  • uploadFiles(file, logId, pageId):上传文件
  • get_contents(url):获取远程数据
  • http_post(url,param_str/array, header=array()):POST提交数据
  • pluginCheck(name):检查插件是否安装并启用
  • pluginConfig(name):获取指定插件的配置
  • pluginDo(name, controller, action, data):运行指定插件的指定方法,controller和action默认index,data传递参数(字符串或数组)
  • rpMsg(信息, 返回地址, 是否自动返回):提示信息,若msg为404,则网页状态为404,其他仅提示文字信息

模板标签

在视图模板中使用,其中if、for、foreach支持标签嵌套。

//include文件:
{include:/header}

//使用变量include
{include:$header}

//include,自定义参数,支持变量和函数(V2.5.2)
{include:$header param1="a" param2='b' param3="$title" param4=":funname()"}

//switch标签(V2.5.2)
{switch $a}
{case a|b|c}条件1{/case}
{case $d false}变量条件2,不中断(break){/case}
{case :fun()}函数条件3,默认中断{/case}
{default /}条件4
{/switch}

//定义变量:
{$now=time()}

//使用变量:
{$cashFiles}

//变量默认值:
{$cashFiles|default=123}

//变量函数:
//多个函数用“|”隔开,变量是函数的第一参数,可不用传,否则用###表示
{$cashFiles|base64_encode}

//原样输出
{$cashFiles|raw}

//常量或后台配置:
{RP.is_develop}

//条件判断if语句:
{if $cashFiles}
cashFiles对了
{elseif $cashFiles2}
还行吧
{else}
错了
{/if}

//执行函数:
{:time()}

//执行类方法(v3.4.2):
{:rp\\View::display($tempName)}

//运行PHP代码:
{php}echo '12345';{php}

//执行钩子:
{hook:hookName}

//执行钩子,并传参数,支持引用,支持多参数
{hook:hookName(&$a, 'test',1)}

//获取钩子执行结果,自定义逻辑处理,$res[0]即为返回数据
{php}
$res=\rp\Hook::doHook('hookName',[&$a,'test']);
{/php}

//遍历循环:
{foreach $list as $k=>$v}
...
{/foreach}

//for循环:
{for $i=0;$i<10;$i++}
...
{/for}

//三元运算:
{$a ? $a : $b}

//运算符:
//暂时支持+ - * / % 后++ 后--
{$a + $b}

//block标签(V2.5.2),block标签会自动调用当前模板中的block.php文件
{block:name1}

//block.php的内容,支持incldue以外的所有模板标签
<block id="name1">
这里是html内容
</block>
<block id="name2">
这里是内容,可以使用标签,如{$title}
</block>

其中比较难理解的是include标签,详细讲解请看《模板标签中include文件时/相对引用的说明特别篇

扩展数据

文章和单页中都有扩展数据字段extend。使用方法如下

提交参数:extend_name,如:extend_BuyId
获取参数:文章/单页位于编辑上/下的钩子中携带有data参数,其中$data['extend']即为扩展数据,格式array();

示例

提交表单:<input type="text" name="extend_BuyId" value="1"/>
获取数据:$data['extend']['BuyId']

数据库操作

引入数据库:use rp\Db;

  • name(table):数据表,无需带前缀
  • table(table):数据表,需带前缀,完整的数据表名称
  • field(fieldStr):查询字段,字符串或一维数组,默认*
  • alias(str):数据表别名,配合join使用
  • join(table, condition, type):联表查询,join(关联表, 关联条件, 关联类型);类型有:left,right,inner,full 默认left;可传二维数组多表关联,如[[关联表, 关联条件, 关联类型], [关联表, 关联条件, 关联类型]]
  • where(str or array):查询条件,可字符串或二维数组,详细语法查看下方“where语法”
  • limit(limitStr):查询数量,如:limit('0,10')
  • order(field, type):排序方式,如:order('id','desc')或order(['id'=>'desc','time'=>'desc']);使用SQL函数:order('rand()')
  • group(field):分组统计,如:group('type')
  • find():查询单条数据
  • select($type):查询多条数据,$type支持assoc,array,object,num,row,all,yield(V2.5.8),默认assoc
  • count(field):统计数量,默认字段*
  • sum(field):获取总和
  • insert(array):插入数据,一维数组时为单条,二维数组时为多条
  • update(array):修改数据,如:update(['name'=>'name1'])
  • setInc(field, number):指定字段自增,默认+1
  • setDec(field, number):指定字段自减,默认-1
  • dele():删除数据

其他方法

  • getSql():获取生成的SQL语句(V2.5.8)
  • slave():自定义数据库链接标识(V2.5.8)
  • insert_id():获取新增数据的主键值
  • affected_rows():获取操作影响的行数
  • server_info():获取数据库的信息
  • server_version():获取数据库版本
  • query(sql):原生Mysql语句查询,方式:Db::instance()->query(sql语句);

快速使用

//注意:必须Db::name()或Db::table()开始
$res=Db::name('tableName')->where(['id'=>1])->find();

where语法

可用表达式:=, <>, !=, >, >=, <, <=, like, not like, in, not in, between, not between, exists, not exists, exp, find_in_set
表达式参数请用字符串,比如array('id'=>array('in','1,2'))或array('id'=>array('in',join(',',[1,2]))

字符串形式:

Db::name('tableName')->where('id=1')->find();

常规用法:

Db::name('tableName')->where(array('id'=>1,'status'=>1))->find();

//生成SQL:select * from tableName where id = 1 and status = 1

表达式用法:

Db::name('tableName')->where(array('id'=>1,'status'=>array('>',1)))->find();

//生成SQL:select * from tableName where id = 1 and status > 1

NULL用法:

Db::name('tableName')->where(array('name'=>'null'))->find();

//生成SQL:select * from tableName where name is null

NOT NULL用法:

Db::name('tableName')->where(array('name'=>'not null'))->find();

//生成SQL:select * from tableName where name is not null

JSON用法(v2.5.5):

Db::name('tableName')->where(array('data->"$.title"'=>'test'))->find();

//生成SQL:select * from tableName where data->"$.title" = 'test'

多字段同条件OR:

Db::name('tableName')->where(array('name|nick'=>'test'))->find();

//生成SQL:select * from tableName where (name = 'test' or nick = 'test')

多字段同条件AND:

Db::name('tableName')->where(array('name&nick'=>'test'))->find();

//生成SQL:select * from tableName where (name = 'test' and nick = 'test')

多字段同条件表达式:

Db::name('tableName')->where(array('name|nick'=>array('like','%t%')))->find();

//生成SQL:select * from tableName where (name like '%t%' or nick like '%t%')

多字段不同条件OR:

Db::name('tableName')->where(array('name|nick'=>array('test','user')))->find();

//生成SQL:select * from tableName where (name = 'test' or nick = 'user')

多字段不同条件AND:

Db::name('tableName')->where(array('name&nick'=>array('test','user')))->find();

//生成SQL:select * from tableName where (name = 'test' and nick = 'user')

多字段不同条件表达式:

Db::name('tableName')->where(array('name|nick'=>array(array('<>','test'),array('like','%user%'))))->find();

//生成SQL:select * from tableName where (name <> 'test' or nick like '%user%')

复杂逻辑:

Db::name('tableName')->where(array('status&(name|nick)'=>array(1,array('<>','test'),array('like','%user%'))))->find();

//生成SQL:select * from tableName where (status = 1 and (name <> 'test' or nick like '%user%'))

多条件like:

Db::name('tableName')->where(array('(name|name)|(nick|nick2)'=>[['like','%user%'],['like','%member%'],['like','%user%'],['like','%member%']]))->find();

//生成SQL:select * from tableName where ((name like '%user%' or name like '%member%') or (nick like '%user%' or nick2 like '%member%'))

混合使用:

Db::name('tableName')->where(array('phone'=>'not null','money'=>array('>',100),'status&(name|nick)'=>array(1,array('<>','test'),array('like','%user%'))))->find();

//生成SQL:select * from tableName where phone is not null and money > 100 and (status = 1 and (name <> 'test' or nick like '%user%'))

注意:key为多字段时,如果value是字符串,则表示使用相同条件。如果是一维数组,则第一个字段对应value的第一个元素,以此轮推。同样value若是二维数组,第几个字段就对应value的第几个元素。

事务

V1.9版本新增

Db::transaction();
try{
	/*
	*业务逻辑sql;
	*/
	// 提交事务
	Db::commit();
} catch (\Exception $e) {
	// 回滚事务
	Db::rollback();
}

跨库查询

V3.5.5版本新增

多个数据库在setting/config目录中配置,一个库一个文件,格式参考default.php中的db参数。

//默认数据库
Db::name('tableName')->select();

//指定数据库
Db::connect('databaseName')->name('tableName')->select();
主题开发

主题规范

模板位置:/templates/index/
模板名称:文件夹名称支持大小写英文字母下划线

主题文件

文件 是否必须 说明
author.json 作者信息
index.php 首页
list.php 列表页
page.php 单页
search.php 搜索页
detail.php 内容页
special.php 专题页
preview.jpg 模板缩略图
block.php   (V2.5.2新增)模板块文件
404.php   404页面
common.php   模块化功能函数集合
password.php   需要授权访问的页面模板文件(form post提交,参数名称:pagepwd),也可以使用系统自带模板
Hook.class.php   模板钩子文件
setting.php   模板配置文件
default.php   默认的配置数据,return array()格式,配合setting.php使用

author.json说明

  • name: 模板名称
  • version: 模板版本,如:1.0
  • date: 模板日期
  • url:模板官方地址
  • description: 模板描述
  • author: 模板作者
  • authorEmail: 作者邮箱
  • authorUrl: 作者主页网址
  • require: 绑定插件,没有则可不写(V3.5.2新增)

示例:

name: '默认模板',
version: '1.0',
date:'2019-11-12 12:00:00',
url:'http://www.rpcms.cn/',
description: 'RPCMS默认模板',
author: 'rpcms',
authorEmail: 'rpcms@qq.com',
authorUrl: 'http://www.rpcms.cn/',
require:{
  member:'1.0' //插件标识:最低版本
}

模板权重说明

若 分类、文章、单页、标签中指定了模板,请确定模板文件存在。
文章列表页模板权重:文章分类列表模板 > list
文章内容页模板权重:文章指定模板 > 文章分类内容模板 > detail

404页面

默认带有简易的404提示页面,也可以制作自己的404页面,只需要放置到对应的视图目录中,系统会自动判断。同样404页面遵循模板标签的使用

404页面参数说明

同rpMsg方法的参数

  • $code:状态码,404 or 500
  • $message:404提示信息
  • $url:回跳地址,默认back(-1)
  • $isAuto:是否自动返回

模板钩子

钩子文件名称:Hook.class.php
钩子空间命名:namespace templates\index\模板文件;
挂载钩子方式:public function addHook(){...}
模板升级方法:public function update(){...}
示例DOME:

public function addHook(){
	$data=array(
		'admin_logs_edit_hook'=>'templates\index\模板文件\hook::testOper',
	);
	return $data;
}
public function update(){
	/*
	*模板升级逻辑代码
	*/
}

主题公共变量

使用方法:{$name}

变量 说明
App 系统主文件OBJECT,可自行打印查看包含数据
host 网站HOST
baseUrl 网站URL(相当于首页URL)
cmspath 网站根目录,若子目录安装则为子目录名称
title 标题
keywords 关键词
description 描述
webConfig 系统后台配置
tempConfig 模板配置
tempUrl 模板地址
route (V2.5.8)当前路由,array
user 用户,如:array[username,home,email,...]
listType 页面类型(除首页外),如list,author,search,date,tags
listId 页面ID值(除首页外),search时为搜索内容,tages时为标签ID,cate时为分类ID,special时为专题ID,logs时为文章ID,author时为用户ID,page时为单页ID,date时为日期字符串

主题公共常量

常量 说明
TEMPURL 模板地址

列表变量

首页、列表页、搜索页、专题页可用

  • logList:文章列表
    • id
    • title:文章标题
    • authorId:作者ID
    • authorEmail:作者邮箱
    • author:作者昵称
    • cateId:分类ID
    • cateName:分类名称
    • cateUrl:分类URL地址
    • cateLogNum:分类文章数量
    • excerpt:简介
    • content:内容
    • tages:标签ID集合
    • tagesData:标签数据集合,数组形式
    • isTop:是否置顶,为1则置顶
    • views:阅读数量
    • comnum:评论数量
    • upnum:点赞数量
    • updateTime:最后更新时间
    • createTime:创建时间
    • status:状态;0发布,1待审,2草稿,-1下架
    • url:文章URL地址
    • extend:自定义扩展数据,数组形式
  • pageHtml:分页代码

单页/内容页变量

  • data:页面数据
    • id
    • title:文章标题
    • alias:别名
    • authorId:作者ID
    • author:作者昵称
    • authorUrl:作者主页访问地址
    • password:授权访问密码
    • content:内容
    • isRemark:是否允许评论,为1则允许
    • comnum:评论数量
    • template:模板文件名称
    • createTime:创建时间
    • status:状态;0发布,1待审,2草稿,-1下架
    • extend:自定义扩展数据,数组形式
    • 以下是文章内容页面独有数据

    • cateId:分类ID
    • cateName:分类名称
    • cateUrl:分类URL地址
    • excerpt:简介
    • tages:标签集合;array [[id,name,url]...]
    • isTop:是否置顶,为1则置顶
    • views:阅读数量
    • upnum:点赞数量
    • updateTime:最后更新时间
    • 以下是单页内容页面独有数据

    • seo_key:seo关键词
    • seo_desc:seo描述
  • CommentData:评论数据
    • count:总数量
    • limit:分页大小
    • page:当前页
    • pageHtml:分页HTML
    • list:数据列表array ['lists'=>评论列表, 'top'=>顶级评论ID(推荐根据此显示评论列表]

专题页变量

  • special:专题数据
    • title:名称
    • subTitle:副标题
    • headimg:专题图片
    • alias:别名
    • seo_desc:描述
    • temp_list:模板名称,为空则为默认模板
    • createTime:最后更新时间
    • logNum:文章数量

交互说明

  • /comment/addcom:评论提交地址,提交参数:
    • types:类型;logs:文章,pages:单页
    • vid:文章/单页ID
    • topId:上级评论ID
    • username:评论人昵称
    • email:评论人邮箱
    • home:评论人主页地址
    • content:评论内容
    • verifyCode:验证码,如果开启验证码则需提交此参数
  • /praise:点赞提交地址,提交参数 ID:文章ID

logMod类模块功能

  • neighbor(ID):相邻文章,返回array('prev'=>array(),'next'=>array())
  • related(文章data数据, 相关类型, 数量):相关文章。相关类型:分类(cate)、标签(tages)
插件开发

插件规范

插件位置:/plugin/
插件名称:目录名称支持大小写英文字母下划线
命名空间:namespace plugin\插件目录名称(区分大小写)

遵循模板标签使用方法(需继续 rp\plugin类)
视图赋值:$this->assign(name, value)
视图渲染:$this->display(文件名称),无需带上插件文件夹名称,系统会自动获取所用插件
后台操作验证:$this->checkFormAdmin(),推荐在__construct中使用
判断主题模板文件是否存在:$this->checkTemp(文件名称)
例如:插件目录为demo

引用的模板是demo/temp文件,则$this->display('temp')
引用的模板是demo/template/temp2文件,则$this->display('template/temp')
引用当前模板的视图模板$this->display('/header'),则会引用当前模板目录下的header.php
使用模板标签引用当前模板的视图模板{include:/header}

后台运行插件方法(提交数据):域名/admin/plugin/run.html?to=插件名称/控制器/方法,如http://rpcms.cn/admin/plugin/run.html?to=test/admin/mytest

插件文件

文件 是否必须 说明
author.json 作者信息(同模板)
Index.class.php 插件主文件
Setting.class.php   插件配置文件
icon.png   插件图标

Index.class.php中主要函数说明

  • install:插件安装执行方法
  • uninstall:插件卸载执行方法
  • update:插件升级更新执行方法
  • addHook:插件需要挂载的钩子,需return array,如:
    $data=array(
    	'admin_top_menu'=>'plugin\test\index::mytest',
    );
    return $data;

Setting.class.php中主要函数说明

  • index:插件配置,显示配置页面
  • 插件数据保存已封装,只需在插件配置页面form中加入下方代码,submit提交时会自动保存插件,无需手动调用setConfig()方法进行保存
    <input type="hidden" name="sendpost" value="1"/>

预装变量

预装变量已封装在rp\Plugin中,可继承直接使用

变量/方法 调用 说明
App $this->App 同主文件App
webConfig $this->webConfig 同webConfig配置
Db $this->Db 同Db数据库
Db_prefix $this->Db_prefix 数据库前缀
pluginName $this->pluginName 当前插件名称
pluginPath $this->pluginPath 当前插件相对路径(根目录)
tempUrl $this->tempUrl (V1.9.4新增)当前模板相对路径(根目录)
setConfig() $this->setConfig(pluginName, (array)data) 配置保存
getConfig() $this->getConfig(pluginName) 插件配置获取,pluginName为空或不传,则自动获取当前插件
admin $this->admin 管理员数据,checkFormAdmin验证通过后方可使用

视图公共变量

使用方法:{$name}

变量 说明
webConfig 系统后台配置
baseUrl 根域名网址
App 系统主文件OBJECT
pluginPath 当前插件相对路径(根目录)
多应用

添加应用

rpcms支持多应用,系统默认自带index、admin、install、api(V1.7新增)四个应用。
若你需要,可以新增应用,应用支持配置二级域名和独立的配置(V1.8最新版新增)

如何新增应用?

  • system中新建目录,命名为你需要新增的应用名称(小写英文字母,不要使用中文,哪怕你用拼音都行)。
  • 在新增的目录中新建Index.class.php,此处需注意,文件命名的首字母需大写
  • Index.class.php中编写代码即可,空间命名:namespace rp\你新增的应用名称
  • 其他控制器文件同Index.class.php。

提示:所有应用默认访问index控制器的index方法。

如何给应用配置二级域名?

请参考《教程9-高级晋级,应用绑定二级域名》进行配置。

如何设置不同应用不同的配置?

此功能是V1.8新增的,V3.0.0优化,如果你按照步骤操作后没有实现,那么请升级程序吧。

  • 你需要有新增的应用。
  • 配置:在setting/config目录创建一个 应用名.php 的文件,参数&语法请参考同目录下default.php。
  • 路由:在setting/route目录创建一个 应用名.php 的文件,参数&语法请参考同目录下index.php。
  • OK了,就这么简单。应用配置中的参数会覆盖系统的配置(即default.php中的参数)。

其他

表单验证

需引用me.min.js后才可以使用。使用方法:$.formFilter(Dom, object)
其中object包含配置:

{
	"all":false, //默认:false,单项逐步验证;当为true时,会将表单中所有需要验证的内容全部验证后返回信息。
	"msg":true, //默认:true,提示框提示信息;当为false时,会返回包含错误数据的json数组。
}

code为true时的返回数据(object),当all为true是,返回多维数组。

{
	"code":false, //表单验证结果,false为验证不通过。
	"title":"此元素", //元素标题,可通过data-title设置;code为true是不返回此项。
	"obj":Dom对象, //元素的DOM对象,code为true是不返回此项。
	"msg":"不可为空", //错误信息,code为true是不返回此项。
}

HTML部分

在需要验证的表单元素上加入validate类名,自定义属性data-filter设置验证规则(多个规则用“|”隔开),data-title设置自定义提示标题。
如:

<input type="text" name="name" class="validate" data-filter="required|max:100" data-title="我是标题"/>					

验证规则

名称 描述 使用说明
required 不可为空  
phone 验证手机号  
email 验证邮箱  
url 验证网址  
telephone 验证固话  
date 验证日期,格式:YYY-MM-DD或YYY/MM/DD  
idcard 验证身份证号  
number 只能是数字  
en 只能是英文字母,不分区大小写  
cn 只能是中文  
length 指定区间字数 length:2-100,表示元素值在2到100个字符之间
max 最多字数 max:100,表示元素值最多为100个字符
min 最少字数 min:2,表示元素值最少2个字符
between 指定数字区间,必须为整数数字 between:1-100,表示元素值只能在整数1到100之间

注意:除 required 外,其他规则只有在元素值不为空时才触发。

其他说明

关于模板/插件的命名:小写英文字母、数字和下划线组合。

命名空间使用

定义命名空间

<?php 
namespace templates\index\defaults;

class Hook{
...
}
?>
即为:根目录/templates/index/defaults/目录下的Hook.class.php

使用定义的命名空间

<?php 
use templates\index\defaults\Hook;

class test{
public function testDemo(){
	$hook=new Hook();
	//若存在有静态变量或方法
	$a=Hook::静态变量名称
	$b=Hook::静态方法名称
}
}
?>

Hook钩子参数

定义的Hook方法支持多参数传参,如何在php文件中直接通过静态方法doHook调用(如插件中使用),传的参数请用数组组装起来,同时支持引用。如:

<?php
$a='第一个参数,支持引用';
$b='第二个参数,不支持引用';
$c=1;
Hook::doHook('hookName',array(&$a,$b,$c));
?>
如果在模板中通过模板标签调用Hook,同样也支持多参数和变量引用,注意这里参数不用组装成数组,如:
{php}
$a='模板中的参数,支持引用';
$b='模板中的参数,不支持引用';
{/php}
{hook:hookName(&$a,$b)}				
在hook文件中如何接收参数呢,和平常的php写法一样,直接function接收就可以了,如:
public function hookName(&$a,$b,$c=''){
	echo 'a参数='.$a.'<br>';
	echo 'b参数='.$b.'<br>';
	echo 'c参数='.$c.'<br>';
	//更改$a参数的值
	$a='this is test';
}
注意:如果函数的参数有引用,传参也要引用,请保持前后一致。

图片懒加载

需引用me.min.js后才可以使用。

<img src="loading.jpg" data-src="img.jpg" class="imglazy"/>
<a data-src="img.jpg" class="imglazy" >图片加载</a>
<i data-src="img.jpg" class="imglazy">图片加载</i>

<script>
/*
*当为img标签时,以图片形式渲染
*当为a标签或i标签是,以background形式渲染
*/
$(".imglazy").imglazy({
	"attr":"data-src", //可选,图片路径属性,默认data-src
	"error":"/images/error.jpg", //可选,图片加载失败的替换图片路径
	"callback":function(){}, //可选,图片加载成功回调,传参当前dom节点。
	"timer":10,	//可选,图片加载间隔时间,减少并发。单位:毫秒
});
</script>

sitemap:

sitemap支持分页,在没修改index路由情况下,sitemap地址如下:

//无分页
xxx.com/sitemap/baidu.xml
//有分页
xxx.com/sitemap/baidu_2.xml

//其中后缀名支持xml和html。