FreePBXモジュール開発

画像

FreePBXは、アスタリスクベースのサーバーを構成するための最も一般的なWebインターフェイスです。 FreePBXは、柔軟なモジュラーシステムです。 ステーションをチューニングするための豊富な機能を提供します。 最良の部分は、オープンソースプロジェクトです。







実際には、FreePBXの一般的な機能では不十分な固有の問題を解決する必要がしばしばあります。







記事の一部として、追加モジュールの機能を拡張する可能性について説明します。

新しいモジュールを開発するプロセスを説明します...







モジュール開発はいつ必要ですか?



複製された製品 -同じPBXをいくつか維持する必要があり、多くの人が同じ機能を必要とする場合。 例(コールバック、Bitrixチャットとの統合)







セットアップの容易さ -モジュールの読み込みは、設定を手動で編集するよりも簡単で高速です。 一度ロジックを配置すれば、その後の各インストールにかかる時間は短くなります。







エラーの可能性を減らします -通常、テストベンチで基本設定を行います。本番環境に移行するとき、依存関係の問題が発生する可能性があります。 必要なすべてのファイルをモジュールに入れて、インストールできます。







大きな機会 -モジュールの開発により、PBXをより柔軟に/細かく構成できます。たとえば、ダイアプランを再定義したり、既存の回線に優先順位番号まで独自の回線を追加したりできます。







アスタリスクワークフロー-FreePBX-DB





アスタリスクは、データベースを使用して通話履歴を保存できます。

FreePBX-データベースと対話し、設定を保存および受信します。 FreePBXモジュールはデータベースにアクセスして、通話履歴を分析できます。







FreePBXの機能の1つは、構成ファイルの作成とAsterisk AGIスクリプトの配信です。 FreePBXは、アスタリスクシステムディレクトリに関するすべてを認識しており、アスタリスクを管理できます。







FreePBX-モジュラーシステム





FreePBXの基礎は、「 FreePBXフレームワーク 」モジュール(以下、単にフレームワークと呼びます)です。 コアは、他のモジュールを制御するモジュールです。 フレームワークは、基本的なWebインターフェイスを提供します。











各モジュールは、FreePBXの機能を拡張できます。たとえば、構成の追加やWebインターフェイスの拡張などです。

すべてのモジュールはフレームワークに大きく依存しており、他のモジュールにまったく依存しない場合があります。 モジュールの例:









FreePBX設定の保存



FreePBX設定で何かを変更すると、「 Apply Config 」ボタンが表示されます。 次の図は、構成ファイルを生成するプロセスを示しています。









フレームワークモジュールが最初に始まります





さらに、フレームワークは、 コアモジュールなどの追加モジュールを指します





開発者として、モジュールを追加できます





モジュール構造



module.xml

このファイルには、モジュールの基本的なプロパティが記述されています。

最も重要なプロパティ:









ファイル構造の詳細は、 ドキュメントに記載されています

ファイルの例を以下に示します。







<module> <rawname>pt1ctraining</rawname> <name>AA Training module</name> <version>2.11.0.6</version> <publisher>telefon1c.ru</publisher> <license>GPLv3+</license> <licenselink>http://www.gnu.org/licenses/gpl-3.0.txt</licenselink> <category>Applications</category> <menuitems> <pt1ctraining>AA Training module (MIKO LCC)</pt1ctraining> </menuitems> <changelog> *2.11.0.6*   </changelog> <depends> <phpversion>5.3.3</phpversion> <module>pt1c ge 2.11.3.18</module> </depends> </module>
      
      





install.php







このファイルには、モジュールのインストール手順が記載されています。

このスクリプトでは、「グローバルな」FreePBX変数にアクセスできます。







$ db変数を使用すると、FreePBXデータベースと対話できます。

モジュール設定を保存するテーブルを作成する例:







 out("  ."); global $db; $sql = "CREATE TABLE IF NOT EXISTS pt1ctraining ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, pt1ctraining_id INTEGER NOT NULL, description VARCHAR( 150 ), destination VARCHAR( 50 ), content_app text NOT NULL, path_to_php_agi VARCHAR( 50 ) );"; $check = $db->query($sql); if (DB::IsError($check)) { die_freepbx( "Can not create `pt1ctraining` table: " . $check->getMessage() . "\n"); }
      
      





データベース接続パラメーターを指定する必要がないことに注意してください。







変数$ amp_confには、 FreePBX構成パラメーター(通常は/etc/freepbx.confおよび/etc/amportal.confで定義されています)が含まれています。 使用例:







 global $amp_conf; out("AMPDBENGINET: " + $amp_conf["AMPDBENGINE"]);
      
      





out()関数を使用すると、モジュールのインストールに関する情報をメッセージウィンドウに表示できます。









