Elastix1.5.2

WBOY
WBOY원래의
2016-06-07 15:38:391169검색

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

}

?>

 

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.