2012年12月26日星期三

phpcms总结


表单提交或页面路径跳转可用
'{APP_PATH}index.php?m=member&c=index&a=register&siteid={$siteid}'路径来进行跳转,路由规则同网页相同,{APP_PATH}提供当前网站的IP地址

安装文件夹下extention.inc.php文件中parentid=29是一个固定类型的数值该类型都用29
data=>'s=1'额外添加参数,意思当前链接指向的方法里可用$_GET['s']获取值1
listorder=>0
'display'=>'1' 1为该菜单可用,0为不可用


第一个新建大按钮是在后台类默认列表方法中定义的

语言文件中设置的项在所有前台后台页面模板,和其控制器文件及其模块功能类中可使用通过L('语言键值')获取语言文件中该键值对应文本如:
语言文件中设置 $LANG['input_announce_title']            =    '请输入公告标题!';
后台菜单模版中使用<?php echo L('input_announce_title')?>
在extention.inc.php中$language = array('announce'=>'公告',...)设置的'键=>值'作用效果同语言文件中设置的一样

安装文件夹下的templates下的html模板文件只在安装时存入系统中,安装后可删掉该文件夹,仍可使用此安装模板
最好还是依靠常规的使用模版,不在安装时预装入模版,好控制

sql创建表的语句中表名如:"phpcms_announce",创建的是安装时以"指定前缀名_announce"的表名,如这里不以phpcms开头则创建和这里写的完全同名表名
创建及设置字段语句和常规sql语法完全一致

安装文件夹下的model.php文件
return array('shengMing');这句话意思安装时执行shengMing.sql文件,如要执行多个文件可写成 return array('文件名1','文件名2','文件名3');不用加扩展名

在安装文件夹下所有直接PHP文件内容开头都要加
defined('IN_PHPCMS') or exit('Access Denied');
defined('INSTALL') or exit('Access Denied');
同理在卸载文件夹下所有直接PHP文件都要加
defined('IN_PHPCMS') or exit('Access Denied');
defined('UNINSTALL') or exit('Access Denied');


前台模版中可直接使用PHP代码,并且可直接使用在调用该模版方法中定义的变量


外部访问phpcms无样式
首页样式地址和安装时使用的域名有关系,比如 用127.0.0.1 安装的系统(127.0.0.1代表本地和localhost相当)。生成的样式地址是127.0.0.1/static/css/css.css(例子)
别人通过外部IP来访问网站,因为127.0.0.1系统就会在他本地寻找static/css/css.css这个文件,他本地没有,那么样式就会出不来(找不到文件)。
修改:
一、 进入后台,站点管理片修改域名,改为本机的网址
二、修改 caches\configs\system.php 相关地址路径
三、 更新所有缓存

phpcms二次开发



phpcms二次开发

文件目录结构
根目录
|  –  api  接口文件目录
|  –  caches 缓存文件目录
       |  – configs 系统配置文件目录
       |  – caches_* 系统缓存目录
|  –  phpcms  phpcms框架主目录
       |  – languages 框架语言包目录
       |  – libs 框架主类库、主函数库目录
       |  – model 框架数据库模型目录
       |  – modules 框架模块目录
       |  – templates 框架系统模板目录
|  –  phpsso_server  phpsso主目录
|  –  statics  系统附件包
       |  – css 系统css包
       |  – images 系统图片包
       |  – js 系统js包
|  –  uploadfile  网站附件目录
|  –  admin.php  后台管理入口
|  –  index.php  程序主入口
|  –  crossdomain.xml  FLASH跨域传输文件
|  –  robots.txt 搜索引擎蜘蛛限制配置文件
|  –  favicon.ico  系统icon图标



