Elastix1.5.2-2源码分析(一)
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() 函数。
php订单管理系统源码加载 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 的内存就够了。
系统提供了两种数据库类型的接入方法,开发者可以根据需要使用不同的数据库引擎。同时也可以将两种类型的数据进行移植。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。