كتابة ملحق GLPI لإعادة فتح الطلبات

مرحبا.



سنتحدث اليوم عن كيفية كتابة المكون الإضافي GLPI للعمل مع الطلبات الجديدة التي تم إنشاؤها على أساس الطلبات المغلقة بالفعل ، أو بالأحرى إعادة فتح الطلبات المغلقة ، إذا تم تلقي طلبات إضافية من المستخدم لهم.

الخلفية



منذ ما يقرب من شهر وأنا أحفر في الكود المصدري لنظام مكتب المساعدة GLPI. وعند دراسة هذا الحل مفتوح المصدر ، لفتت الانتباه إلى القدر الضئيل من المعلومات للمطورين. ترتبط الغالبية العظمى من المواد بتكوين GLPI داخل الواجهة. أقل قليلاً ، ولكن لا يزال بإمكانك العثور على معلومات حول إعداد الخادم. ومقال واحد فقط (والآخر باللغة الإنجليزية) يتحدث عن تطوير المكونات الإضافية لهذا النظام المعجزة.



من الكتيبات الرسمية - زوجان من الموارد على محررات القراءة ، بالإضافة إلى دليل تم إنشاؤه من phpdoc



من المجتمع - دردشة في البرقية ومنتدى أجنبي.

معلمات الإدخال كما يلي.



يوجد نظام مكتب مساعدة GLPI. يتم إرسال التطبيقات من المستخدمين إلى صندوق بريد مخصص متصل بالنظام. كما تصل استجابة الدعم عن طريق البريد. بشكل عام ، يتم إرسال جميع الإخطارات حول تقدم الطلب من المكالمة الأولى إلى القرار والإغلاق إلى البريد.



ومع ذلك ، إذا اعتبر المستخدم أن مشكلته لم يتم حلها بشكل صحيح وقرر الرد على الرسالة المتعلقة بإغلاق التطبيق ، فبدلاً من إعادة فتح تذكرة جديدة ، يتم ربط التذكرة القديمة بها. في الواقع ، كان لا بد من حل هذه المشكلة.



إذا هيا بنا.



الخطوة الأولى هي تثبيت منشئ البرنامج المساعد- يبسط الحياة بشكل كبير من خلال إنشاء الهيكل العظمي للمكوِّن الإضافي المستقبلي. يمكن القيام بذلك باستخدام الخوارزمية التالية:



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



    $ ./plugin.sh YourPluginName 1.0


    YourPluginName — , 1.0 — .



وهذا كل شيء ، الإطار جاهز.



بالذهاب إلى دليل البرنامج المساعد الذي قمت بإنشائه ، سترى مجموعة من الملفات ، من بينها فقط setup.php و hook.php. إذا كنت تخطط لاستخدام مكتبات إضافية ، فيمكنك ترك composer.json. لم أكن بحاجة إلى هذه الملفات ، لذلك تركت ملفين ضروريين فقط.



هناك وظيفتان مطلوبتان في ملف setup.php - plugin_init_yourpluginname و plugin_version_yourpluginname . الأول يقوم بتهيئة المكون الإضافي ، والثاني يعرض معلومات عنه - الاسم ، المؤلف ، الإصدار ، إلخ.



مع الثانية ، كل شيء أكثر أو أقل وضوحًا. لذلك ، سوف نتناول بإيجاز الوظيفة الأولى. إنه يعمل مع المتغير العام $ PLUGIN_HOOKS... من المؤكد أن الجميع يعرف ما هي الخطافات ، ولكن إذا كان شخص ما لا يعرف ، فهذا ما يسمى. خطافات النظام التي يسحبها البرنامج المساعد. يمكنك قراءة المزيد عن الخطافات في الدليل الرسمي .



يجب أن يقوم كل مكون إضافي بتسجيل خطاف csrf_compliant ، وإلا فلن تتمكن من تنشيطه ، فسيكون هناك خطأ مثل هذا:





لا أعرف ما هي هذه المعلمة ، حتى اكتشفت النظام حتى النهاية. إذا كان هناك خبراء 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 كما يلي:



/**
 * 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 إلى المعلمات ، لكن لسبب ما لم ينجح شيء معي. ولكن مع الوظيفة المعتادة ، نجح كل شيء. لذلك ، من أجل عدم litter hook.php برمز غير ضروري ، قمت بتسجيل فئة تحتوي على طريقة معالج الخطاف ، وفي الوظيفة المطلوبة ، تم استدعاء هذه الطريقة ببساطة:



// hook.php

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


إذا كنت بحاجة إلى تثبيت الجداول في قاعدة بيانات ، فإن الوثائق الرسمية بها فقرة منفصلة حول هذا الموضوع. لم أكن بحاجة إلى الطاولات ، لذا فأنا أتخطى هذه اللحظة.



حسنًا ، لقد اكتشفنا نوعًا ما تثبيت / إزالة المكون الإضافي ، وتسجيل واستدعاء معالجات الخطاف ، حان الوقت الآن لمعرفة كيفية معالجة الطلب الجديد.



للقيام بذلك ، كما هو مذكور أعلاه ، قمت بتسجيل فئة PluginAdvticketsEvent (ملف inc / event.php) ، والتي تحتوي على طريقة pre_item_add_ticket واحدة .



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;
        }
    }
}


هذا كل شئ. شكرآ لك على أهتمامك. كود المصدر ، كما هو الحال دائمًا على جيثب .



روابط مفيدة:



موقع GLPI

الرسمي المنتديات الرسمية

Telegram chat

مثال على البرنامج المساعد

التوثيق لمطوري

APIDoc

التوثيق حول إنشاء المكونات الإضافية

مقال حول إنشاء مكونات GLPI الإضافية



All Articles