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设置主键

此模板标签不是前端模板中需要经过二次解析的标签,该文档标签会直接在view中解析。

直接输出

标签说明备注
{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、后端

后端的MVC架构基本与前端一致,只是需要注意后端路由需要手动写入。

文件地址: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二次开发文档

发表评论