一个轻量型内容管理/博客系统,自由方便,灵活度高
RPCMS是一款基于PHP+MYSQL的轻量型内容管理/博客系统,支持PHP5.6版本以上,支持win/Linux系统。
它虽然小巧,但有着强大的扩展性、丰富的插件接口和大量的模板。
系统统一采用模板标签,开发更方便!
类 | 名称 | 方法 |
---|---|---|
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 加载模板并显示 |
<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>
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } }
rpcms是支持多应用的,系统默认自带index、admin、install、api(V1.7新增)四个应用。若你需要,可以新增应用,应用支持配置二级域名和独立的配置(V1.8最新版新增)
Q:如何新增应用?
提示:所有应用默认访问index控制器的index方法。
Q:如何给应用配置二级域名?
请参考《教程9-高级晋级,应用绑定二级域名》进行配置。
Q:如何设置不同的应用不同的配置?
此功能是V1.8新增的,如果你按照步骤操作后没有实现,那么请升级程序吧。
钩子 | 名称 | 说明 |
---|---|---|
cms_index_run | 系统运行前置 | 可用于IP,地域拦截等 |
cms_index_begin | 路由拦截 | 需return array,array格式参照根目录route.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_save | 文章新增、修改 | 传参$logId,如:1 |
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\Config;
//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('name1'); Config::get('name3.name3_1'); Config::get('name4_1');
Config::get('webConfig.webName');
引入缓存:use rp\Cache;
Cache::set(data, name, expire); //此方法任何应用中都可以使用,更新自定义缓存同样调用此方法;读取缓存使用Cache::read()读取。 /* *data:缓存的数据,支持字符串、数组。 *name:缓存名称 *expire:过期时间,单位秒,默认0,表示不过期。 */
Cache::update(name); //当name为空的时候,更新所有缓存(仅index应用)
Cache::read(name);
在V2.0版本中,优化了路由功能,可以自定义路由规则来实现个性化URL。
所有应用都支持自定义路由,在route.php文件中,已默认index应用的路由规则。其他应用若实现自定义路由可参考此文件。
return [ array( 'model'=>'/index/logs/detail', 'pattern'=>'post/<id><page#_?>', ), array( 'model'=>'/index/logs/dates', 'pattern'=>'date/<date><page#_?>', 'replace'=>['date'=>'\d{6,8}'], 'ext'=>'php|html' ), ];
<变量名称#分割符号>,如果变量是可选变量,在后面加入英文的问号即可,如:<变量名称#分割符号?>
变量分割符支持的符号有:@ ~ . , \ | _ -
斜线分隔符请用反斜线代替。
在使用分割符号的时候,要避免和别名中的符号重复(特别是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']
若POST,GET,REQUEST,SERVER获取全部数据是,写法:input('post.')
引入钩子:use rp\Hook;
Hook::addHook('hookName', 'plugin\demo\index::action');
Hook::deleHook('hookName','plugin\demo\index::action');
/* $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]调用。 */
引入URL:use rp\Url;
Url::setCode(code);
Url::setUrl('/index/log/index', [$data=array, $isDomain=boolean]);
Url::now([$isDomain=boolean, $isQuery=boolean]);
Url::redirect(str);
文章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说明
引入数据库:use rp\Db;
//注意:必须Db::name()开始
$res=Db::name('tableName')->where(['id'=>1])->find();
可用表达式:=, <>, !=, >, >=, <, <=, 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(); }
可全局使用
引入视图:use rp\View;
View::assign(name, value)
View::display(模板文件名称) //名称的话从模块视图根目录读取,否则从模块视图目录/控制器下读取
View::checkTemp(模板文件名称) //判断主题模板文件是否存在
在前端模板中使用,其中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} //常量或后台配置: {RP.is_develop} //条件判断if语句: {if $cashFiles} cashFiles对了 {elseif $cashFiles2} 还行吧 {else} 错了 {/if} //执行函数: {:time()} //运行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>
文章和单页中都有扩展数据字段extend。使用方法如下
提交参数:extend_name,如:extend_BuyId
获取参数:文章/单页位于编辑上/下的钩子中携带有data参数,其中$data['extend']即为扩展数据,格式array();
示例
提交表单:<input type="text" name="extend_BuyId" value="1"/>
获取数据:$data['extend']['BuyId']
模板位置:/templates/index
若 分类、文章、单页、标签中指定了模板,请确定模板文件存在
文章列表页模板权重:文章分类列表模板 > list
文章内容页模板权重:文章指定模板 > 文章分类内容模板 > detail
系统默认带有简易的404提示页面,也可以制作自己的404页面,只需要放置到模板文件夹中,系统会自动判断。同样404页面遵循模板标签的使用
404页面参数说明(同rpMsg方法的参数)
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/',
钩子文件名称: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::mytest', ); return $data; } public function update(){ /* *模板升级逻辑代码 */ }
使用方法:{$name}
以下是文章内容页面独有数据
以下是单页内容页面独有数据
模板位置:/plugin
插件遵循模板标签使用方法(需继续 rp\plugin类)
插件命名空间格式:namespace 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')
使用模板标签引用当前模板视图模板{include:/header}
后台运行插件方法(提交数据):host/admin/plugin/run.html?to=插件名称/控制器/方法,如http://rpcms.cn/admin/plugin/run.html?to=test/admin/mytest
$data=array( 'admin_top_menu'=>'plugin\test\index::mytest', ); return $data;
<input type="hidden" name="sendpost" value="1"/>
需引用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地址说明:
xxx.com/sitemap