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:
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 | 验证手机号 | |
验证邮箱 | ||
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。