elastix mysql_Elastix1.5.2

接下来介绍Elastix1.5.2-2的主index.php,这里主要是对该文件的源码标注,大家看后应该会对系统的整个框架会有大体上的认识。 ?php /* 包含 misc.lib.php 文件。该文件包含提供了一些基本的函数接口,这些接口的功能有获取系统信息(内存信息、 CPU 信息、硬

接下来介绍Elastix1.5.2-2的主index.php,这里主要是对该文件的源码标注,大家看后应该会对系统的整个框架会有大体上的认识。

/*

包含

misc.lib.php

文件。该文件包含提供了一些基本的函数接口,这些接口的功能有获取系统信息(内存信息、

CPU

信息、硬盘信息)、构建合法的

URL

、转换日期格式(如将

1 Apr 2010

转化为

2010-4-1

)、获取或修改数据表

ettings

的字段值、获取

elastix

版本信息、加载显示的主题、加载用户选择的语言、获取所有菜单、获取语言种类等等。

*/

include_once

(

"libs/misc.lib.php"

);

/*

包含

default.conf.php

文件。该文件中包含了一个全局数组

$arrConf

,数组中存储了系统主目录、系统运行用到的目录、系统的主题属性、系统默认所使用的语言种类等信息。使用该数组时,包含之即可。

*/

include_once

"configs/default.conf.php"

;

/*

包含文件

paloSantoNavigation.class.php

文件。该文件中定义了一个名为

paloSantoNavigation

的类。该类主要是对一些

menu

操作的封装,包括获取菜单、显示菜单、内容显示、获取服务器名、获取服务器

IP

。其中该类中有一个成员函数名为

showConent(),

index.php

文件,若存在此文件则执行该文件中的

_moduleContent()

函数。各个模块的特有内容显示就交由各个模块负责。

*/

include_once

"libs/paloSantoNavigation.class.php"

;

/*

包含

paloSantoDB.class.php

文件。该文件中定义了一个名为

paloDB

的类。该类封装了一些数据库操作的方法,为用户访问数据提供了接口。该类的方法支持对

sqlite

MySQL

两种数据库类型的操作。

*/

include_once

"libs/paloSantoDB.class.php"

;

/*

包含

paloSantoACL.class.php

文件。该文件中定义了一个名为

paloACL

的类。该类主要对系统用户的访问操作级别进行了划分。默认情况下,

elastix

用户被分为四个组(

Administrator

Operador

Extension

Tel-manger

),管理员还可以创建新的用户组并为各组指定可以访问的菜单,可以新建用户,删除组,删除用户,给各组划分权限等。

*/

include_once

(

"libs/paloSantoACL.class.php"

);

// Don activate

unless you know what you are doing. Too risky!

//

开发人员开发时使用的开关。当

$developerMode=true

时,不需身份认证可以进入系统并显示所有的菜单。

$developerMode

=

false

;

//

设置当前

session

的名字为

elastixSessin

,用在

session_start()

之前

session_name(

"elastixSession"

);

//session_start()

有两个作用

//1.

创建一个新的

session;

//2.

恢复当前的

session

,该

session

是由

GET

方法、

POST

请求或

COOKIE

session

标识符来确定的

//

另外,在使用基于

cookie

session

时,必须把

session_start()

放在向浏览器输出的动作之前。

session_start();

//

只要连接到服务器,就开始

session

// GET

方法得到的是

logout

操作

if

(

isset

(

$_GET

[

'logout'

]) &&

$_GET

[

'logout'

]==

'yes'

) {

session_destroy();

//

销毁所有与当前

session

有关的数据

session_name(

"elastixSession"

);

//

重新设置

session

的名字

session_start();

//

创建新的

session

,回到登录界面,重新开始

session

}

//cargar el archivo de idioma

//$lang=isset($arrConf['language'])?$arrConf['language']:"en";

//include_once("lang/".$lang.".lang");

//

获取系统显示所使用的语言包。该函数定义在

misc.lib.php

文件中。

load_language()

在加载使用的语言时,先检查

settings

数据表中

key

字段为

language

的值,若该值存在,则加载该语言包;若该值为空,则查看全局数组中

$arrConf[‘language’]

是否被设置,若设置了,则调用相应的语言包;若没有设置则使用默认的英语语言包。

load_language();

//

实例化一个

paloDB

对象,设置使用的数据源为

acl.db

$arrConf['elastix_dsn']['acl']

的值

//是

"sqlite3:var/www/db/acl.db"

acl.db

数据包含了

9

