我,计算机应用技术嵌入式方向出身,从事软件工程师工作,主要负责linux服务器维护,asterisk呼叫中心服务器维护,ERP和CRM系统开发,pbx系统开发,以及网站建设。 希望能交更多的朋友。
全部博文(29)
分类: PHP
2013-06-07 10:39:04
1 Elastix介绍
Elastix 是一种应用软件,它整合了适用于那些基于 Asterisk 的 PBX 的最好工具,并将它们集成为单一的、易用的接口。同时,它增加了自己的工具集,以及允许创建第三方模块来使 Elastix 成为开源电话通信最好的软件包。
Elastix 的目标是可靠性、模块化及易于使用。这些特性加上强大的报告功能,使之成为实现基于 Asterisk 的 PBX 的最好选择。Elastix不但整合了PBX,而且也提供了强大的工具集。它集合了如电子邮箱、语音留言、传真、即时工具、日程安排、报表功能、第三方模 块加载及一些服务器信息查看控制的功能。
2 系统特性分析
2.1 系统目录结构
Elastix 系统的主目录下主要有两个子目录 html 和 db ,其中 html 目录下存放了系统除数据库之外的所有 PHP 文件和 PHP 脚本用到的配置文件,而 db 目录内存放的是 SQLite 文件支持的数据库文件。
默 认情况下 db 目录下的数据文件包括: acl.db 、 calendar.db 、 endpoint.db 、 menu.db 、 samples.db 、 trunk.db 、 address_book.db、email.db、fax.db、rate.db和settings.db。这些数据库中保存了系统使用到的重要数据, 如系统用户信息、系统的菜单信息、系统地址簿系统基本设置信息及其他信息。
html 目录内包含的子目录和文件。有的子目录是系统的一个模块,如 a2billing 、 crm 、 vtigercrm 等等;有的子目录是包含了系统的某些配置特性,如lang、themes、images等等;有些子目录包含对了系统收到的文件,如收到的传真文件存放在 faxes 目录中;有的存放了系统依赖的库文件,如 libs 目录里存放了许多类的声明和一些系统可调用的接口。
a2billing 目录里存放的是电话卡模块的内容; backup 目录里存放的是elastix系统的备份文件,这些文件可以在恢复的时候使用; configs 目录里存放了系统的一些配置文件,这些文件中包含了系统全局信息, PHP 文件中包含这些配置文件即可使用里面的变量; crm目录存放了crm模块的所有框架及内容;faxes目录存放了经由系统发送和接收的传真文件,这些文件都是以pdf格式存放的;help目录里存放 了整个系统的帮助文档结构及内容;images目录里存放了系统使用的图标及图像信息,以及一些模块帮助文档中使用到的图片;includes目录里包含 了系统中某些模块使用的功能实现,如播放通话录音等;lang目录里存放了默认情况下系统支持的本地化语言包,有23个lang文件;libs目录里存放 了系统使用的库文件,主要是一些函数的实现和类的定义;mail目录里存放了RoundCube模块的内容;modules目录里存放了系统中所有类型为 module的模块的内容;panel存放了FOP模块的内容,可通过FOP监控通话情况;static目录里存放了系统中使用的静态页面,有介绍传真工 具的页面、软电话工具的页面以及即时消息的页面;themes目录里存放了系统主框架的集中显示样式及所使用的smarty模板文件;var目录里保存了 系统的缓存文件及系统使用的临时文件;vtigercrm目录里存放了vtigercrm 模块的所有内容。
子目录 modules 中包含了系统中类型为 module 的模块,每个模块独立为一个子目录。
modules 内的子目录,每个子目录就代表系统中的一个模块,对应一个 menu 。每个模块目录内部都至少包含有四个子目录: configs 、 help 、 images 和 themes 。不同的模块可以根据需要添加其他的目录。
有 的模块目录里包含了 lang 目录,该目录里保存了该模块可以使用的本地化语言包。如 calendar 模块目录里就包含了 lang 目录,该目录里默认情况下包含了5种语言包,这些语言包在系统选择某中语言是,系统会查找在该模块中是否包含这种语言的语言包,若有则将该模块进行相应的 本地化,若没有,则使用模块默认的英语。
各个模块目录中, configs 目录中包含了本模块中使用的一些变量,都是以数组的形式存放于该目录中的 conf 文件中; help 目录存放了该模块的帮助文档; images 目录里存放了该模块中使用的图标和帮助文件中使用到的图片; themes 目录里存放的是该模块使用的 smarty 模板文件。还有些模块中有 libs 目录,该目录中存放了该模块的类或实现某些功能的函数。
modules 包含若干的子目录,每个子目录都代表一个模块。里面包含有构建该模块的 PHP 脚本和相关资源。
2.2 整体架构
Asterisk 是 PBX 模块的核心软件。而 PBX 是与系统中其他的功能模块都存在或多或少的联系。各个模块使用的数据库有种类型: SQLite 和 MySQL 。数据库中保存有所有模块使用到的数据。 PBX 上的分机之间经 PBX 与相互联系。各模块经由 PHP 和 HTML 脚本的控制,将 GUI 通过 Web 页面的形式展现在用户面前。
系统的 menu 共分为三级。系统代码中三级 menu 分别被成为 MainMenu 、 subMenu 和 subMenu2 ,我们把这三级 menu 分别称为一级 menu 、二级 menu 和三级 menu 。
2.3 扩展机制
系统具有良好的可扩展性,开发人员可根 据需要开发自己的模块并可通过系统提供的模块加载接口加载到系统中。另外,系统还有另一种类型的模块,该类型的模块是一种独立的框架结构,可以不依赖与整 个 Elastix 系统的框架而独立存在。第一种模块机制成为 module ,后一种称为 framed 。两种类型的模块在数据库 /var/www/db/menu.db 中的 menu 表中有表现,该表最后一个字段 Type 是表示模块类型的。
module 类型模块是依赖于 Elastix 系统的整体框架的,没有系统的整体框架,一个单独的模块是无法运行的。而 Framed 类型的模块虽然说也是以模块的形式集成在 Elastix 系统中的,但是该类模块是可以脱离 Elastix 系统而独立运行的。
在 添加新的模块后,系统界面上必定能出现一个menu与该模块对应,该menu作为系统的一个资源见被添加到数据库中。默认情况下,对于新添加的menu来 说,只有管理员组的成员才能访问,其他组的成员不能访问,只有在管理员将访问权限赋予他组之后,该组成员才能访问。相关数据库结构见后续章节。
2.3.1 Module
Module 类型的模块是 Elastix 系统中最常用的类型。同时,用户可以遵循一定的规则(见后续章节)开发自己的模块来扩展系统的功能。该类型的模块依赖于系统框架,不能脱离系统而单独存 在。用户点击某个 module 类型的 menu 时,首先执行的是该 module 下的 index.php 文件中的 _moduleContent() 函数。
加载 module 类型的模块时,对模块内的目录结构有一定的要求。模块的主目录下必须有 index.php 文件,并且要有 configs 、 help 、 images 和 themes 四个目录。 configs 目录中存放本模块使用到的数组变量; help 目录里存放的是该模块的帮助文件; imags 目录里存放一些图片文件; themes 目录里存放本模块的 smarty 模板文件。
2.3.2 Framed
Framed 类型的模块可以嵌套在 Elastix 系统内部,也可以独立存。一些 menu 对应的模块是 framed 的,其内容显示的风格可以与 Elastix 系统不同。例如, CRM 和 vtigerCRM 都是 Framed 类型的模块。
2.4 用户角色划分
默认情况下, Elastix 系统将用户划分为 4 个组,分别是 administrator 、 Operador 、 extension 和 tel-manger 。 Administrator 是系统管理员,拥有所有的权限,可以对所有资源进行操作访问,其级别是 1 级; Operador 是操作员,其级别是 2 级; extension 是分机,其级别是 3 级; tel-manger 是话机管理员,其级别最低,是 4 级。
系统管理员根据需要, 将某些特性相似的访问权限归为一组,并为该组命名。如 Operador 组,默认情况下,该组具有查看系统信息、通话监控面板、通话录音查看、网络邮箱、语音邮箱、通道使用情况、 CRM 、日历、地址簿等; Extension 可以查看信息系统、网络邮箱、语音邮箱、日历、地址簿、 CRM 等; tel-manger 可以查看通话监控面板、传真查看、 CDR 报告查看、呼叫报告查看等。
这只是默认情况下的分组,管理员还可以增加新的角色组,并赋给新建组对资源的访问权限。
2.5 SESSION 机制
Elastix 系统采用了session 的机制。 session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构 ( 也可能就是使用散列表 ) 来保存信息。一般把 session 文件保存在 /tmp/ 目录下,其名字是类似于 sess_lgdcfeg26f92t6uo1la56bi6m2 的字符串。 Session 文件中保存了维护会话状态参数。
但程序需要为某 个客户端的请求创建一个 session 的时候,服务器首先检查这个客户端的请求里是否包含了一个 session 标识-称为 session id, 如果已经包含一个 session id 则说明以前已经为此客户创建过 session ,服务器就按照 session id 把这个 session 检索出来使用 ( 如果检索不到,则会新建一个 ) 。如果客户请求不包含 session id ,则为此客户创建一个 session 并且生成一个与此 session 相关联的 session id ,这个 session id 将在本次响应中返回给客户端保存。
$_SESSION 数组在整个系统中是个全局变量,即在 session 维持的过程中,它对于整个脚本都是可用的。 $_SESSION 数组中的元素及其值都是在脚本中填入的,填充过后就可以在 session 维持的过程中使用数组中的元素了。
2.6 Smarty 模板的使用
Smarty是PHP常有的GUI模板引擎。Smarty模板的使用很好的使程序的应用逻辑和网页的展现逻辑相分离。它能让开发人员专注于内容的控制或是功能的实现;而样式设计师则可专注于网页排版。
对于Smarty的使用者来说,PHP脚本里不需要做任何解析的动作,Smarty会自动完成这些动作。而且已经编译过的网页,如果模版没有变动的话, Smarty 就自动跳过编译的动作,直接执行编译过的网页,以节省编译的时间。
假设 $tpl 是 smarty 的一个实例,则 smarty 的一些语句格式如下:
PHP 页面变量的赋值: $tpl->assign(“title”, $title);
$tpl->display(‘test.htm’);
HTML 页面变量显示 {$title}
// 条件判断
{if $title==”nihao”} … {else} … {/if}
// 循环的语法
{foreach key=key item=item from=$arr}
{$item.value}
{/foreach}
// 包含文件的方法
{include file=”test.htm”}
// 注释方法
{* *}
{literal} 这里是不译成 SMARTY 模板的 HTML 代码 {/literal}
这只是 smarty 语句的部分格式介绍,若想对 smarty 有更进一步的了解,请参考相关资料。
3 系统依赖重要库介绍
Elastix 系统是 PaloSanto 项目组的成员编写的,同时系统使用了 paloSanto 项目的资源库。这些库文件存放在 /var/www/html/libs目录下。依赖的库文件提供了函数接口供Elastix使用。paloSanto提供的资源库主要是一些基础类。通过 这些类,系统可以很好的实现了用户认证、 menu 的提取和过滤、界面的布局、数据库的操作等等。
同时系统依赖的核心软件是 Asterisk ,必须保证其在后台的正常运行。 Smarty 是 PHP 常用的模板引擎。 SQLite 和 MySQL 是系统使用的两种数据引擎, SQLite 型数据默认情况下存放在 /var/www/db/ 目录下,名字如 acl.db 、 menu.db 等。
默认情况下,系统在使用非 PBX 功能时使用的数据库引擎是 SQLite ,而与 PBX 相关的功能使用的数据库引擎是 MySQL 。 SQLite 是一款轻型的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百 K 的内存就够了。
系统提供了两种数据库类型的接入方法,开发者可以根据需要使用不同的数据库引擎。同时也可以将两种类型的数据进行移植。
接下来介绍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 来查看; 形式如: ;猜测:通常用于带宽不够的情况下。 所以,在这种情况下直接 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” );
}
?>
该博文转自http://itskaka.blog.sohu.com/205506402.html 希望对想了解elastix的同学有帮助
感谢彭韦迪学习资料