URL访问
PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。
参数名称    描述    位置    备注
m    模型/模块名称    phpcms/modules中模块目录名称    必须
c    控制器名称    phpcms/modules/模块/*.php 文件名称    必须
a    事件名称        phpcms/modules/模块/*.php 文件中方法名称

模块访问方法[示例]:
http://yourdomain.com/index.php?m=content&c=index&a=show&id=1
其中
m = content 为模型/模块名称 位于phpcms/modules/content
c = index   为控制器名称    位于phpcms/modules/content/index.php
a = show    为方法名称      位于phpcms/modules/content/index.php 中show()方法
id = 1 为其他参数 与正常get传递参数形式相同

如果我们访问您的域名 如:
http://www.yourdomain.com/index.php
phpcms默认路由会定位到content模块的index控制器中的init操作,因为系统在没有指定模块和控制器的时候,会执行默认的模块和操作。
因此下面的URL的结果是相同的:系统还支持URL路由的功能,这些都能够带来其他的url访问效果。
http://www.yourdomain.com/index.php?m=content&c=index&a=init



系统类库与函数调用
1.系统类库位于系统的phpcms/libs/classes目录下面,函数库文件名为*.class.php
2.系统函数库位于系统的phpcms/libs/functions目录下面,函数库文件名为*.func.php,其中global.func.php为框架中默认加载,global.func.php中函数可直接使用
系统类库调用
pc_base::load_sys_class('类名','扩展地址','是否初始化');
示例:
$http = pc_base::load_sys_class('http'); //实例化http类
pc_base::load_sys_class('format', '', 0); //调用form类,不进行实例化操作
系统函数库调用
pc_base::load_sys_func('函数库名');
示例:
pc_base::load_sys_func('mail'); 调用mail函数包



模块
phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块。即url访问中的m
示例:
http://www.yourname.com/index.php?m=content
那么您访问的就是phpcms/modules/content 这个模块。
如果创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了



控制器
phpcms v9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。类名成就是文件名+.php,例如一个名为mytest的控制器,那么他的命名为mytest.php即可。
控制器类默认继承系统的函数库,可以直接使用。控制器类的类名称与控制器文件名必须相同
如果您创建了一个mytest.php在test模块下,那么我们在浏览器里面输入URL:
http://www.yourname.com/index.php?m=test&c=mytest

下面是一个控制器类的基本格式,在构建模块部分会具体讲解
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    function __construct() {
    }
    public function init() {
        echo 'hellp phpcms v9,my name is defalut action';
    }
}
?>
如果你添加的控制器类继承了其他的类,你要小心你的方法名不要和那个类中的方法名一样了,否则你的方法会覆盖原有的。



命名规范
PHPCMS其自身的一定规范。下面是使用PHPCMS做二次开发中应该遵循的命名规范:
类文件需要以.class.php为后缀(这里是指的phpcms的系统类库文件和模块中的类库文件,第三方引入的不做要求),例如http.class.php。
函数文件需要以.func.php为后缀(第三方引入的不做要求),例如mail.func.php。
类名和文件名一致,例如 phpcmsapp类的文件命名是phpcmsapp.class.php。
数据模型需要以“数据表名称_model.class.php”为形式,类名称与文件名必须相同。



配置文件调用
配置文件配置在caches/configs/目录下。
配置文件调用:使用 load_config方法
$upload_url = pc_base::load_config('配置文件','要获取的配置键','默认配置。当获取配置项目失败时该值发生作用','是否强制重新加载');
示例:
调用系统配置中的附件路径
$upload_url = pc_base::load_config('system','upload_url');



二次开发技巧
1.如果要对已存在的控制器进行二次开发,为了方便升级不建议直接对内核文件直接修改该,您可以通过"MY_*.php"的形式进行二次开发。
例如您要对改phpcms/mood/index.php进行二次开发。您可以在与index.php同级的目录下建立"MY_index.php"
MY_index.php代码如下
<?php
class MY_index extends index{
    function __construct() {
        parent::__construct();
    }
    //……your code
 }
 ?>
这样当您通过url访问index控制器的时候,系统会默认指向MY_index.php 并且原文件的方法将被继承,可以直接使用。



数据库配置
数据库配置文件位置:caches/configs/database.php
我们打开这个配置文件,加入我们的数据库配置信息。数据库配置信息为二维数组结构,默认为default,可以根据default结构配置多个数据库链接(如:extended_1)
<?php
return array (
    'default' => array (
        'hostname' => 'localhost',
        'database' => 'phpcms',
        'username' => 'admin',
        'password' => 'admin',
        'tablepre' => 'v9_',
        'charset' => 'gbk',
        'type' => 'mysql',
        'debug' => true,
        'pconnect' => 0,
        'autoconnect' => 0
    ),
    /* 以下格外添加*/
    'extended_1' => array (
        'hostname' => '10.10.125.2',
        'database' => 'phpcms',
        'username' => 'admin',
        'password' => 'admin',
        'tablepre' => 'v9_',
        'charset' => 'gbk',
        'type' => 'mysql',
        'debug' => true,
        'pconnect' => 0,
        'autoconnect' => 0
    ),
);
?>
根据您的数据库连接信息修改上面的配置内容,修改完成后,保存该数据库配置文件。