个数据表。

$pDB

=

new

paloDB(

$arrConf

[

'elastix_dsn'

][

'acl'

]);

//

若在实例化

paloDB

对象时,数据库产生错误,则输出错误信息

if

(!

empty

(

$pDB

->errMsg)) {

echo

"ERROR DE DB:

$pDB

->errMsg

"

;

}

//

$pDB

为参数实例化一个

paloACL

对象

$pACL

$pACL

=

new

paloACL(

$pDB

);

//

若在实例化

paloACL

过程中产生错误,则输出错误信息

if

(!

empty

(

$pACL

->errMsg)) {

echo

"ERROR DE DB:

$pACL

->errMsg

"

;

}

// Load smarty

require_once

(

"libs/smarty/libs/Smarty.class.php"

);

//

包含

Smarty

类文件

$smarty

=

new

Smarty();

//

实例化一个

Smarty

类的对象

$smarty

//

$smarty

的一些变量赋值。设置模板所在的目录

$smarty

->template_dir =

"themes/"

.

$arrConf

[

'mainTheme'

];

//

若发现系统中任何

tpl

文件有改动,则需要对其进行重新编译,编译后放在

/var/www/html/var/templates_c/

目录下

$smarty

->compile_dir =

"var/templates_c/"

;

//

设置配置文件所在的目录,文件名一般以

.conf.php

结尾,保存一些变量等信息

$smarty

->config_dir =

"configs/"

;

//

设置保存缓冲文件的目录

$smarty

->cache_dir =

"var/cache/"

;

//$smarty->debugging =

true;

//- 1) SUBMIT. Si se hizo submit

en el formulario de ingreso

//-

autentico al usuario y lo ingreso a

la sesion

//

若点击了提交按钮且用户名非空

if

(

isset

(

$_POST

[

'submit_login'

]) and !

empty

(

$_POST

[

'input_user'

])) {

$pass_md5

= md5(

$_POST

[

'input_pass'

]);

//

把用户输入的密码用

MD5

加密赋值给

$pass_md5

//

若经验证时

elastix

的合法用户且密码正确,则做一些赋值操作

if

(

$pACL

->authenticateUser(

$_POST

[

'input_user'

],

$pass_md5

)) {

//

将用户名赋值给

session

的一个变量中,以便以后用来确定登录的用户

$_SESSION

[

'elastix_user'

] =

$_POST

[

'input_user'

];

//

将用户登录使用的密码存储在

session

的变量中

$_SESSION

[

'elastix_pass'

] =

$pass_md5

;

}

else

{

//

若用户验证没通过,

DO NOTHING!!!!!

此处可以不作处理,也可以输出一些提示信息,要求用户重新输入用户名和密码。/因

为只有两种情况下程序才能走到这里:只输入了用户名(不论该用户是否存在)而没有输入密码、输入了错误的用户名和密码。

// Debo hacer algo aqu

?

}

}

//

实例化一个

paloDB

对象,使用的数据库是

menu.db

menu.db

中只有一个数据表

menu

,该表中存储了所有的菜单项

$pDBMenu

=

new

paloDB(

$arrConf

[

'elastix_dsn'

][

'menu'

]);

//

加载菜单表的内容,并把菜单结构赋值给

$arrMenu

,此时

$arrMenu

里保存了所有菜单的结构,

cargar_menu()

函数的定义

misc.lib.php

文件里,负责把

menu

表中的内容以数组的形式读出来。

$arrMenu

= cargar_menu(

$pDBMenu

) ;

//

判定是否是正宗的用户,包括验证用户名和密码;或者是否处于开发状态

// 2) Autentico usuario

if

(

isset

(

$_SESSION

[

'elastix_user'

]) &&

isset

(

$_SESSION

[

'elastix_pass'

]) &&

$pACL

->authenticateUser(

$_SESSION

[

'elastix_user'

],

$_SESSION

[

'elastix_pass'

]) or

$developerMode

==

true

) {

//$developerMode==true

是开发时用的开关,此时无需身份验证即可登录。

//

搜索登录用户在

acl_user

表中对应的

id

,保存为

$idUser

acl_user

表在数据库

acl.db

中。

$idUser

=

$pACL

->getIdUser(

$_SESSION

[

'elastix_user'

]);

//

检查

$_SESSION['elastix_user_permission'])

是否被赋值。如果是全新的登录,则该变量是未被赋值的,该判断为真,进入

if

内部,经过一些操作,将该登录用户可以访问的菜单赋值给该变量。

if

(!

isset

(

$_SESSION

[

'elastix_user_permission'

])){

if

(

$developerMode

!=

true

) {

//

不是出于开发模式,

$developerMode

为真时,开发人员可以访问所有

menu

//

声明

$arrMenuFiltered

是数组类型变量,用来存储登录用户能访问的所有

menu

$arrMenuFiltered

=

array

();

//-

TODO

: Mejorar el siguiente bloque. Seguro debe de haber una forma mas

//-

eficiente de hacerlo

//

安全必须是一个做更有效的方法

//- Primero me barro todos los submenus

首先,我扫了所有子菜单

$arrSubmenu

=

array

();

//

声明

$arrSubMenu

是数组类型变量,用于暂存登录用户有访问权限的

menu

//

下面是获取所有子菜单

foreach

(

$arrMenu

as

$idMenu

=>

$arrMenuItem

) {

//

遍历加载的

menu

数组

if

(!

empty

(

$arrMenuItem

[

'IdParent'

])) {

//

如果当前

menu

不是顶级

menu

//

如果登录的用户对当前遍历到的菜单有

access

的权限

if

(

$pACL

->isUserAuthorizedById(

$idUser

,

"access"

,

$idMenu

)) {

//

$arrMenuItem

数组赋值给

$arrSubmenu[$idMenu]

并赋值给

$arrMenuFiltered[$idMenu]

。第一个赋值是为了后面

子菜单寻找其父菜单用;第二个赋值是将整个

menu

数组存储在

$arrMenuFiltered

数组中,包括父菜单和子菜单。

$arrSubmenu

[

$idMenu

] =

$arrMenuItem

;

$arrMenuFiltered

[

$idMenu

] =

$arrMenuItem

;

}

}

}

//

获取顶级菜单

//- Ahora me barro el menu principal

现在我打扫主菜单

foreach

(

$arrMenu

as

$idMenu

=>

$arrMenuItem

) {

if

(

empty

(

$arrMenuItem

[

'IdParent'

])) {

//

父菜单项为空,表明是顶级菜单

//

遍历所有

menu

以便获取各个子

menu

的父

menu

是谁

foreach

(

$arrSubmenu

as

$idSubMenu

=>

$arrSubMenuItem

) {

//

找出各个父

menu

拥有的子

menu

,将子

menu

归类到父

menu

if

(

$arrSubMenuItem

[

'IdParent'

]==

$idMenu

) {

$arrMenuFiltered

[

$idMenu

] =

$arrMenuItem

;

}

}

}

}

}

else

{

//

若是开发模式,则把所有的菜单赋值给筛选用的变量

$arrMenuFiltered

=

$arrMenu

;

}

//Guardo en la session los menus

q tiene con permisos el usuario logoneado, esto se implement

para mejorar

//el proceso del httpd ya que consumia mucho recurso.

Reportado por Ana Vivar

//Una vez q exista en la session

solo se lo sacara de ahi y no se vovera a consultar a la base.

//

将筛选后的菜单赋值给全局变量

$_SESSION[‘elastix_user_permission’]

,在整个

session

期间可以直接使

//用该变量

$_SESSION

[

'elastix_user_permission'

]=

$arrMenuFiltered

;

}

//

$_SESSION[‘elastix_user_permission’]

不为空,则将其赋值给

$arrMenuFiltered

数组。此处应加

//

else

,当用户

第一次登录时,此赋值多余

$arrMenuFiltered

=

$_SESSION

[

'elastix_user_permission'

];

//traducir el menu al idioma correspondiente

//

按照本地语言配置,将当前用户可见的菜单名称翻译为用户选择的本地语言

foreach

(

$arrMenuFiltered

as

$idMenu

=>

$arrMenuItem

) {

$arrMenuFiltered

[

$idMenu

][

'Name'

]=

isset

(

$arrLang

[

$arrMenuItem

[

'Name'

]])?

$arrLang

[

$arrMenuItem

[

'Name'

]]:

$arrMenuItem

[

'Name'

];

//$arrLang

default.conf.php

有定义。

$arrLang

数组定义了使用到的数据源、

elastix

主目录、显示主题、默认显示语

言、系统备份目录等信息。

}

//

实例化一个

paloSantoNavigation

对象

$oPn,

把准备好的变量作为参数。其中,

$arrConf

定义在

default.conf.php

文件

中;

$arrMenuFiltered

存储的是登陆用户有访问权限的

menu

数组;

$smarty

Smart

类的一个对象,通过其成员函数

assign()

给一些

