RPCMS 帮助文档 V1.6

关于RPCMS

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

RPCMS是一款基于PHP+MYSQL的轻量型内容管理/博客系统,支持PHP5.6版本以上,支持win/Linux系统。
它虽然小巧,但有着强大的扩展性、丰富的插件接口和大量的模板。
系统统一采用模板标签,开发更方便!

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

系统功能介绍

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加载模板并显示

伪静态

  • 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>
  • Linux:
    location / {
    	if (!-e $request_filename){
    		rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    	}
    }

系统钩子介绍

前置钩子

  • cms_index_begin:路由拦截,需return array,array格式参照根目录route.php文件

系统后台钩子

  • admin_top_menu:插件按钮,位于顶部菜单
  • admin_left_menu:插件按钮,位于左侧菜单
  • admin_logs_edit_hook:扩展钩子,传参$data文章数据,位于文章编辑器上方
  • admin_logs_edit_hook2:扩展钩子2,传参$data文章数据,位于文章编辑器下方
  • admin_logs_edit_hook3:扩展钩子3,传参$data文章数据,位于文章发布按钮上方
  • admin_logs_submenu_hook:插件按钮,位于文章列表上方
  • admin_pages_edit_hook:扩展钩子,传参$data单页数据,位于单页编辑器上方
  • admin_pages_edit_hook2:扩展钩子2,传参$data单页数据,位于单页编辑器下方
  • admin_pages_edit_hook3:扩展钩子3,传参$data单页数据,位于文章发布按钮上方
  • admin_pages_submenu_hook:插件按钮,位于单页列表上方
  • admin_comment_submenu_hook:插件按钮,位于评论列表上方
  • admin_logs_save:文章新增、修改,传参logId,如:1
  • admin_logs_dele:文章删除,传参ids,如:1,2,3
  • admin_logs_status:文章状态更改,传参ids,如:1,2,3
  • admin_pages_save:单页新增、修改hook,传参pageId,如:1
  • admin_pages_dele:单页删除,传参ids,如:1,2,3
  • 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_down:附件下载前置,可用于更新下载量,授权下载等等

配置介绍

引入配置:use rp\Config;

设置配置:Config::set(name , value)
value可以为字符串或数组或二维数组
如:Config::set('name1','this is name1');
Config::set('name2',array('value1','value2'));
Config::set('name3',array('name3_1'=>'value3_1','name3_2'=>'value3_2'));

获取配置:Config::get(name)
如:Config::get('name1');
Config::get('name3.name3_1');
获取后台系统设置的配置
Config::get('webConfig.webName');

缓存介绍

引入缓存:use rp\Cache;

更新缓存:Cache::upddate(name),当name为空的时候,更新所有缓存
获取缓存:Cache::read(name)

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

进阶教程

获取前端数据

获取POST:input('post.name','默认值')
获取GET:input('get.name','默认值')
获取REQUEST:input('request.name','默认值')
获取SERVER:$App::server(name)
设置COOKIE:cookie(名称, 值, 时长, path)
获取COOKIE:cookie(name)
删除COOKIE:cookie(name, NULL)
设置SESSION:session(名称, 值)
获取SESSION:session(name)
删除SESSION:session(name, NULL)

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

钩子操作

引入钩子: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为钩子的传递参数(多参数用数组形式),当$args传递钩子的指定方法时,$isReturn可为钩子的传递参数,第四参数可为$isReturn。$isReturn默认false,当$isReturn为true时,如果hook拥有多个,那么除第一个外其他不会执行
举例:
Hook::doHook('hookName') //运行hookName钩子
Hook::doHook('hookName','this is args') //运行hookName钩子带参数
Hook::doHook('hookName','this is args',true) //运行hookName钩子带参数并返回
Hook::doHook('hookName','plugin\demo\index::action') //运行hookName钩子的指定方法
Hook::doHook('hookName','plugin\demo\index::action',true) //运行hookName钩子的指定方法并返回
Hook::doHook('hookName','plugin\demo\index::action','this is args') //运行hookName钩子的指定方法并带参数
Hook::doHook('hookName','plugin\demo\index::action','this is args',true) //运行hookName钩子的指定方法带参数并返回
获取钩子:Hook::getHook(名称)
判断钩子是否存在:Hook::hasHook(名称)
保存钩子缓存文件:Hook::saveHook()
初始化清空钩子:Hook::setHookNull()

