PbootCMS二次开发文档
1、入口文件定义
// 引用内核启动文件
require dirname(__FILE__) . '/core/start.php';
2、入口文件绑定控制器
// 定义为入口文件
define('IS_INDEX', true);
// 入口文件地址绑定
define('URL_BIND', 'home');
// 也可以直接绑定至方法
define('URL_BIND', 'home/index');
这个比较简单,日常开发也很少会用到,做个了解即可,有兴趣的可以查看PbootCms根目录下的index.php和admin.php学习了解。
目录结构
|-apps #应用目录
| |-admin #后台
| |-api #API接口
| |-common #公共目录
| |-home #前台
|-config #配置
| |-config.php #系统配置
| |-database.php #数据库配置
| |-route.php #自定义路由配置
|-core #框架核心
|-data #sqilte数据库存储位置
|-runtime #运行时目录
|-static #静态资源目录
|-template #模板文件夹目录
|-admin.php #后台入口
|-api.php #API接口入口
|-index.php #前台入口
系统常量
常量名称 | 常量说明 | 备注 |
---|---|---|
START_TIME | 程序启动时间 | |
DOC_PATH | 站点文档路径 | |
ROOT_PATH | 站点部署路径 | |
CORE_PATH | 框架内核路径 | |
SITE_DIR | 站点目录 | |
M | 当前模块 | |
C | 当前控制器 | |
F | 当前方法 | |
URL | 当前请求路径 | |
APP_PATH | 应用程序路径 | |
RUN_PATH | 运行时文件路径 | |
CONF_PATH | 公共配置文件路径 | |
STATIC_DIR | 静态资源目录 | |
APP_CONTROLLER_PATH | 当前控制器路径 | |
APP_MODEL_PATH | 当面模型路径 | |
APP_VIEW_PATH | 当前视图路径 | |
APP_THEME_DIR | 当前主题路径 |
1、模型
模型命名空间:app\home\model,以app开头,home为当前应用名,以model结尾;
用户应用模型应继承core\basic\Model类;
例如:
class TodoModel extends Model
{
......
}
2、控制器
控制器命名空间:app\home\controller;以app开头,home为当前应用名,以controller结尾;
用户控制器应继承core\basic\Controller类;
例如:
class TodoController extends Controller
{
......
}
2.1、控制器空方法
_empty(),当无法匹配到方法时自动调用。
2.2、继承应用控制基类中的方法介绍
方法 | 实现功能 | 助手函数 |
---|---|---|
$this->display($file) | 显示模板 | display($file) |
$this->parser($file) | 解析模板 | parser($tpl) |
$this->setTheme($themeName) | 设置主题 | set_theme($theme_name) |
$this->assign($var, $value) | 变量注入接口,向模板注入数据 | assign($var, $value) |
$this->getVar($var) | 变量获取接口,获取注入的数据 | get_var($var) |
$this->config($item = null, $array = false) | 获取配置参数 | |
$this->log($content, $level = "info") | 写入日志 |
函数库文件
|-core/function
| |-file.php //数据处理
| |-handle.php //公共函数
| |-helper.php //助手函数
1.1、数据处理
函数名 | 实现功能 | 备注 |
---|---|---|
check_dir($path, $create = false) | 检测目录是否存在 | |
create_dir($path) | 创建目录 | |
check_file($path, $create = false, $content = null) | 检查文件是否存在 | |
create_file($path, $content = null, $over = false) | 创建文件 | |
dir_list($path) | 目录文件夹列表 | |
file_list($path) | 目录文件列表 | |
path_list($path) | 目录下文件及文件夹列表 | |
path_delete($path, $delDir = false) | 删除目录及目录下所有文件或删除指定文件 | |
dir_copy($src, $des, $son = 1) | 拷贝文件夹 | |
is_image($path) | 判断文件是否是图片 | webp可自行加入 |
upload($input_name, $file_ext = null, $max_width = null, $max_height = null, $watermark = false) | 文件上传 | |
handle_upload($file, $temp, $array_ext_allow, $max_width, $max_height, $watermark) | 处理并移动上传文件 | |
resize_img($src_image, $out_image = null, $max_width = null, $max_height = null, $img_quality = 90) | 等比缩放图片 | |
cut_img($src_image, $out_image = null, $new_width = null, $new_height = null, $img_quality = 90) | 剪切图片 | |
watermark_img($src_image, $out_image = null, $position = null, $watermark_image = null, $watermark_text = '', $watermark_text_size = null, $watermark_text_color = null) | 图片水印 |
1.2、公共函数
函数名 | 实现功能 | 备注 |
---|---|---|
get_user_bs($bs = null) | 获取用户浏览器类型 | |
get_user_os($osstr = null) | 获取用户操作系统类型 | |
get_user_ip() | 获取用户IP | |
get_url($url, $fields = array(), $UserAgent = null, $vfSSL = false) | 执行URL请求,并返回数据 | |
get_date($timestamp = null) | 返回时间戳格式化日期时间,默认当前 | |
get_date_diff($startstamp, $endstamp, $return = 'm') | 返回时间戳差值部分,年、月、日 | |
get_tree($data, $tid, $idField, $pidField, $sonName = 'son') | 生成无限极树,$data为二维数组数据 | |
get_mapping($array, $vValue, $vKey = null) | 获取数据数组的映射数组 | |
get_page() | 页码赋值,异常返回1 | |
get_request_method() | 返回请求类型 | |
get_current_url() | 获取当前完整URL地址 | |
get_strpos($string, $find, $n) | 获取字符串第N次出现位置 | |
escape_string($string) | 获取转义数据,支持字符串、数组、对象 | |
decode_string($string) | 字符反转义html实体及斜杠,支持字符串、数组、对象 | |
decode_slashes($string) | 字符反转义斜杠,支持字符串、数组、对象 | |
encrypt_string($string) | 字符串双层MD5加密 | |
get_uniqid() | 生成唯一标识符 | |
clear_html_blank($string) | 清洗html代码的空白符号 | |
rim_slash($string) | 去除字符串两端斜线 | |
hump_to_underline($string) | 驼峰转换下划线加小写字母 | |
object_to_array($object) | 转换对象为数组 | |
array_to_object($array) | 转换数组为对象 | |
in_object($needle, $object) | 值是否在对象中 | |
result_value_search($needle, $result, $skey) | 结果集中查找指定字段父节点是否存在 | |
mult_array_merge($array1, $array2) | 多维数组合并 | |
implode_quot($glue, array $pieces, $diffnum = false) | 数组转换为带引号字符串 | |
is_multi_array($array) | 是否为多维数组,是返回true | |
is_mobile() | 是否为移动设备 | |
is_post() | 是否为POST请求 | |
is_get() | 是否为GET请求 | |
is_put() | 是否为PUT请求 | |
is_patch() | 是否为PATCH请求 | |
is_delete() | 是否为DELETE请求 | |
is_delete() | 是否为AJAX请求 | |
is_https() | 判断当前是否为https | |
get_http_url($noport = false) | 获取当前访问地址 | |
get_http_host($noport = true) | 获取当前访问域名 | |
substr_both($string, $strat, $length) | 中英混合的字符串截取,以一个汉字为一个单位长度,英文为半个 | |
strlen_both($string) | 中英混合的字符串长度,以一个汉字为一个单位长度,英文为半个 | |
query_string($unset = null) | 获取地址参数 | |
preg_replace_r($search, $replace, $subject) | 递归替换 | |
create_code($len = 4) | 生成随机验证码 |
1.3、助手函数
函数名 | 实现功能 | 备注 |
---|---|---|
url($url, $suffix = false) | 生成实际跳转路径 | 接收控制器方法访问完整路径,如:/home/index/index |
homeurl($url, $suffix = null, $qs = null) | 生成前端路径 | |
error($string, $jump_url = null, $time = 2) | 自定义错误页面 | |
success($string, $jump_url = null, $time = 2) | 自定义成功页面 | |
alert($info, $status = 0) | alert弹窗 | |
alert_back($info, $status = 0) | 弹窗并返回前页 | |
location($url) | 跳转 | |
alert_location($info, $url, $status = 0) | 弹窗并跳转 | |
alert_close($info, $status = 0) | 弹窗并关闭 | |
model($name = null, $new = false) | 实例化模型对象助手 | |
api($args = null) | api读取数据 | |
display($tpl) | 输出模板内容 | |
parser($tpl) | 解析模板内容 | |
set_theme($theme_name) | 设置模板 | |
assign($var, $value) | 注入模板变量 | |
get_var($var) | 变量获取接口 | |
page($tatal, $morePageStr = false) | 手动生成分页信息,返回限制语句 | |
response($data) | 内容输出助手函数 | |
json($code, $data, $tourl = null) | Json内容输出助手函数 | |
filter($varname, $condition) | 数据过滤 | 详细使用建议阅读源码 |
get($name, $type = null, $require = false, $vartext = null, $default = null) | 获取GET参数 | |
post($name, $type = null, $require = false, $vartext = null, $default = null) | 获取POST参数 | |
request($name, $type = null, $require = false, $vartext = null, $default = null) | 获取参数,post或get | |
cookie($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = true) | 读取或写入Cookie信息 | |
session($name, $value = null) | 读取或写入session信息 | |
issetSession($name) | 检查会话参数是否存在 | |
sendmail(array $config, $to, $subject, $body) | 快速发送邮件函数 | |
_404($string, $jump_url = null, $time = 2) | 返回404页面,文件中可使用{info}替换提示信息 |
1、数据库操作执行
1.1、通过Db类操作
//静态方式
//执行连贯操作方法
Db::table('ay_user')->select()
//执行原生操作方法
Db::all('select * from ay_user')
//对象方式
$db = new Db();
//执行连贯操作方法
$db->table('ay_user')->select()
//执行原生操作方法
$db->all('select * from ay_user')
可用于模板中加载数据,例如:
{php}
//获取友情链接
Db::table('ay_link')->select()
{/php}
2、数据库连贯操作
操作 | 说明 |
---|---|
table($table) | 接收完整表名,可以是字符串、数组,'ay_user',array('ay_user'=>'a','ay_role') |
name($table) | 接收表名,可以是字符串、数组,'user',array('user'=>'a','role') |
alias($alias) | 设置表别名,只适合单表查询时,传递字符串,'a' |
distinct($flag) | 设置返回非重复数据,可选传递字布尔值,默认true |
field($field) | 设置返回数据字段,可以为字符串、数组,'username,passwd',array('username'=>'uname','passwd'=>'pwd') |
where($where,$inConnect, $outConnect) | 设置条件,可多次调用,可以为字符串、数组,多次调用本方法时与前面条件使用AND连接,$where参数数组内部的条件默认使用AND连接,'id=1',array('id'=>1,'age>3') |
exists($subsql) | 设置EXISTS查询,传递子查询或闭包子查询,支持用闭包函数连贯查询构建语句 |
notExists($subSql) | 设置NOT EXISTS查询,传递子查询或闭包子查询,支持用闭包函数连贯查询构建语句 |
in($field, $range) | 传递字段名和范围数据,可多次调用,范围参数接受字符串、数组或子查询,'username','1,2,3'; 'username',array(1,2,3); |
notIn($field, $range) | 传递字段名和范围数据,可多次调用,范围参数接受字符串、数组或子查询,'username','1,2,3'; 'username',array(1,2,3); |
order($order) | 设置排序,可以为字符串、数组,如"id DESC,name",array('id'=>'DESC','name') |
limit($limit) | 设置限制,可接受:单个参数数,如 1,单个参数字符串,如'1,10',两个参数数字,如:1,10 |
group($group) | 设置分组,可以传递字符串、数字数组,如"name,sex",array('name','sex') |
having($having, $inConnect, $outConnect) | 分组查询时条件语句,可多次调用,可以为字符串、数组,多次调用本方法时与前面条件使用AND连接,$where参数数组内部的条件默认使用AND连接 |
join($join) | 设置多表连接查询,可多次调用,可以为一维或二维数组,array('table','a.id=b.id','INNER'),第一个参数为数据表,第二个参数为ON条件,第三个参数为类型 |
like($field, $keyword, $matchType) | 关键字条件匹配,$field支持数组或点分字符串传递多个字段,$matchType匹配模式,默认为all,可选left,right |
notLike($field, $keyword, $matchType) | 关键字条件不匹配,$field支持数组或点分字符串传递多个字段,$matchType匹配模式,默认为all,可选left,right |
union($subSql, $isAll) | 设置多表合并查询, 可多次调用,子查询可以使用数字数组传递多个,isAll决定是否UNION ALL |
page($doPage, $startPage, $pageSize) | 设置分页,参数一是否分页,参数二起始页,参数三分页大小 |
data($data) | 待插入或更新数据数组,分解insert、update函数,实现 table($table)->data($data)->insert(); |
from($subSql) | 接受子查询或闭包子查询from(function ($query) {return $query->table('ay_user')->select(false);}) |
relation($field, $array) | 生成待插入或更新的关联数据数组,如 一个用户对应多个角色表数据插入,relation($ucode,$rcodes) |
showSql() | 设置显示输出SQL语句到页面,可选传递布尔值 |
showRs() | 设置直接输出结果到页面,可选传递布尔值 |
3、连贯操作终极方法
操作 | 说明 |
---|---|
select($type) | 获取多条数据,可选$type传递1,2,3返回不同格式数据数组,可传递一个闭包函数 |
find($type) | 获取一条数据,可选$type传递1,2,3返回不同格式数据数组,可传递一个闭包函数 |
column($fields, $key) | 返回指定字段数据数组,可选$key, 传递字段名字符串或数字数组,单个字段,返回一维数组,如果多个字段,返回二维数组数 |
value($field) | 返回指定字段的一条数据的值 |
max($field) | 返回指定列最大值 |
min($field) | 返回指定列最小值 |
avg($field) | 返回指定列平均值 |
sum($field) | 返回指定列合计值 |
insert($data, $batch) | 插入数据,可选传递$data一维或二维数据数组,未传递时使用data()数据,可选$batch是否批量一次性插入,默认true |
insertGetId($data, $batch) | 插入数据返回最后一个ID,可选传递$data一维或二维数据数组,未传递时使用data()数据,可选$batch是否批量一次性插入,默认true |
update($data) | 更新数据,可选传递$data一维数组或字符串,如:"username='xsh'",未传递时使用data()数据 |
setField($field, $value) | 更新指定字段 |
setInc($field, $value) | 字段自增,默认value为1 |
setDec($field, $value) | 字段自减,默认value为1 |
delete($data, $key) | 删除数据,可选data使用字符串或数组设置主键值,可选$key设置主键 |
直接输出
标签 | 说明 | 备注 |
---|---|---|
{include file='head.html'} | 引用文件 | |
{url./home/index/index} | 跳转地址 | |
{DB_HOST} | 系统常量 | |
{$name} | 普通变量 | 即assign('name',$name)方法注入的变量 |
{$user->name} | 对象变量 | 根据控制器注入的变量类型对应使用 |
{$user['name']} | 数组变量 | 同上 |
{$config.public_app} | 配置参数,支持点分多级 | |
{$session.username} | 会话变量,支持点分多级 | |
{$cookie.username} | 会话变量 | |
{$server.name} | 环境变量 | |
{$post.name} | POST数据 | |
{$get.name} | GET数据 | |
{fun=md5('name')} | 使用函数输出 | |
{if(a==b)} aaaa {else} bbbb {/if} | 条件语句 | |
{foreach $var(key,value,num)} [num] [value->name] [value] {/foreach} | 循环语句 | |
{#}...{#} | 代码注释 | |
{php}...{/php} | PHP代码 |
嵌套输出
标签 | 说明 | 备注 |
---|---|---|
[$name] | 普通变量 | |
[$user->name] | 对象变量 | 根据控制器注入的变量类型对应使用 |
[$user['name']] | 数组变量 | 同上 |
[$config.name] | 配置参数,支持多级 | |
[$session.name] | 会话变量,支持多级 | |
[$cookie.name] | 会话变量 | |
[$server.name] | 环境变量 | |
[$post.id] | POST数据 | |
[$get.id] | GET数据 | |
[fun=md5('aaa')] | 使用函数 |
好了,接下来我们手摸手来写一个完整 MVC 结构文件。
1、前端
1.1、准备工作
伪静态操作这里就不赘述了;
设计好业务需求所需的数据库结构;
假设我们需要做一个会员投稿(Contribution);
会员投稿流程就是发布文章到指定的栏目,只是一般状态设置成不显示,然后管理员审核后将状态设置为显示;(深入的业务需求请自行涉及补充)
1.2、创建模型
文件创建路径:apps/home/model/;在该目录下新建文件:ContributionModel.php
<?php
namespace app\home\model;
use core\basic\Model;
class ContributionModel extends Model{
//具体数据库操作方法请自行处理
}
注意细节:
1、命名空间,前面有提到,app开头,当前应用,一般前端就是home,model结尾
2、引入 Controller 基类,让ContributionModel继承Model
1.3、创建控制器
文件创建路径:apps/home/controller/;在该目录下新建文件:ContributionController.php
<?php
namespace app\home\controller;
use core\basic\Controller;
use app\home\model\ContributionModel;
use core\basic\Url;
class CartController extends Controller
{
protected $parser;
protected $model;
protected $htmldir;
public function __construct()
{
// 未登录时跳转到用户登录
if (! session('pboot_uid')) {
location(Url::home('member/login'));
}
$this->model = new ContributionModel();
$this->parser = new ParserController();
$this->htmldir = $this->config('tpl_html_dir') ? $this->config('tpl_html_dir') . '/' : '';
}
public function index(){
$content = parent::parser($this->htmldir . 'member/article_list.html'); // 框架标签解析
$content = $this->parser->parserBefore($content); // CMS公共标签前置解析
$content = str_replace('{pboot:pagetitle}', '我的文章列表', $content);
$content = $this->parser->parserPositionLabel($content, 0, '我的文章列表', Url::home('member/index')); // CMS当前位置标签解析
$content = $this->parser->parserSpecialPageSortLabel($content, - 4, '我的文章列表', Url::home('member/index')); // 解析分类标签
$content = $this->parser->parserAfter($content); // CMS公共标签后置解析
echo $content;
exit();
}
//其他功能自行补充,本文主要讲的是如何创建功能模块
}
注意细节:
1、命名空间,前面有提到,app开头,当前应用,一般前端就是home,controller结尾
2、引入 Model 基类,让ContributionController继承Controller
3、引入上一步创建好的ContributionModel模型,在__construct中进行实例化
4、该功能仅登陆后可用,在__construct中加入登陆状态判断
5、在模板文件夹template/default/html/member/中创建article_list.html文件,该文件即为我的文章列表功能所对应的视图文件。
2、后端
文件地址:apps/common/route.php;打开文件,在该文件中预先写好路由配置。
官方推荐将路由写在config/route.php文件中,升级不会被覆盖。
例如:
// 商城模块
'admin/ShopCategory' => 'admin/shop.ShopCategory',
'admin/Goods' => 'admin/shop.Goods',
'admin/Order' => 'admin/shop.Order',
'admin/Payment' => 'admin/shop.Payment',
我在会员模块下方增加了几个新功能的路由。
另外注意的一个细节就是,后端无需接入parser,直接显示视图文件即可。
例如:
<?php
namespace app\admin\controller\member;
use core\basic\Controller;
use app\admin\model\member\AuditModel;
class AuditController extends Controller
{
private $model;
public function __construct()
{
$this->model = new AuditModel();
}
// 审核列表
public function index()
{
//准备页面所需数据
......
//直接显示模板文件
$this->display('member/audit.html');
}
}
相关说明:
1、终身VIP会员无限制任意下载,免积分。即前往开通>>
2、下载积分可通过日常 签到 以及 积分兑换 等途径获得!
3、本站资源无解压密码.
4、本站资源大多存储在云盘,如出现链接失效请评论反馈。
5、本站提供的免费源码、模板、软件工具等其他资源,均不包含技术服务,请大家谅解!资源仅供参考学习只用,请勿用于任何商业用途,请支持正版。
6、源码、模板等资源会随着技术、环境的升级而存在部分问题,还请慎重选择。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。内容来源:Cms博客
南方小强 » PbootCMS二次开发文档