Hari ini kita akan berbicara tentang bagaimana saya menulis plugin GLPI untuk bekerja dengan pesanan baru yang dibuat berdasarkan pesanan yang sudah ditutup, atau lebih tepatnya membuka kembali pesanan yang ditutup, jika permintaan tambahan dari pengguna diterima untuk mereka.
Latar BelakangParameter masukannya adalah sebagai berikut.
Selama hampir sebulan sekarang saya telah menggali kode sumber dari sistem helpdesk GLPI. Dan ketika mempelajari solusi open source ini, saya menarik perhatian pada jumlah informasi yang dapat diabaikan untuk pengembang. Sebagian besar materi terkait dengan konfigurasi GLPI di dalam antarmuka. Sedikit kurang, tetapi Anda masih dapat menemukan informasi tentang pengaturan server. Dan hanya satu artikel (dan satu dalam bahasa Inggris) yang menceritakan tentang pengembangan plugin untuk sistem keajaiban ini.
Dari manual resmi - beberapa sumber di readthedocs, ditambah manual yang dihasilkan dari phpdoc.
Dari komunitas - obrolan di telegram dan forum asing.
Ada sistem helpdesk GLPI. Aplikasi dari pengguna dikirim ke kotak surat khusus yang terhubung ke sistem. Tanggapan dukungan juga datang melalui surat. Secara umum, semua pemberitahuan tentang kemajuan aplikasi dari panggilan pertama hingga keputusan dan penutupan dikirim ke surat.
Namun, jika pengguna berpikir bahwa masalahnya belum terselesaikan dengan baik dan memutuskan untuk menanggapi surat tentang penutupan permintaan, maka alih-alih membuka kembali, permintaan baru dibuat, dan tiket lama akan terikat padanya. Sebenarnya masalah ini harus diselesaikan.
Jadi ayo pergi.
Langkah pertama adalah menginstal generator plugin- itu sangat menyederhanakan hidup dengan membuat kerangka plugin masa depan kita. Ini dapat dilakukan dengan menggunakan algoritma berikut:
Dan itu saja, bingkainya sudah siap.
Masuk ke direktori plugin yang Anda buat, Anda akan melihat banyak file, yang hanya dibutuhkan setup.php dan hook.php. Jika Anda berencana untuk menggunakan pustaka tambahan, Anda dapat meninggalkan composer.json. Saya tidak membutuhkan ini, jadi saya hanya menyisakan 2 file yang diperlukan.
Ada dua fungsi yang diperlukan dalam file setup.php - plugin_init_yourpluginname dan plugin_version_yourpluginname . Yang pertama menginisialisasi plugin, yang kedua mengembalikan informasi tentangnya - nama, penulis, versi, dll.
Dengan yang kedua, semuanya menjadi lebih atau kurang jelas. Oleh karena itu, kami akan secara singkat fokus pada fungsi pertama. Ia bekerja dengan variabel global $ PLUGIN_HOOKS... Tentunya semua orang tahu apa itu kait, tetapi jika seseorang tidak tahu, maka inilah yang disebut. kait sistem yang ditarik plugin. Anda dapat membaca lebih lanjut tentang kait di manual resmi .
Setiap plugin harus mendaftarkan hook csrf_compliant , jika tidak Anda tidak akan bisa mengaktifkannya, akan ada kesalahan seperti ini:
Saya tidak tahu apa parameter ini, sampai saya menemukan sistemnya sampai akhir. Jika ada ahli GLPI di antara pembaca, tulis di komentar.
Selain pengait wajib, Anda dapat mendaftarkan banyak lainnya, misalnya, mengatur tautan ke halaman pengaturan:
$PLUGIN_HOOKS['config_page']['yourpluginname'] = 'config.php';
Kelas plugin juga terdaftar dalam fungsi ini:
Plugin::registerClass(PluginYourpluginnameConfig::class);
, , , GLPI , . : Plugin + + . , , .Mari kembali ke hook kita. Saya perlu melacak pembuatan tiket pembatalan baru, jadi saya akan mendaftarkan penangan hook pre_item_add . Anda dapat mengirimkan parameter ke penangan, ini dilakukan dengan menggunakan array asosiatif, di mana kuncinya adalah objek dari entitas yang diinginkan (dalam kasus saya, Tiket), dan nilainya adalah nama fungsi penangan.
: PluginYourpluginnameConfig, config.class.php. inc ( , , , , — — , - ).
.
Akibatnya, dalam kasus saya, dua fungsi yang diperlukan dari file setup.php terlihat seperti ini:
/**
* 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',
]
]
];
}
Dokumentasi mengatakan bahwa dimungkinkan untuk mendaftarkan metode statis kelas sebagai penangan, dalam hal ini mereka akan terlihat seperti ini (ngomong-ngomong, sama sekali tidak perlu meneruskan parameter apa pun ke penangan):
/* */
//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'];
Fungsi penangan itu sendiri disimpan di file hook.php. Fungsi untuk menginstal dan menghapus plugin juga disimpan di sana. Nama fungsi memiliki persyaratan yang sama - nama_plugnama_fungsi plugin.
Ngomong-ngomong, saya mencoba mendaftarkan metode statis untuk menangani pengait dan meneruskan objek Tiket ke parameter, tetapi untuk beberapa alasan tidak ada yang berhasil untuk saya. Tetapi dengan fungsi biasa, semuanya berhasil. Oleh karena itu, agar tidak mengotori hook.php dengan kode yang tidak perlu, saya mendaftarkan kelas yang berisi metode handler hook, dan dalam fungsi yang diperlukan saya cukup memanggil metode ini:
// hook.php
/**
* @param Ticket $ticket
*
* @return bool
*/
function plugin_advtickets_pre_item_add(Ticket $ticket)
{
return PluginAdvticketsEvent::pre_item_add_ticket($ticket);
}
Jika Anda perlu menginstal tabel dalam database, maka dokumentasi resmi memiliki paragraf terpisah tentang topik ini. Saya tidak membutuhkan meja, jadi saya melewatkan momen ini.
Nah, kita telah menemukan cara menginstal / menghapus plugin, mendaftar dan memanggil penangan hook, sekarang saatnya untuk mencari tahu bagaimana kita akan memproses permintaan baru.
Untuk melakukan ini, seperti yang disebutkan di atas, saya mendaftarkan kelas PluginAdvticketsEvent (file inc / event.php), yang berisi metode pre_item_add_ticket tunggal .
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;
}
}
}
Itu saja. Terima kasih atas perhatian Anda. Kode sumber, seperti biasa di github .
Tautan yang berguna:
Situs Web Resmi GLPI
Forum Resmi
Telegram Chat
Contoh
Dokumentasi Plugin untuk
Pengembang APIDoc
Dokumentasi tentang Artikel Pembuatan Plugin tentang Pembuatan
Plugin GLPI