設定-詳細設定 」セクションに設定を追加する例:









 $freepbx_conf =& freepbx_conf::create(); if (!$freepbx_conf->conf_setting_exists('pt1ctraining_test')) { $set = array(); $set['value'] = 'all'; $set['defaultval'] = &$set['value']; $set['readonly'] = 0; $set['hidden'] = 0; $set['level'] = 3; $set['module'] = 'pt1ctraining'; $set['category'] = 'AA Test Module'; $set['emptyok'] = 0; $set['sortorder'] = 11; $set['name'] = 'Test settings.'; $set['description'] = 'Description test settings.'; $set['type'] = CONF_TYPE_TEXT; $freepbx_conf->define_conf_setting('pt1ctraining_test',$set,true); }
      
      





ディレクトリなどagi-bin


モジュールをインストールすると、ディレクトリの内容が対応するアスタリスクディレクトリにコピーされます。









Uninstall.php


このスクリプトは、モジュールを削除する方法を説明しています。 自分で掃除します。







 <?php if (!defined('FREEPBX_IS_AUTH')) { die('No direct script access allowed'); } sql('DROP TABLE pt1ctraining'); ?>
      
      





上記の例では、「 sql 」という名前のグローバル関数を使用する例を説明しています。 引数として、クエリテストを渡してテーブルを削除します。







さらに、ユーザーが承認されているかどうかに関係なく、「 defined( 'FREEPBX_IS_AUTH') 」という興味深い呼び出しが使用されます。 すべてのphpスクリプトに使用することをお勧めします。







index.phpという名前のすべてのスクリプトとファイルはWebサーバーに公開され、外部からアクセスされます。







ユーザーが認証なしでスクリプトにアクセスしようとすると、「 直接のスクリプトアクセスは許可されていません 」という通知を受け取ります









モジュールの中心-functions.inc.php



このファイルでは、モジュールの機能、主要な機能を実装します。









functions.inc.phpでは、設定を生成するときにフレームワークモジュールによって呼び出されるフック 関数を定義できます。