路由配置
路由配置文件位置:caches/configs/route.php
我们打开这个配置文件,加入我们的路由配置信息。路由配置信息为二维数组结构,默认为default。
路由配置文件内容是这样的:
<?php
return array(
    'default'=>array('m'=>'admin', 'c'=>'index', 'a'=>'init'),
    'test.youname.com'=>array('m'=>'test', 'c'=>'index', 'a'=>'init'),
);
?>
data为一个二维数组,可设置POST和GET的默认参数。POST和GET分别对应PHP中的$_POST和$_GET两个超全局变量。
如下面的例子,在程序中您可以使用$_POST['catid']来得到data下面POST中的数组的值。
data中的所设置的参数等级比较低。如果外部程序有提交相同的名字的变量,将会覆盖配置文件中所设置的值。
如:
<?php
return array(
    'default'=>array(
        'm'=>'phpcms',
        'c'=>'index',
        'a'=>'init',
        'data'=>array(
            'POST'=>array(
                'catid'=>1
            ),
            'GET'=>array(
                'contentid'=>1
            )
        )
    )
)
?>
外部程序POST了一个变量catid=2那么你在程序中使用$_POST取到的值是2,而不是配置文件中所设置的1。



系统配置
系统配置文件位置:caches/configs/system.php
具体详见该文件注释



构建模块
开发流程
为你的phpcms创建一个模块的一般开发流程是:
1.    创建数据库和数据表;(没有数据库操作可略过)
2.    创建模块目录
3.    创建模块控制器类;
4.    创建模块类与模块函数;(如果只是简单的模块可以不必创建)
5.    创建模板文件;
6.    运行和调试。

创建模块
phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块
如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。
例如我要开发一个叫做test的模块,那么首先在 phpcms/modules 目录下创建文件夹,并将其命名为test。
test文件夹下通常有三个文件夹:
classes    为模块类库包
functions  为模块函数库包
templates  为模块模板包 这里通常放置含有权限控制的控制器模板,也就是后台模板。

如果您的模板有单独的前台模板,你需要在phpcms\templates\default下创建一个您的模块目录来放置前台模板
"default"为你的风格包名称,我们默认适用default
这里我们在default文件夹下创建名为test的文件夹存放模板



创建模块控制器
在创建模块中我们已经创建好了一个名为“test”的模块,接下来我们继续为这个模块添加两个控制器类。
phpcms v9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。
类名成就是文件名+.php,例如一个名为mytest的控制器,那么他的命名为mytest.php即可。
控制器类默认继承系统的函数库,可以直接使用。控制器类的类名称与控制器文件名必须相同。

控制器类文件包含两种形式:
1.mytest.php 控制器,前台浏览(不含权限控制)
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    function __construct() {
    }
    public function init() {
        $myvar = 'hello world!';
        echo $myvar;
    }
    public function mylist() {
        $myvar = 'hello world!this is a example!';
        echo $myvar;
    }
}
?>
这个控制器的url访问方法前面已经介绍过了
http://www.yourname.com/index.php?m=test&c=mytest
http://www.yourname.com/index.php?m=test&c=mytest&a=mylist
没有填写 “a” 的情况下,默认调用init方法

