三、 安装(install/index.php)
这个文件是安装页面,一开始就可以看到定义了两个常量:
1
2
|
define( 'INSIDE' , true); define( 'INSTALL' , true); |
因为这两个常量在接下来的代码中总是用到,所以在这里先说明下。INSIDE是用来防止攻击的;INSTALL是用来记录现在是否处于安装游戏的进程中。
接下来Include两个文件:extension.inc和common,这两个都是正宗的php文件。首先extension.inc里面加入了防止攻击的代码,并且把php文件的扩展名隐藏起来,就是这句$phpEx = “php”。那么'common.'.$phpEx其实就是common.php了。
1
|
includeLang( 'install/install' ); |
这句是load语言文件,includeLang()函数声明在includes/unlocalised.php文件中,这个文件中还有很多的小函数。
1
2
3
4
5
6
7
8
9
|
function includeLang ( $filename , $ext = '.mo' ) { global $xnova_root_path , $lang , $user ; if ( $user [ 'lang' ] != '' ) { $SelLanguage = $user [ 'lang' ]; } else { $SelLanguage = DEFAULT_LANG; } include ( $xnova_root_path . "language/" . $SelLanguage . "/" . $filename . $ext ); } |
函数的功能是个根据用户的所用的语种 include 相应的代码,XnovaTC3版本里面是支持每个用户使用不同的语言的,我使用的版本无此功能。
继续往下,取得当前要显示的页面内容,就是到了安装步骤几了;然后进入一个大的switch。在这之前有一个这样的语句:
1
|
$MainTPL = gettemplate( 'install/ins_body' ); |
Gettemplate()函数同样声明在includes/unlocalised.php文件中,
1
2
3
4
5
|
function gettemplate ( $templatename ) { global $xnova_root_path ; $filename = $xnova_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl" ; return ReadFromFile( $filename ); } |
函数的功能是取得一个指定文件的内容,这个指定的文件是这样构成的:
1
|
$ugamela_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl" ; |
TEMPLATE_DIR的值是'templates/',TEMPLATE_NAME的值是'OpenGame',那么前面的 gettemplate
('install/ins_body')就是取得templates/OpenGame/install/ins_body.tpl文件中的内容。这样的函数还有几个,大家都要记住,后面会经常用到。
case ‘intro':
一看就应该知道,是说明介绍的页面,不过里面有个我们首次见到的函数parsetemplate(),声明在includes/unlocalised.php文件中,
1
2
3
|
function parsetemplate ( $template , $array ) { return preg_replace( '#\{([a-z0-9\-_]*?)\}#Ssie' , '( ( isset($array[\'\1\']) ) ? $array[\'\1\'] : \'\' );' , $template ); } |
函数的功能是利用正则表达式,对$template中的特定字符串(就是由 {} 括起来的内容),用$array的值进行替换,来实现多语言功能。
case ‘ins':
这个分枝是具体安装过程,分成4个步骤页面,由$page变量控制显示哪一个页面。
1. 当$page值为1时,先进行一些错误判断;如果没有错误,就读取 templates/install/ins_form.tpl模板,parse出并构成有服务器地址、数据库名、表名前缀、用户名和密码的页面。安装者输入数据后,点击install进入下一步的流程。
2. 当$page值为2时,取得第一步输入的数据,并尝试连接数据库;如果连接不上数据库则提示错误;连上数据库则继续后续的过程,包括:在config.php文件中写入数据库连接信息;根据includes/databaseinfos.php文件内容创建表结构。
3. 当$page值为3时,判断上一步是否发生错误,没有发生则显示一些信息并parse出创建管理员帐号的表单,进入下一个流程。
4. 当$page值为4时,取得上一步输入的数据,有帐号、密码、email等;一些判断之后创建这个管理员帐号,创建的过程以后注册的时候再详细说明。
至此,安装主要过程就结束了,主要步骤就是这些,代码也不难理解。最后还有一个函数要讲解下,就是display(),声明在includes/function.php文件中,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function display ( $page , $title = '' , $topnav = true, $metatags = '' , $AdminPage = false) { global $link , $game_config , $debug , $user , $planetrow ; if (! $AdminPage ) { $DisplayPage = StdUserHeader ( $title , $metatags ); } else { $DisplayPage = AdminUserHeader ( $title , $metatags ); } if ( $topnav ) { $DisplayPage .= ShowTopNavigationBar( $user , $planetrow ); } $DisplayPage .= "<center>\n" . $page . "\n</center>\n" ; // Affichage du Debug si necessaire if ( $user [ 'authlevel' ] == 1 || $user [ 'authlevel' ] == 3) { if ( $game_config [ 'debug' ] == 1) $debug ->echo_log(); } $DisplayPage .= StdFooter(); if (isset( $link )) { @mysql_close( $link ); } echo $DisplayPage ; die (); } |
函数的功能是显示普通用户页眉和管理员页眉的区分,是否显示顶部的信息栏等,此函数中还调用了其他函数,如:StdUserHeader()、AdminUserHeader()、ShowTopNavigationBar()和 StdFooter()都不复杂,其实现都是前面介绍过的 parsetempalte()和gettemplate(),这里就不详细说明了。