链接

引入URL:use rp\Url;

设置HTTP状态码:Url::setCode(code)
生成URL(后台推荐使用):Url::setUrl('index/index')
跳转链接: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说明

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

数据库操作

引入数据库: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():查询多条数据
count(field):统计数量,默认字段*
sum(field):获取总和
insert(array):插入数据,一维数组时为单条,二维数组时为多条
update(array):修改数据,如:update(['name'=>'name1'])
setInc(field, number):指定字段自增,默认+1
setDec(field, number):指定字段自减,默认-1
dele():删除数据


insert_id():新增数据的主键值
affected_rows():操作影响的行数
query(sql):原生Mysql语句查询,方式:Db::instance()->query(sql语句);

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

where语法

表达式:=, <>, !=, >, >=, <, <=, like, not like, in, not in, between, not between, exists, not exists, exp, find_in_set

字符串形式: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

多字段同条件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%'))

混合使用: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的第几个元素。

辅助函数

可全局使用

  • psw(str):密码加密
  • _encrypt(str):数据加密
  • _decrypt(str):数据解密
  • getGuid():生成唯一序列号
  • json(array):返回json格式数据
  • checkForm(类型, 数据):验证数据,支持 网址(url)、邮箱(email)、手机(phone)、电话(telephone)、英文字母(en)
  • ip:获取客户端IP
  • redirect(网址, 状态码):跳转链接,默认302
  • url(str):生成网址,支持模块生成,如: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):文件大小格式化
  • formatDate(date, level, format):日期格式化,支持格式级别。级别排序:秒,分,时,天,周,月,年,level默认7。format为未匹配日期格式化方式,如:'Y-m-d'
  • content2keyword(str):内容中的标签字符替换成内链
  • subString(str, start, end):从指定位置截取字符串指定长度
  • randStr(长度, 是否包含特殊符号, 数据池):随机生成指定长度字符串,默认不包含特殊字符,数据池默认为A-Za-z0-9
  • arrayIdFilter(str):将1,2,3格式的数据过滤并格式化
  • clear_html(str, array):过滤指定的html标签(script,iframe,style,all),第二个参数是需要过滤标签的数组,如array('script','style')
  • uploadFiles(file, logId, pageId):上传文件
  • get_contents(url):获取远程数据
  • http_post(url,url_str/array):POST提交数据
  • pluginCheck(name):检查插件是否安装并启用
  • pluginConfig(name):获取指定插件的配置
  • pluginDo(name, controller, action, data):运行指定插件的指定方法,controller和action默认index,data传递参数(字符串或数组)
  • rpMsg(信息, 返回地址, 是否自动返回):提示信息,若msg为404,则网页状态为404,其他仅提示文字信息

视图

引入视图:use rp\View;

模板赋值:View::assign(name, value)
模板渲染:View::display(模板文件名称),/名称的话从模块视图根目录读取,否则从模块视图目录/控制器下读取
模板判断:View::checkTemp(模板文件名称),判断主题模板文件是否存在

模板标签

在前端模板中使用,其中if、for、foreach支持标签嵌套

include文件:{include:/header},支持变量{include:$header}
定义变量:{$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,'1')}
遍历循环:{foreach $list as $k=>$v} ... {/foreach}
for循环:{for $i=0;$i<10;$i++}...{/for}
三元运算:{$a ? $a : $b}
运算符:{$a + $b},暂时支持+ - * / % 后++ 后--

扩展数据

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

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

示例

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

模板制作

