接下来介绍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"
);
}
?>
本文原创发布php中文网,转载请注明出处,感谢您的尊重!