转自:http://www.asterisk-r.cn/?p=91 1.Module.xml这个文件用于描述一个模块,包含了模块的名字,版本,类型,种类,预定义的菜单等 Rawname: 必须唯一,还必须和当前模块的目录名称一致,Name:这个是模块的显示名称Description:显示在模块主页上的描述信息,可以是多行Version:当前模块的版本,当更新模块的时候要记得增加版本号,数字的版本只能是(1.2,1.2.2)Type:两个值(setup/tool),setup 通知FreePbx此模块应该出现在安装页面,tool会使模块出现在工具页面,(有两个菜单)Category:当模块被显示出来,模块以及category进行分组,标准的category取值包括modules /core / addonsMenuitems:菜单项,KEY说明唯一的菜单ID,VALUE说明显示名称,可以有定义多项,菜单ID必须唯一并且要连接到当前模块的page.menuid.php文件比如, <timecondition>Time Conditions</timecondition> 显示 “Time Conditions” on the menu, and links to page.timecondition.php.菜单项支持很多的属性Category:分类显示,如果没有指定,默认是模块的类别Display:显示菜单,允许页面显示一个菜单两次,需要两个不同的tag namesType:菜单显示在type里面,当前有效的值有setup/tools,以后可能会扩展很多,默认和模块的Type相同.Href:重写默认的连接,用当前的URL替代,这是唯一有用的方法连接到定制页面,URL必须完整,以http:// 开始。target:连接打开的模式,只有当href被指定才有用,值有:_blank _parent _self _topsort:显示的顺序,取值从-10到10,-5显示在2的前面,默认为0例子:Location:module.tgz的位置,(具体作用未知(更新?))Info:一个包含当前模块更多信息的URL,通常是一个WIKI页在freepbx.org 上面Depends:依赖关系,设置模块的从属关系,允许的值有’version’(freepbx版本,可是以这些操作符>=、)、=、==、《、〈=、!= 默认是>)‘module’:依赖其他的模块,值是一个模块的名字,或者是模块名称后面加一个空格再加一个版本号。‘engine’: The telephony engine (asterisk) name and version required. Follows the same conventions as a module.‘file’:系统中存在的一个文件,使用绝对路径,Depends中所有的值可能用and连接,必须和安装完的模块匹配。Changlog:最近的模块更改记录,Attention:指定的字段,Module.xml 定义了模块的基本信息。2.Functions.inc.php当执行freepbx的任何部分,配置的时候就被加载了,这样允许模块随意的从其他模块调用他的函数。这个文件中包含了多个函数,这些函数被模块的多个地方调用,用于保存/新建/读入模块创建的条目(数据)。必须在模块名称前面加一个下划线,这样避免和其他模块发生冲突。通常包含各种各样的函数==== ”modulename”_destinations() ====返回一个当前模块预定的destinations的2维数组,像是邮件路由,IVR,振铃组这个数组如下:{{{return array(array(‘destination’ => ‘app-blackhole,hangup,1′, ‘description’ => ‘Hangup’,),array(‘destination’ => ‘app-blackhole,congestion,1′, ‘description’ => ‘Congestion’),);}}}‘destination’的值必须是一个有效的目的地在拔叫方案中的‘context,extension,priority’, ‘description’的值会出现在一下destinations的下拉列表框中。==== ”modulename”_get_config() ====这个函数传递一个参数,$engine(翻译成引擎?),当前被使用的engine,通常是asterisk,但是我们还是应该经检测它。这个函数总是申明一个全局变量$ext,这是一个’extensions’类的对象会成了一个拔叫方案。(ApiExtensions extensions类允许很多模块创建拔叫方案代码,加载修改被其他模块创建的代码,这是减少可能发的冲突的好办法 放在extensions.class.php中)Example:{{{function mymodule_get_config($engine) {global $ext;switch($engine) {case ‘asterisk’:// “blackhole” destinations$ext->add(’app-blackhole’, ‘hangup’, ”, new ext_noop(’Blackhole Dest: Hangup’));$ext->add(’app-blackhole’, ‘hangup’, ”, new ext_hangup());$ext->add(’app-blackhole’, ‘congestion’, ”, new ext_noop(’Blackhole Dest: Congestion’));$ext->add(’app-blackhole’, ‘congestion’, ”, new ext_answer());$ext->add(’app-blackhole’, ‘congestion’, ”, new ext_playtones(’congestion’));$ext->add(’app-blackhole’, ‘congestion’, ”, new ext_congestion());$ext->add(’app-blackhole’, ‘congestion’, ”, new ext_hangup());break;}}}}}3.install.sql在安装或者更新的时候直接运行的SQL文件,4.install.php在安装或者更新的时候被加载的情况下执行的PHP脚本。5.Uninstall.sqlA straight(直接) SQL file that is run (if it exists) during uninstallation.6.uninstall.phpA PHP script that is run (by being include()’ed) during uninstallation.7. page.”menitem”’.php这是一个图形界面,当菜单被选择的时候加载,当前有两种方法创建模块,旧方法是定义所有的HTML和表单处理文件。freepbx/trunk/amp_conf/htdocs/admin/modules/core/page.routing.php新方法是使用[wiki:ApiGuiElements GUI Elements API]来定义元素和表单处理的函数。然后放在functions.inc.php里面。这个文件变得相当基础。For an example see [browser:freepbx/trunk/amp_conf/htdocs/admin/modules/core/page.users.php] and [browser:freepbx/trunk/amp_conf/htdocs/admin/modules/core/functions.inc.php]8.CSS/JS files模块可以有CSS和javascript 文件自动的被加载在主模板里面。文件被命名为”modulename”.css, ”menuitem”.css, ”modulename”.js, or ”menuitem”.js中的任何一种,文件会在主模板的<head>部分加载。9.Installing system files一个模块可能加载系统其他地方的文件,比如AGI 脚本,可以执行指定模块的子目录的名字,文件会通过retrieve_conf script连接到适当的位置* ”’agi-bin”’ goes to /var/lib/asterisk/agi-bin* ”’sounds”’ goes to /var/lib/asterisk/sounds* ”’etc”’ goes to /etc/asterisk* ”’bin”’ goes to /var/lib/asterisk/bin这些目录在amportal.conf中定义。注意使用有效合理的使用并且不要和己存在的其他文件冲突,如果目标目录中己经存在一个同名文件,模块文件将不能连接,模块将会出错。