注文を再開するためのGLPIプラグインの作成

こんにちは。



今日は、すでにクローズされた注文に基づいて作成された新しい注文を処理するためにGLPIプラグインを作成した方法、またはユーザーから追加の要求を受け取った場合にクローズされた注文を再開する方法について説明します。

背景



ほぼ1か月間、私はGLPIヘルプデスクシステムのソースコードを掘り下げてきました。そして、このオープンソースソリューションを研究している間、私は開発者にとってごくわずかな量の情報に注意を向けました。資料の大部分は、インターフェイス内のGLPI構成に関連しています。少し少なくなりますが、サーバーのセットアップに関する情報を見つけることができます。そして、たった1つの記事(および英語の記事)で、この奇跡のシステム用のプラグインの開発について説明しています。



公式マニュアルから-readthedocsに関するいくつかのリソースに加えて、phpdocから生成されたマニュアル。



コミュニティから-電報と外国のフォーラムでのチャット。

入力パラメータは以下のとおりです。



GLPIヘルプデスクシステムがあります。ユーザーからのアプリケーションは、システムに接続された専用のメールボックスに送信されます。サポートサービスの回答もメールで届きます。一般に、最初の呼び出しから決定および終了までのアプリケーションの進行状況に関するすべての通知は、メールに送信されます。



ただし、ユーザーが自分の問題が適切に解決されていないと考え、アプリケーションを閉じることについての手紙に返信することを決定した場合、新しいチケットを再度開く代わりに、新しいチケットが作成され、古いチケットは単にそれに関連付けられます。実際、この問題は解決されなければなりませんでした。



じゃ、行こう。



最初のステップは、プラグインジェネレータをインストールすることです-将来のプラグインのスケルトンを作成することで、作業が大幅に簡素化されます。これは、次のアルゴリズムを使用して実行できます。



  • (/path/to/glpi/plugins)
  • :



    $ ./plugin.sh YourPluginName 1.0


    YourPluginName — , 1.0 — .



これで、フレームの準備が整いました。



作成したプラグインのディレクトリに移動すると、たくさんのファイルが表示されますが、実際に必要なのはsetup.phpとhook.phpだけです。追加のライブラリを使用する予定の場合は、composer.jsonを離れることができます。これらは必要なかったので、必要なファイルを2つだけ残しました。



2つの必要な機能がありますsetup.phpの-ファイルplugin_init_yourpluginnameplugin_version_yourpluginnameが。 1つ目はプラグインを初期化し、2つ目はプラグインに関する情報(名前、作成者、バージョンなど)を返します。



2つ目では、すべてが多かれ少なかれ明確です。したがって、最初の機能に簡単に焦点を当てます。グローバル変数$ PLUGIN_HOOKSで動作します..。確かに誰もがフックが何であるかを知っていますが、誰かが知らない場合、これはいわゆるです。プラグインがプルするシステムフック。フックの詳細については、公式マニュアルをご覧ください



各プラグインはcsrf_compatibleフックを登録する必要があります。登録しないと、単にアクティブ化できず、次のようなエラーが発生します。





システムを最後まで理解するまで、このパラメーターが何であるかはわかりません。読者の中にGLPIの専門家がいる場合は、コメントに書き込んでください。




必須のフックに加えて、他の多くを登録できます。たとえば、設定ページへのリンクを設定します。



$PLUGIN_HOOKS['config_page']['yourpluginname'] = 'config.php';


プラグインクラスもこの関数に登録されます。

Plugin::registerClass(PluginYourpluginnameConfig::class);
, , , GLPI , . : Plugin + + . , , .



: PluginYourpluginnameConfig, config.class.php. inc ( , , , , — — , - ).



.

フックに戻りましょう。新しいキャンセルチケットの作成を追跡する必要があるため、フックハンドラーpre_item_addを登録しますパラメータをハンドラに渡すことができます。これは、関連付けられた配列を使用して行われます。ここで、キーは目的のエンティティ(私の場合はTicket)のオブジェクトであり、値はハンドラ関数の名前です。



その結果、私の場合、setup.phpファイルに必要な2つの関数は次のようになります。



/**
 * Init hooks of the plugin.
 * REQUIRED
 *
 * @return void
 */
function plugin_init_advtickets() {
   global $PLUGIN_HOOKS;

   Plugin::registerClass(PluginAdvticketsEvent::class);

   $PLUGIN_HOOKS['csrf_compliant']['advtickets'] = true;

   $PLUGIN_HOOKS['pre_item_add']['advtickets'] = [
       Ticket::class => 'plugin_advtickets_pre_item_add'
   ];

}

/**
 * Get the name and the version of the plugin
 * REQUIRED
 *
 * @return array
 */
function plugin_version_advtickets() {
   return [
      'name'           => 'Adv Tickets',
      'version'        => PLUGIN_ADVTICKETS_VERSION,
      'author'         => 'Roman Gonyukov',
      'license'        => '',
      'homepage'       => 'https://github.com/stayfuneral/advtickets',
      'requirements'   => [
         'glpi' => [
            'min' => '9.2',
         ]
      ]
   ];
}


ドキュメントには、クラスの静的メソッドをハンドラーとして登録することが可能であると記載されています。その場合、次のようになります(ちなみに、ハンドラーにパラメーターを渡す必要はまったくありません)。



/*     */

//call a function
$PLUGIN_HOOKS['hook_name']['plugin_name'] = 'function_name';
//call a static method from an object
$PLUGIN_HOOKS['other_hook']['plugin_name'] = ['ObjectName', 'methodName'];


ハンドラー関数自体はhook.phpファイルに保存されます。プラグインのインストールとアンインストールの機能もそこに保存されています。関数名には同じ要件があります-plugin_yourpluginname_function_name。



ちなみに、フックを処理してTicketオブジェクトをパラメータに渡す静的メソッドを登録しようとしましたが、何らかの理由で何も機能しませんでした。しかし、通常の機能では、すべてがうまくいきました。したがって、hook.phpに不要なコードが散らからないようにするために、フックハンドラーメソッドを含むクラスを登録しました。必要な関数では、このメソッドは単に呼び出されました。



// hook.php

/**
 * @param Ticket $ticket
 *
 * @return bool
 */
function plugin_advtickets_pre_item_add(Ticket $ticket)
{
    return PluginAdvticketsEvent::pre_item_add_ticket($ticket);
}


データベースにテーブルをインストールする必要がある場合は、公式ドキュメントにこのトピックに関する別の段落があります。テーブルは必要なかったので、この瞬間はスキップします。



プラグインのインストール/アンインストール、フックハンドラーの登録と呼び出しの方法を理解しました。次に、新しいリクエストを処理する方法を理解します。



これを行うには、前述のように、単一のpre_item_add_ticketメソッドを含むPluginAdvticketsEventクラス(ファイルinc / event.php)を登録しました



class PluginAdvticketsEvent extends CommonDBTM
{
    static function pre_item_add_ticket(Ticket $ticket)
    {
        global $DB;

// ..    ,      input
        $fields = $ticket->input;

//      ,       ( ) 
        if($fields['_link']['tickets_id_2']) {

            $relatedTicketId = $fields['_link']['tickets_id_2'];

            $relatedTicketParamsForUpdate = [
                'itemtype' => \Ticket::class, //  ,    
                'items_id' => $relatedTicketId, // id 
                'users_id' => $fields['_users_id_requester'], // id  
                'users_id_editor' => 0,
                'content' => $fields['content'],  
                'date' => date('c'),
                'date_mod' => date('c'),
                'date_creation' => date('c'),
                'is_private' => 0,
                'requesttypes_id' => $fields['requesttypes_id'], //  (helpdesk, email  ..)
                'timeline_position' => 4,
                'sourceitems_id' => 0,
                'sourceof_items_id' => 0
            ];

//           (    , ),        . ,        glpi_itilfollowups
            $DB->insert('glpi_itilfollowups', $relatedTicketParamsForUpdate);

//     ,    "".        glpi_tickets
            $DB->update('glpi_tickets', [
                'status' => 1
            ], [
                'id' => $relatedTicketId
            ]);

// ..     ,   input  false.       .
            $ticket->input = false;

            return $ticket->input;
        }
    }
}


それで全部です。清聴ありがとうございました。いつものようにgithubのソースコード



便利なリンク:



GLPI公式ウェブサイト

公式フォーラム

テレグラムチャットAPIDoc開発者向けの

プラグイン

ドキュメントの例プラグイン作成に関するドキュメントGLPIプラグイン作成に関する記事








All Articles