模板位置:/templates/index
模板所需文件

  • [必须]author.json:作者信息
  • [必须]index.php:首页
  • [必须]list.php:列表页
  • [必须]page.php:单页
  • [必须]search.php:搜索页
  • [必须]detail.php:内容页
  • [必须]special.php:专题页
  • preview.jpg:模板缩略图
  • 404.php:404页面,如果不需要可以删除
  • common.php:为模块化功能函数集合,如果不需要可以删除
  • setting.php:为模板配置文件,如果不需要配置可以删除
  • Hook.class.php:为模板钩子文件,如果不需要配置可以删除
  • password.php:为需要授权访问的页面模板文件(form post 参数pagepwd),如果使用系统自带的,可以删除
  • default.php:为默认的配置数据,return array()格式,可配合setting.php使用,不需要可以删除

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

404页面说明:系统默认带有简易的404提示页面,也可以制作自己的404页面,只需要放置到模板文件夹中,系统会自动判断。同样404页面遵循模板标签的使用
404页面参数说明(同rpMsg方法的参数)

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

author.json说明

  • name: 模板名称
  • version: 模板版本
  • date: 模板日期
  • url:模板官方地址
  • description: 模板描述
  • author: 模板作者
  • authorEmail: 作者邮箱
  • authorUrl: 作者主页网址
name: '默认模板',
version: '1.0',
date:'2019-11-12 12:00:00:00',
url:'http://www.rpcms.cn/',
description: 'RPCMS默认模板',
author: 'rpcms',
authorEmail: 'rpcms@qq.com',
authorUrl: 'http://www.rpcms.cn/',

模板钩子说明

钩子文件名称:Hook.class.php
钩子空间命名:namespace template\index\模板文件;
挂载钩子方式:public function addHook(){...}
使用DOME:

$data=array(
	'admin_logs_edit_hook'=>'template\index\模板文件\hook::mytest',
);
return $data;

模板公共变量
使用方法:{$name}

  • host:网站URL
  • title:标题
  • keywords:关键词
  • description:描述
  • webConfig:系统后台配置
  • tempConfig:模板配置
  • tempUrl:模板地址
  • 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
    • author:作者昵称
    • cateId:分类ID
    • cateName:分类名称
    • cateUrl:分类URL地址
    • cateLogNum:分类文章数量
    • excerpt:简介
    • content:内容
    • tages:标签ID集合
    • tagesData:标签数据集合,数组形式
    • isTop:是否置顶,为1则置顶
    • views:阅读数量
    • comnum:评论数量
    • upnum:点赞数量
    • upateTime:最后更新时间
    • 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:点赞数量
    • upateTime:最后更新时间
    • 以下是单页内容页面独有数据

    • 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:相邻文章 array('prev'=>array(),'next'=>array())
  • related(文章data数据, 相关类型, 数量):相关文章;相关类型:分类,标签

插件制作

模板位置:/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

插件所需文件

  • [必须]author.json:作者信息(同模板)
  • [必须]Index.class.php:插件主文件
  • Setting.class.php:插件配置文件
  • icon.png:插件图标

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

  • App:同主文件App,使用:$this->App
  • webConfig:同webConfig配置,使用:$this->webConfig
  • Db:同Db数据库,使用:$this->Db
  • Db_prefix:数据库前缀,使用:$this->Db_prefix
  • setConfig:插件配置保存,使用:$this->setConfig(plugin, (array)data)
  • getConfig:插件配置获取,使用:$this->getConfig(plugin)
  • pluginName:当前插件名称,使用:$this->pluginName
  • pluginPath:当前插件相对路径(系统根目录),使用:$this->pluginPath
  • admin:管理员数据,checkFormAdmin验证通过方可使用

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

  • install:插件安装执行方法
  • uninstall:插件卸载执行方法
  • 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"/>

插件视图公共变量,使用方法:{$name}

  • webConfig:系统后台配置
  • baseUrl:系统根域名网址
  • App:系统主文件OBJECT
  • pluginPath:当前插件相对路径(系统根目录)

插件DEMO下载

其他说明

关于模板/插件的命名:小写英文字母、数字和下划线组合,不支持驼峰写法!

命名空间使用:

定义命名空间

<?php 
namespace template\index\defaults;

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

使用定义的命名空间

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

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

rss地址说明:

xxx.com/rss