Home  >  Article  >  Database  >  Elastix1.5.2

Elastix1.5.2

WBOY
WBOYOriginal
2016-06-07 15:38:391153browse

接下来介绍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" );  

}

?>

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn