phpcms v9 URL访问中的MVC 2

服务器要求

 

PHP 版本 5.2 或更新的版本。

MySQL版本推荐5.0或者更新版本。

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

 

  MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用

 

MVC应用程序被分成三个核心部件:模型(M、视图(V、控制器(C,它们各自处理自己的任务。

 

视图 :

  视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和象XHTMLXML/XSLWML等一些标识语言和Web services。如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

 

模型 :

  模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBsColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

 

控制器 :

  控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。

 

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

文件目录结构

根目录

|  –  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,其中global.func.php为框架中默认加载,global.func.php中函数可直接使用

2. 系统函数库位于系统的phpcms/libs/functions目录下面,函数库文件名为*.func.php

系统类库调用

 

/**

 * 加载系统类方法

 * @param string $classname 类名

 * @param string $path 扩展地址

 * @param intger $initialize 是否初始化

 */

 public static function load_sys_class($classname, $path = '', $initialize = 1) {

   return self::_load_class($classname, $path, $initialize);

 }


示例:

$http = pc_base::load_sys_class('http'); //实例化http

pc_base::load_sys_class('format', '', 0); //调用form类,不进行实例化操作

系统函数库调用

 

 

/**

 * 加载系统的函数库

 * @param string $func 函数库名

 */

 public static function load_sys_func($func) {

   return self::_load_func($func);

 }

 

 

示例:

pc_base::load_sys_func('mail'); 调用mail函数包

入口程序

 

PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。

入口程序是在前期处理用户请求的引导程序。它是唯一一个可以被最终用户可以直接请求运行的。

 

phpcms v9的入口程序包含如下几行:

 

index.php

 

 

<?php

 define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

 include PHPCMS_PATH.'/phpcms/base.php';

 pc_base::creat_app();
                        ?>

 

这段代码首先加载了 phpcms 框架的引导文件 base.php,然后它根据指定的配置文件建立了一个 Web 应用实例并运行。

模块

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方法

 

 /**
                  * 加载配置文件
                  * @param string $file 配置文件
                  * @param string $key  要获取的配置荐
                  * @param string $default  默认配置。当获取配置项目失败时该值发生作用。
                  * @param boolean $reload 强制重新加载。
                  */
                 public static function load_config($file, $key = '', $default = '', $reload = false) {
                    static $configs = array();
                    if (!$reload && isset($configs[$file])) {
                       if (empty($key)) {
                         return $configs[$file];
                       } elseif (isset($configs[$file][$key])) {
                         return $configs[$file][$key];
                       } else {
                         return $default;
                       }
                    }
                   $path = CACHE_PATH.'configs'.DIRECTORY_SEPARATOR.$file.'.php';
                   if (file_exists($path)) {
                     $configs[$file] = include $path;
                   }
                   if (empty($key)) {
                     return $configs[$file];
                   } elseif (isset($configs[$file][$key])) {
                     return $configs[$file][$key];
                   } else {
                     return $default;
                   }
                 }


示例:

调用系统配置中的附件路径

 

$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'),
                  );
                ?>


基中“m”为模型,“c”为控制器,“a”为事件,“data”为其他附加参数。
data为一个二维数组,可设置POSTGET的默认参数。POSTGET分别对应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
 

 

创建模块控制器类

在创建模块中我们已经创建好了一个名为“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.phpinit方法加载一个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_listphpcms\modules\test\templatesmytest_admin_list.tpl.php注意:此处模板必须以.tpl.php 作为后缀

在上面例子中如果要给mytest_admin.phpinit方法加载一个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中方法

PHPSSO 数据库结构 (2010-12-28

PHPSSO 数据库结构 (2010-12-28

表 1 : ps_admin

字段

类型

Null

默认

额外

注释

id

smallint(6)

PK

 

auto_increment

管理员ID

username

char(20)

NO

 

 

用户名

password

char(32)

NO

 

 

密码

encrypt

char(6)

YES

 

 

密码密钥

issuper

tinyint(1)

YES

0

 

是否为超级管理员

lastlogin

int(10)

YES

 

 

最后登陆时间

ip

char(15)

YES

 

 

最后登陆IP

 

 

键名

类型

字段

PRIMARY

PRIMARY

id

username

INDEX

username

 

表 2 : ps_applications

字段

类型

Null

默认

额外

注释

appid

smallint(6) unsigned

PK

 

auto_increment

应用标识id

type

char(16)

NO

 

 

标识类型

name

char(20)

NO

 

 

应用名称

url

char(255)

NO

 

 

应用访问地址

authkey

char(255)

NO

 

 

通信密钥

ip

char(15)

NO

 

 

应用ip地址

apifilename

char(30)

NO

phpsso.php

 

api通信文件名称

charset

char(8)

NO

 

 

应用字符集

synlogin

tinyint(1)

NO

0

 

是否同步登陆

 

 

键名

类型

字段

PRIMARY

PRIMARY

appid

synlogin

INDEX

synlogin

 

表 3 : ps_members

字段

类型

Null

默认

额外

注释

uid

int(10) unsigned

PK

 

auto_increment

用户标识id

username

char(20)

NO

 

 

用户名

password

char(32)

NO

 

 

密码

random

char(8)

NO

 

 

安全码

email

char(32)

NO

 

 

邮箱

regip

char(15)

NO

 

 

注册ip

regdate

int(10) unsigned

NO

0

 

注册时间

lastip

char(15)

NO

0

 

上次登录ip

lastdate

int(10) unsigned

NO

0

 

上次登录时间

appname

char(15)

NO

 

 

用户来源应用名称

type

enum('app','connect')

YES

 

 

用户类型(应用,连接)

avatar

tinyint(1)

NO

0

 

是否有头像

ucuserid

mediumint(8) unsigned

YES

0

 

ucenter用户ID

 

 

键名

类型

字段

PRIMARY

PRIMARY

uid

username

INDEX

username

email

INDEX

email

ucuserid

INDEX

ucuserid

 

表 4 : ps_messagequeue

字段

类型

Null

默认

额外

注释

id

int(10) unsigned

PK

 

auto_increment

识标id

operation

char(32)

NO

 

 

操作称名

succeed

tinyint(1)

NO

0

 

是否完成

totalnum

smallint(6) unsigned

NO

0

 

通知次数

noticedata

mediumtext

NO

 

 

通信数据

dateline

int(10) unsigned

NO

0

 

时间

appstatus

mediumtext

YES

 

 

app通信状态json数组

 

 

键名

类型

字段

PRIMARY

PRIMARY

id

dateline

INDEX

dateline

succeed

INDEX

succeed

succeed

INDEX

id

 

表 5 : ps_session session 存储表

字段

类型

Null

默认

额外

注释

sessionid

char(32)

PK

 

 

 

userid

mediumint(8) unsigned

NO

0

 

用户id

ip

char(15)

NO

 

 

当前ip

lastvisit

int(10) unsigned

NO

0

 

最后访问时间

roleid

tinyint(3) unsigned

YES

0

 

角色id

groupid

tinyint(3) unsigned

NO

0

 

会员组id

m

char(20)

NO

 

 

模块

c

char(20)

NO

 

 

文件名

a

char(20)

NO

 

 

方法

data

char(255)

NO

 

 

数据

 

 

键名

类型

字段

PRIMARY

PRIMARY

sessionid

lastvisit

HASH

lastvisit

 

表 6 : ps_settings

字段

类型

Null

默认

额外

注释

name

varchar(32)

PK

 

 

设置称名

data

text

NO

 

 

设置数据

 

 

键名

类型

字段

PRIMARY

PRIMARY

name

 

posted @ 2013-07-22 17:07  gzm2012  阅读(432)  评论(0编辑  收藏  举报