2.mytest_admin.php 控制器,后台管理(含权限控制)
后台控制控制器需要加载admin模块下的admin类,并继承该类。
需要注意的是因为你添加的控制器类继承了其他的类,你要小心你控制器的方法名不要和该类中的方法名一样了,否则会造成影响,具体请查看admin类中有哪些方法。
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
class mytest_admin extends admin {
    public function __construct() {
    }
    public function init() {
        $myvar = 'oh,i am phpcmser';
        echo $myvar;
    }
}
?>
在控制器中增加模板调用
phpcms 可以实现完全的模板与程序分离,所以在我们的控制器程序中要加载模板,才可以更友好的显示出来。
1.加载前台模板
前台模板文件在phpcms\templates\default\模块名称 目录中,本示例也就在phpcms\templates\default\test中
加载模板方法如下:
include template('test', 'mytest', 'default');
其中 test为模块名称 mytest 为模板目录下模板名称,default为风格名称,默认不填为defalut
在上面例子中如果要给mytest.php中init方法加载一个mytest的模板,如下
public function init() {
    $var = 'hello world!';
    include template('test', 'mytest', 'default');
}
这样我们通过url访问该方法的时候也就加载了对应的模板。
2.加载后台模板
后台模板文件在phpcms\modules\模块名称\templates 目录中,本示例也就在phpcms\modules\test\templates 中
加载模板方法如下:
include $this->admin_tpl('mytest_admin_list');
其中mytest_admin_list为phpcms\modules\test\templates中mytest_admin_list.tpl.php,注意:后台模板必须以.tpl.php 作为后缀
在上面例子中如果要给mytest_admin.php中init方法加载一个mytest_admin_list的模板,如下
public function init() {
    $myvar = 'oh,i am phpcmser';
    include $this->admin_tpl('mytest_admin_list');
}



创建数据库模型类
数据库模型位于:phpcms/model/ 目录下。
数据模型文件的命名规则建议为数据表名称+'_model.class.php'
如果在我们的创建的模块中我要使用一个数据库"test",首先需要建立一个数据库模型文件,文件名称为'test_model.class.php'
内容如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('model', '', 0);
class test_model extends model {
    public function __construct() {
        $this->db_config = pc_base::load_config('database');
        $this->db_setting = 'default';
        $this->table_name = 'test';
        parent::__construct();
    }
}
?>
注意:
1.数据库模型类名称必须与文件名称相同;
2.$this->db_setting = 'default'为数据库配置文件中配置数据库链接池名称,默认为default,一般情况下不需要修改。
3.$this->table_name = 'test'为数据表名称

这样我们就建立好了一个数据库模型类。
在模块的控制器中使用
$this->db = pc_base::load_model('test_model');
来加载。
具体如下
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    private $db;
    function __construct() {
        $this->db = pc_base::load_model('test_model');
    }
    public function init() {
        $result = $this->db->select();
        var_dump($result);
    }
}
?>
其中$this->db中所支持的方法请参照phpcms/libs/classes/model.class.php中方法

分类: phpcmsV9

PHPCMS v9的源码初读


前两天读了PHPCMS v9的源码

