您当前的位置: 站长圈 > 技术文章 > 后端教程 > phpcms v9二次开发(基础篇)1:前台控制器

phpcms v9二次开发(基础篇)1:前台控制器

来源:站长圈 作者:adminroy 点击: 0

本人资深菜鸟一枚,虽然阿Q老师一再说“二次开发”很简单,不过对我来说简直是遥不可及的梦想——只能仰望啊。眼看大山在前,我是灰心丧气还是应该奋发图强呢?纠结啊~今天终于鼓起勇气,来探一探这“二次开发”的水深水浅,一边学一边写上笔记,以供自己忘了可以反复再看,因为也是刚接触,如果过程中有错误之处,欢迎来站长圈批评指教,群号 42777579。

学的过程中我总结了一下,有几个很重要的方法是一定要学并且最好要很熟悉使用的:
load_config($file, $key = '', $default = '', $reload = false)// 加载配置文件
load_sys_class($classname, $path = '', $initialize = 1)// 加载系统类方法
load_sys_func($func)// 加载系统的函数库
load_app_class($classname, $m = '', $initialize = 1)// 加载应用类方法
load_model($classname)// 加载数据模型
以上5个方法都在phpcms\base.php基础文件里,感兴趣的可以看看它的使用方法,可见base.php这个文件的重要性。
template($module = 'content', $template = 'index', $style = '')// 模板调用
这个函数在phpcms\libs\functions\global.func.php里。
admin_tpl($file, $m = '')// 加载后台模板
这个方法在在phpcms\modules\admin\classes\admin.class.php里

首先,可以去phpcmsv9的官网看它的帮助文档,地址是http://v9.help.phpcms.cn/html/dev/,看一下二次开发的入门基础、结构设计、配置、构建模块,虽然它已经写的很详细了,不过对菜鸟还是不容易理解,所以我还是以我菜鸟的眼光和角度说一些我的理解吧。

 
URL访问
先看一下访问我们网站的几个地址吧
http://wwwquan95.com/(首页)
http://wwwquan95.com/index.php?m=content&c=index&a=lists&catid=6(列表页)
http://wwwquan95.com/index.php?m=content&c=index&a=show&catid=6&id=1(内容页)
用最长的一个网址来分析一下,一个网址可以分几段看,首先是域名http://wwwquan95.com/,后面跟着index.php,然后是?m=content&c=index&a=show,最后是&catid=6&id=1
 
1 http://wwwquan95.com/是我的域名,它相当于http://wwwquan95.com/index.php。为什么访问我们网站的任何一个页面都有index.php呢?因为phpcms v9是采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。这个入口就是根目录下面的index.php文件,打开这个文件看,里面只有简单的3行代码,可是却是整个网站最重要的入口,也是唯一的入口,它做了3件事情:
1.定义了PHPCMS根目录'PHPCMS_PATH'
2.包含了/phpcms/base.php这个基础文件,马上用到了步骤1里定义的根目录
3.调用了pc_base::creat_app();也就是步骤2里的base.php里pc_base类里的一个静态方法creat_app(),它的作用是初始化应用程序(return self::load_sys_class('application');在这个应用程序里它又调用的是系统类库里的application方法,这个方法位于phpcms/libs/classes/application.class.php里,关于调用方法的使用,以后会说到。
所以,虽然看着很简单的一个入口文件,其实包含了无限多的东西。
 
2.那么网址index.php后面跟着的?m=content&c=index&a=show又是什么呢?“m”是模块,“c”是控制器,“a”是事件、方法。这就要说到一个设计模式——MVC,也就是模型-视图-控制器 (MVC),MVC强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型(M)视图(V)控制器(C),它们各自处理自己的任务。这些在帮助文档上都写的很详细,不过小菜鸟完全看不懂哎,那就用比较易懂的方法学一下,看看能不能让自己多理解一点点。

首先,phpcms\modules这里的modules文件夹就是模型文件夹,这个文件夹下面有很多文件夹,每一个文件夹可以看做是一个模型,比如比较眼熟的content文件夹(内容),还有admin(后台)、link(友情链接)、mood(心情)、member(用户)、special(专题)等等。既然一个文件夹就是一个模块,那我现在建一个自己的模块,在modules文件夹里面建一个quan的文件夹,这就是走出二次开发的第一步了,哈哈~

\
这就是网址里的“m”了,所以如果这时候你要访问的地址就是
http://wwwquan95.com/index.php?m=quan

但是不急着访问,因为要访问的页面还没有呢,你只是在去的路上而已。那么“c”在哪里呢?c就是控制器,控制器其实就是这个模块下面的一个php文件,如我们在这个文件夹下面建一个文件index.php,这就是一个控制器。这里要注意的地方是命名规则的问题,首先它必须是一个php文件,你建什么名字是无所谓,可是这个类文件里必须有个同名的类,比如index.php文件里必须有一个index类,如果你的控制器类文件叫mytest.php,那么它里面也必须有个mytest类。(控制器类默认继承系统的函数库,可以直接使用。这个以后介绍)。现在我就建一个index类:

defined('IN_PHPCMS') or exit('No permission resources.');
class index{
    public function init(){
        echo "第一次接触二次开发,测试模块和控制器,一定要成功哦!";
    }
}
?>
解析:defined('IN_PHPCMS') or exit('No permission resources.');意思是确认你有没有定义IN_PHPCMS这个常量,这个常量是在base.php的第一句定义的,也就是说你一定要有唯一入口的通行证才能继续下面的操作,也就是如果要访问这个文件,网址里必须有index.php,因为这个入口文件包含了base.php这个基础文件,不然就会退出程序并提示“没有许可的资源”。

后面就是一个和类文件同名的类index,里面有一个简单的方法init,现在我要访问这个页面的网址就呼之欲出了,域名/index.php?m=模块名&c=控制器名&a=方法名,也就是http://wwwquan95.com/index.php?m=quan&c=index&a=init,终于访问成功,踏出了二次开发的第一步了,噢耶!

这里再重复啰嗦一下,域名后面的index.php是根目录下面的入口文件,不是模块下面我们新建的index.php类文件哦,c=index这里的index才是quan模块下面的index.php类文件。
再顺便说一下init是一个默认的方法,也就是如果你没有指定事件a,它也会默认执行init方法的,所以如果你http://wwwquan95.com/index.php?m=quan&c=index这样访问,在这里结果也是一样的。

下面修改init方法如下:
defined('IN_PHPCMS') or exit('No permission resources.');
class index{
    public function init(){
        if(isset($_GET['id'])){
            echo "第一次接触二次开发,测试模块和控制器,一定要成功哦!";
        }else{
            echo "你没有传参数哦!";
        }
    }
}
?>
用$_GET['id']获取网址里的参数id,用isset()判断有没有这个参数,然后分别测试传参和不传参,如http://wwwquan95.com/index.php?m=quan&c=index&a=init&id=1的最后传了参数id=1,想想看,你访问某个列表页的时候,是不是曾经在网址后面看见catid=6这样的指定哪个栏目的参数的,还有访问内容页的时候,网址后面是不是也有&catid=6&id=1这样指定哪个栏目里的哪条信息的参数的,这时候你终于和我一样恍然大悟这么长一个网址是怎么形成的了吧,这样分段说明是不是很方便理解呢。
 

总结:不知不觉中,我已经基本学习了帮助文档里的入口程序、url访问、创建了一个模块,创建了一个控制器等,一边自己动手一边理解,会比较有学习兴趣,特别是测试成功会大大提高我们的积极性,你觉得呢?,