このような関数は、通常次のように呼ばれます。







 function ModuleName_FunctionName($engine) { // // }
      
      





実関数の例


extensions_additional.confでダイヤルプランを定義する







 function pt1ctraining_get_config($engine) { global $ext; switch ($engine) { case 'asterisk': //   . $context = 'ext-pt1ctraining'; $exten = '_X!'; $ext->add($context, $exten, '', new ext_agi('pt1ctraining_AGI.php')); $ext->add($context, $exten, '', new ext_hangup('')); } }
      
      





get_config関数は、構成ファイルの作成時、「 構成適用」ボタンがクリックされたときに呼び出されます。

文字列「 $ engine 」- エンジンの名前。通常は「アスタリスク」がパラメーターとして渡されます。







ダイヤルプランを作成するために、 拡張クラスのインスタンスを含むグローバル変数$ extを使用しました。クラスは/var/www/html/admin/libraries/extensions.class.phpファイルで定義され、 ダイヤルプランを生成するためのツールセットを提供します。







作業の結果はextensions_additional.confに追加されます:







 [ext-pt1ctraining] exten => _X!,1,AGI(pt1ctraining_AGI.php) exten => _X!,n,Hangup
      
      





ext_agiクラスext_hangupクラスextensions.class.phpで定義されています。







extensions_additional.confファイルを[[globals]”セクションに追加する例


 global $ext; //      "global" $ext->addGlobal('PT1C_TR', 'test'); $ext->addGlobal("#include extension_add_pt1c.conf"."\n;", '\n');
      
      





仕事の結果:







 [globals] CFDEVSTATE = TRUE CAMPONTOGGLE = *84 DNDDEVSTATE = TRUE FMDEVSTATE = TRUE PT1C_TR = test #include extension_add_pt1c.conf ; = \n QUEDEVSTATE = TRUE
      
      





改行の形でトリックを使用して追加のファイルを接続しました-他の解決策はまだありません。







詳細設定 」の設定を使用します




FreePBXのグローバル設定を取得します。







 $freepbx_conf =& freepbx_conf::create(); $pt1c_events = $freepbx_conf->get_conf_setting('pt1ctraining_test',true); //  dialplan $ext->add('ext-pt1ctraining-test', '_X!', '', new ext_noop("$pt1c_events")); $ext->add('ext-pt1ctraining-test', '_X!', '', new ext_hangup(''));
      
      





extensions_additional.confファイルの結果:


 [ext-pt1ctraining-test] exten => _X!,1,Noop(Privet!!!) exten => _X!,n,Hangup
      
      





res_odbc_additional.confの編集


コアモジュール機能を使用します。







 global $core_conf, $amp_conf; $section = 'PT1C_asteriskcdrdb'; $core_conf->addResOdbc($section, array('enabled' => 'yes')); $core_conf->addResOdbc($section, array('dsn' => 'MySQL-asteriskcdrdb')); $core_conf->addResOdbc($section, array('pooling' => 'no')); $core_conf->addResOdbc($section, array('limit' => '1')); $core_conf->addResOdbc($section, array('pre-connect' => 'yes')); $core_conf->addResOdbc($section, array('username' => $amp_conf['AMPDBUSER'])); $core_conf->addResOdbc($section, array('password' => $amp_conf['AMPDBPASS']));
      
      





res_odbc_additional.confの作業結果:


 [PT1C_asteriskcdrdb] enabled=>yes dsn=>MySQL-asteriskcdrdb pooling=>no limit=>1 pre-connect=>yes username=>freepbxuser password=>d52d251931c2
      
      





独自の構成を作成する


独自の構成ファイルを作成する必要がある場合があります。

これらの目的のために、「 ModuleName_conf 」という名前のクラスを定義する必要があります。 クラスの例を以下に示します。







 //       . class pt1ctraining_conf { function get_filename() { $files = array( 'extension_additional_pt1ctraining.conf', ); return $files; } function generateConf($file) { switch ($file) { case 'extension_additional_pt1ctraining.conf': return $this->generate_conf(); break; } } function generate_conf() { $output = "[test] ; row 1 \n; Privet"; return $output; } }
      
      





get_filenameメソッドは、作成されるファイルの配列を返します。

generateConfメソッドは、パラメーターとしてファイル名を取り、このファイルのテキストコンテンツを返します。







目的地を定義する




FreePBXで作業したすべての人がSet Destinationフィールドを見ました。 各モジュールは、独自の宛先ポイントを追加できます。 これを行うには、2つの手順を定義する必要があります。







 //         destination. // function pt1ctraining_getdest($exten) { return array('pt1ctraining,'.$exten.',1'); } //   "application"      . // function pt1ctraining_destinations() { $extens[] = array('destination' => 'ext-pt1ctraining,${EXTEN},1' , 'description' => 'IVR'); $extens[] = array('destination' => 'ext-pt1ctraining_2,${EXTEN},1', 'description' => 'IVR_2'); $extens[] = array('destination' => 'ext-pt1ctraining_3,${EXTEN},1', 'description' => 'IVR_3'); return $extens; }
      
      





pt1ctraining_getdest関数は、1つの流出値を持つ配列を返す必要があります。 形式は「 array( 'ModuleName、'。$ Exten。 '、1') 」です







pt1ctraining_destinations関数は、宛先ポイントを持つ配列を返す必要があります。

配列の各要素は、2つのキーを持つ連想配列です。

' Destination' -Goto互換パラメーターが含まれています。将来的には、Gotoを使用してダイヤルプランでリダイレクトが実行されます

' Description 'には、宛先ポイントの名前が含まれます。これは、値がユーザーに提示される方法です。







モジュールページ



モジュールのディレクトリでは、「 page.ModuleName.php 」という形式の名前のファイルをいくつでも定義できます(例:「 page.pt1ctraining.php 」)。







これらのファイルでは、ユーザーインタラクション用のhtmlフォームを定義できます。







Webインターフェースがページの存在を「 学習 」するには、「 menuitems 」タグ内の「 module.xml 」ファイル内のページ識別子を、ページ名タグとともにポイントする必要があります。







 <menuitems> <pt1ctraining>AA Training module (MIKO LCC)</pt1ctraining> </menuitems>
      
      





ページの例


 <form autocomplete="off" name="edit" action="<?php $_SERVER['PHP_SELF'] ?>" method="post" onsubmit="return edit_onsubmit();"> <input type="hidden" name="itemid" value="<?php echo $itemid?>"> <input type="hidden" name="action" value="<?php echo ($itemid ? 'edit' : 'add') ?>"> <table> <tr><td colspan="4"><h5> <hr></h5></td></tr> <tr> <td><a href="#" class="info"><span> </span></a></td> <td><input type="text" name="description" class="" value="<?php echo($thisItem['description']); ?>"></td> </tr> <tr> <td><a href="#" class="info">Dialplan:<span>Text dialplan application.</span></a></td> <td><textarea name="content_app" cols=50 rows=5><?php echo($thisItem['content_app']); ?></textarea></td> </tr> </table> </form>
      
      





モジュールの組み立て



ここではすべてが簡単です。モジュールパッケージはtarを使用して実行する必要があります。







 tar -czf pt1ctraining “pt1ctraining-2.11.0.6.tgz";
      
      





モジュールがFreePBX 12+用に準備されている場合は、開発者のデジタル署名を使用してモジュールに署名することをお勧めします 。詳細は公式ドキュメントに記載されています







devtoolsユーティリティパッケージを使用しモジュールに署名できます







 sign.php pt1ctraining "KEY"
      
      





ここで、「 pt1ctraining 」はモジュールのあるディレクトリです。







おわりに



FreePBXは興味深いプラットフォームです。 PBXをセットアップするための広範な機能を提供します。

FreePBXの機能が十分でない場合は、追加のモジュールを使用して機能セットを拡張できます。







独自のモジュールを使用すると、PBXをさらに細かく調整できます。









知識のソースとして使用することをお勧めします。










All Articles