日期:2011-08-22 19:56:49   来源:cms178.com   作者:CMS178
phpcms v9 我是细读了。很有感受,MVC以前都不怎么去关注,这一回我是真的看了。
一、首先是一个index.php
PHPCMS 入口 。统一入口文件。这个没什么多做解释。
二、下一个文件就是phpcms/base.php
这个文件了,它是PHPCMS框架入口文件,他引入了很多的函数库,如:
pc_base::load_sys_func('global'); ————公用函数库
pc_base::load_sys_func('extention');————扩展库
pc_base::auto_load_func();————自动加载的库
还定义了很多的常量,比如:
//PHPCMS框架路径 时间 还定义了网站路径、JS、图片、CSS的路径
load_config为读取配置文件
还有一个pc_base基类
这个类 初始化PHPCMS的应用程序
提供 类库 函数库 和配置文件 的载入方法
初始化PHPCMS的应用程序开始就是:
三、phpcms/libs/classes/application.class.php文件
最先起作用
在其的构造函数中mvc模型就明朗起来
构造函数先从phpcms/libs/classes/param.class.php参数处理类也就是路由配置中
根据统一入口URL的不同行为获取不同的模型、控制器、事件
三个常量 'ROUTE_M' 、'ROUTE_C' 、 'ROUTE_A'
也就是 index.php?m=**** & c=*** & a=****
具体的获取是这样的:
1、先控制器:"m=$$$" “c=***”
如图:\
在 phpcms\modules\$$$\***.php 必须要有个 $$$的文件夹并且下面要有***.php文件
如果没有的话就是错误:“Controller does not exist.”(控制器不存在)
实例子:phpcms\modules\admin\index.php中
admin 就是m=admin
index.php 就是 c=index
也就是说进入后台首页就是要index.php?m=admin&c=index
2、读取模型中的***.php 中的行为:
如:index.php?m=content&c=index&a=lists&catid=6
m=content 和 c=index 不解释了
a=lists 在 phpcms\modules\content\index.php 中
有个方法就是lists()
这个就是这个模型的行为,如果不写a=*** 默认读取 init()
a=*** 如果在文件中不存在的话有“Action does not exist.”这个错误。
在phpcms\modules\content\index.php这个文件中的
如: a=list&catid=6
先找文件中的list()方法
其中要注意:
getcache('xxxx','xxxxx');
//这是读取缓存
返回
下次再读了
以上是我读代码后简单的解释,说得不怎么专业,但我尽量用我自己的语言去描述了

分析phpcms v9执行过程之三


分析phpcms v9执行过程之三

继续介绍分析phpcms v9执行过程---phpcms v9执行过程之三
接下下介绍剩下的执行过程部分:
public static function creat_app() {
return self::load_sys_class('application');
}
在creat_app()中,然后调用load_sys_class();函数,参数为application字符串。
public static function load_sys_class($classname, $path = '', $initialize = 1)
{
return self::_load_class($classname, $path, $initialize);
}
在方法load_sys_class中调用方法_load_class();
private static function _load_class($classname, $path = '', $initialize = 1) {
static $classes = array();
//如果参数$oath为空,则$path=libs/classes
if (empty($path)) $path='libs'.DIRECTORY_SEPARATOR.'classes';
//$key=md5(libs/classesapplication)
$key = md5($path.$classname);
if (isset($classes[$key])) {
if (!empty($classes[$key])) {
//如果$classes[$key]存在,且有值,则返回值
return $classes[$key];
} else {
return true;
}
}
//如果文件E:\wamp\www\phpcms\phpcms\libs\classes\application.class.php存在
if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {
//包含此文件
include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php';
$name = $classname;
//调用静态方法self::my_path(),得到返回值
//是否有自己的扩展文件
public static function my_path($filepath) {
//athinfo() 返回一个联合数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。
//$path['dirname']=E:\wamp\www\phpcms\phpcms\libs\classes\
//$path['basename']=application.class.php $path['extension']=php
$path = pathinfo($filepath);
if (file_exists($path['dirname'].DIRECTORY_SEPARATOR.'MY_'.$path['basename'])) {
return $path['dirname'].DIRECTORY_SEPARATOR.'MY_'.$path['basename'];
} else {
return false;
}
}
//如果application类被扩展,那么就包含扩展的类文件,如My_application.class.php
if ($my_path = self::my_path(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {
include $my_path;
$name = 'MY_'.$classname;
}
if ($initialize) {
//实例化类,最初实例化的是application.class.php,
$classes[$key] = new $name;
} else {
$classes[$key] = true;
}
return $classes[$key];
} else {
return false;
}
}

分析phpcms v9执行过程之二


分析phpcms v9执行过程之二

继续分析phpcms v9执行过程:phpcms v9执行过程之二
PHPCMS执行过程在这application.class.php 文件中,下面我以注释的形式解释PHPCMS执行过程
<?php
/*
* application.class.php PHPCMS应用程序创建类
*/
class application {
/**
* 构造函数,实例化此类的时候,自动执行
*/
public function __construct() {
$param = pc_base::load_sys_class('param'); //实例化param.class.php参数处理类
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST); //new_addslashes()为全局函数
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
}
$this->route_config = pc_base::load_config('route', SITE_URL) ? pc_base::load_config('route', SITE_URL) : pc_base::load_config('route', 'default');

if(isset($this->route_config['data']['POST']) && is_array($this->route_config['data']['POST'])) {
foreach($this->route_config['data']['POST'] as $_key => $_value) {
if(!isset($_POST[$_key])) $_POST[$_key] = $_value;
}
}
if(isset($this->route_config['data']['GET']) && is_array($this->route_config['data']['GET'])) {
foreach($this->route_config['data']['GET'] as $_key => $_value) {
if(!isset($_GET[$_key])) $_GET[$_key] = $_value;
}
}
if(isset($_GET['page'])) $_GET['page'] = max(intval($_GET['page']),1);
return true;
}
define('ROUTE_M', $param->route_m());
/**
* 获取模型
*/
public function route_m() {
$m = isset($_GET['m']) && !empty($_GET['m']) ? $_GET['m'] : (isset($_POST['m']) && !empty($_POST['m']) ? $_POST['m'] : '');
if (empty($m)) {
return $this->route_config['m'];
} else {
return $m;
}
}
define('ROUTE_C', $param->route_c());
define('ROUTE_A', $param->route_a());
$this->init();
}