smarty

变量赋值。

$oPn

=

new

paloSantoNavigation(

$arrConf

,

$arrMenuFiltered

,

$smarty

);

//

通过

smarty

assign

函数对

tpl

模板文件用到的基本变量赋值;

THEMENAME

是用户登录后显示主题的变量;

ABOUT_ELASTIX

ABOUT_ELASTIX_CONTENT

LOGOUT

等都会以相应的翻译后的值。

$arrLang

global

变量。

该变量在用户选择的语言包(如

cn.lang

)里面定义的,每个

.lang

文件都有定义。

$smarty

->assign(

"THEMENAME"

,

$arrConf

[

'mainTheme'

]);

$smarty

->assign(

"ABOUT_ELASTIX"

,

$arrLang

[

'About Elastix'

].

" "

.

$arrConf

[

'elastix_version'

]);

$smarty

->assign(

"ABOUT_ELASTIX_CONTENT"

,

$arrLang

[

'About Elastix

Content'

]);

$smarty

->assign(

"ABOUT_CLOSED"

,

$arrLang

[

'About Elastix

Closed'

]);

$smarty

->assign(

"LOGOUT"

,

$arrLang

[

'Logout'

]);

//$menu=

(isset($_GET['menu']))?$_GET['menu']:'';

if

(

isset

(

$_GET

[

'menu'

]))

$menu

=

$_GET

[

'menu'

];

//

获取

URL

menu

参数值

elseif

(

empty

(

$menu

) and !

empty

(

$_SESSION

[

'menu'

]))

$menu

=

$_SESSION

[

'menu'

];

else

$menu

=

''

;

//

把菜单存储到

$_SESSION[‘menu’]

中,在

session

中保持该值

$_SESSION

[

'menu'

]=

$menu

;

//

若得到可访问的菜单,则把

menu

赋值给

MENU

,将来会通过

smarty

模板显示

$MENU

if

(count(

$arrMenuFiltered

)>

0

)

$smarty

->assign(

"MENU"

,

$oPn

->showMenu(

$menu

));

else //

若没有可以显示的菜单,则会输出

”No modules”

$smarty

->assign(

"MENU"

,

"No modules"

);

// rawmode es

un modo de operacion que pasa directamente a la pantalla la salida

// del

modulo. Esto es util en ciertos casos.

//rawmode

是一种显示模式,该模式下的显示已经去除了背景、样式、以及其他

MENU

等信息,直接显示子

MENU

的内容。

在页面上没有与其对应的按钮或链接,但是可以在进入菜单后通过手工修改浏览器地址栏的

URL

来查看;

形式如:

http://192.168.1.183/?rawmode=yes

;猜测:通常用于带宽不够的情况下。

所以,在这种情况下直接

showContent

而不是采用

smart

模板;否则采用

smarty

模板

if

(

isset

(

$_GET

[

'rawmode'

]) &&

$_GET

[

'rawmode'

]==

'yes'

) {

// Autorizacion

if

(

$pACL

->isUserAuthorizedById(

$idUser

,

"access"

,

$oPn

->currSubMenu) or

$developerMode

==

true

) {

echo

$oPn

->showContent();

}

}

else

{

// Autorizacion

//

如果登录的用户对子目录有访问权限,则将子目录的内容赋值给

CONTENT

if

(

$pACL

->isUserAuthorizedById(

$idUser

,

"access"

,

$oPn

->currSubMenu) or

$developerMode

==

true

) {

$smarty

->assign(

"CONTENT"

,

$oPn

->showContent());

}

//

smarty

display

函数显示

index.tpl

的内容,

$MENU

$CONTENT

已经有值

$smarty

->display(

"_common/index.tpl"

);

}

//

若登录不成功,则要求重新登录

}

else

{

$smarty

->assign(

"PAGE_NAME"

,

$arrLang

[

'Login page'

]);

$smarty

->assign(

"WELCOME"

,

$arrLang

[

'Welcome to

Elastix'

]);

$smarty

->assign(

"ENTER_USER_PASSWORD"

,

$arrLang

[

'Please enter

your username and password'

]);

$smarty

->assign(

"USERNAME"

,

$arrLang

[

'Username'

]);

$smarty

->assign(

"PASSWORD"

,

$arrLang

[

'Password'

]);

$smarty

->assign(

"SUBMIT"

,

$arrLang

[

'Submit'

]);

//

赋值完成后,通过

login.tpl

模板显示出来

$smarty

->display(

"_common/login.tpl"

);

}

?>

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值