/**
* 调用件事
*/
private function init() {
$controller = $this->load_controller();
if (method_exists($controller, ROUTE_A)) {
if (preg_match('/^[_]/i', ROUTE_A)) {
exit('You are visiting the action is to protect the private action');
} else {
call_user_func(array($controller, ROUTE_A));
}
} else {
exit('Action does not exist.');
}
}

/**
* 加载控制器
* @param string $filename
* @param string $m
* @return obj
*/
private function load_controller($filename = '', $m = '') {
if (empty($filename)) $filename = ROUTE_C;
if (empty($m)) $m = ROUTE_M;
$filepath = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.$filename.'.php';
if (file_exists($filepath)) {
$classname = $filename;
include $filepath;
if ($mypath = pc_base::my_path($filepath)) {
$classname = 'MY_'.$filename;
include $mypath;
}
return new $classname;
} else {
exit('Controller does not exist.');
}
}
}

分析PHPCMS V9执行过程之一


分析PHPCMS V9执行过程之一

从手册得知PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。
PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。
入口程序是在前期处理用户请求的引导程序。它是唯一一个可以被最终用户可以直接请求运行的。
入口文件:根目录/index.php
<?php
/*
* index.php PHPCMS 入口
*/
//PHPCMS根目录
define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.'/phpcms/base.php';
pc_base::creat_app();
?>
分析:用户的所有请求都要首先被发送到入口文件。
define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);define定义常量PHPCMS_PATH,dirname(__FILE__) 就是取得当前文件所在的目录。通常在配置文件路径的时候用dirname(__FILE__)是非常有效的方法,但是因为__FILE__的路径是当前代码所在文件(而不是url所在文件)完整路径,所以定义配置文件通常要放在根目录下定义网站的根地址,但是下面的方法可以解决配置文件的存放问题。
dirname(dirname(__FILE__)); // 假设__FILE__为 /home/web/config/config.php ,输出为 /home/web
dirname(dirname(__FILE__)); 得到的是文件上一层目录名
dirname(__FILE__); 得到的是文件所在层目录名
即使这个文件被其他文件引用(include或require),__file__始终是它所在文件的完整路径,而不是引用它的那个文件完整路径。 说:在这里,dirname(_FILE_)为服务器根目录.或者写成
E:\wamp\www\phpcms
DIRECTORY_SEPARATOR是目录分离器,在win下是"/" liunx下是"\"
path_separator路径分离器 在win下include多个路径的话,中间用;分割,在liunx下,则是:
在php里是两个常量,都应该大写,他们的作用的是当项目在liunx还是win下,目录和路径查询都正常。/demo (后面没有"/"号)
include PHPCMS_PATH.'/phpcms/base.php';引入base.php文件,
然后通过类名访问方法creat_app();
注意:静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。
在类的外部,可以通过类名::静态属性或者方法来访问,在内部可以使用self::静态属性或者方法。

PHPCMS V9二次开发简明手册


PHPCMS V9二次开发简明手册

模型-视图-控制器 (MVC)

现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

URL访问

URL参数说明
参数
描述
位置
备注
m
模块目录名
phpcms/modules中模块目录名称
必须
c
控制器名称
phpcms/modules/模块/*.php文件名称(与此文件中的类名称相同)
必须
a
事件名称
phpcms/modules/模块/*.php中的方法名称
默认为init 

系统类库与函数库调用

1.   系统类库位于系统的phpcms/libs/classes目录下面,类库文件名为*.class.php
2.   系统函数库位于系统的phpcms/libs/functions目录下面,函数库文件名为*.func.php,其中global.func.php为框架中默认加载,global.func.php中函数可直接使用
系统类库调用
$http = pc_base::load_sys_class('http'); //实例化http
pc_base::load_sys_class('format', '', 0); //调用form类,不进行实例化操作
注解:
pc_base::load_sys_class(
'
类库名',
'
类库所处文件夹(相对于网站根目录,默认为: libs/classes)', 是否(1/0)实例化并返回实例
);
系统函数库调用
pc_base::load_sys_func('mail'); //调用mail函数包,即载入mail.func.php文件
注解:
pc_base::load_sys_func('函数库名称');

命名规范

   1.类文件需要以.class.php为后缀(这里是指的phpcms的系统类库文件和模块中的类库文件,第三方引入的不做要求),例如http.class.php
   2.函数文件需要以.func.php为后缀(第三方引入的不做要求),例如mail.func.php
   3.类名和文件名一致,例如 phpcmsapp类的文件命名是phpcmsapp.class.php
   4.数据模型需要以数据表名称_model.class.php”为形式,类名称与文件名必须相同。

配置文件调用

$upload_url = pc_base::load_config('system','upload_url'); //返回caches/configs/system.php文件中数组的关键字为upload_url的值
注解:
pc_base::load_config(
'配置文件的文件名',
'指定关键字以便返回其对应的元素值,不指定则返回整个数组',
'默认值(默认为空)',
是否(1/0)强制重新加载,默认为false,即调用上次加载的结果
);
对已存在的控制器、类库进行二次开发
在原文件的相同位置创建 MY_原文件名 的文件,其内容一般格式为:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
class MY_原文件中的类名称 extends原文件中的类名称{
     function __construct() {
       parent::__construct();
     }
    ……your code
}
以上并不是通用格式,具体格式要参照着你要二次开发的原文件来书写。
要注意的是,不需要在二次开发的版本中手动载入你扩展的原文件,PHPCMS框架会自动载入的。

创建模块开发流程

为你的phpcms创建一个模块的一般开发流程是:
1.   创建数据库和数据表(没有数据库操作可略过);
2.   创建模块目录(位于 phpcms/modules/ 目录中,可以通过 index.php?m=模块文件夹名 来访问);
3.   创建模块控制器类(通过 index.php?m=模块文件夹名&c=控制器名 来访问控制器类中的init方法,可以通过指定a参数来指定要访问的类方法)、模块类库包(位于phpcms/modules/模块名/classes / 目录下,在控制器类中用 $var = pc_base :: load_app_class('类库名'); 载入)和模块函数库包(位于phpcms/modules/模块名/functions / 目录下,在控制器类中用pc_base :: load_app_func('函数库名'); 载入
4.   创建模型类(位于 phpcms/model/模块名目录中,并在控制器类中使用 $this->db =pc_base::load_model('模型类名'); 来加载。如果只是简单的模块可以不必创建);
5.   创建模板文件(后台模板放在 phpcms/modules/模块名/templates/ 目录下前台模板放在phpcms/templates/default/模块名目录下);
6.   运行和调试。