之前團隊在擴充 osTicket 時,主要是下海改他的 code ,但 osTicket 本身也有 plugin 架構,就花點時間看一下資料,感覺比想像中少資料可以看,只好直接看官方的 code 猜有什麼架構可用。
資料:
差不多了,然後看一下這幾個實作,盡量找最簡單的
剛好團隊內以前也都有開發過 oauth, ldap 整合,所以快速掃一下就可以很快摸索出個大概,重要的資訊:
- plugin 主要由 3 個檔案組成,分別是 plugin.php, config.php, yourclass.php
- plugin 要儲存一些設定值,只需 config.php 內提供 function getAllOptions() {} 就可以輕鬆達成
- plugin 可以自己再創個 db table 來儲存資料,一樣嘢是在 config.php 中伺機創結構
- plugin 安插自己的程式碼主要是依賴 Signals API 架構很漂亮,但現有 Signals API 的入口點並沒有太多 UI 擴充點
- plugin 可以製作額外的 API ,請參考 audit plugin 內的實作片段
就這樣,可以摸索個大概:
```osTicket % grep -r "Signal::" * | grep -o 'Signal::[^,]*' | sort | uniqSignal::connect('api'Signal::connect('auth.clean'Signal::connect('cron'Signal::connect('model.created'Signal::connect('model.deleted'Signal::connect('model.updated'Signal::connect('object.deleted'Signal::connect('organization.created'Signal::connect('session.close'Signal::connect('signal.name'Signal::connect('staff.header.extra'Signal::connect('system.install'Signal::connect('threadentry.created'Signal::connect('ticket.created'Signal::connect('user.auth'Signal::connect('user.created'Signal::connect() function callSignal::connect\('([^']+)'/m"Signal::send($actionSignal::send('agent.audit'Signal::send('agenttab.audit'Signal::send('ajax.client'Signal::send('ajax.scp'Signal::send('api'Signal::send('apps.admin'Signal::send('apps.scp'Signal::send('auth.clean'Signal::send('auth.login.failed'Signal::send('auth.login.succeeded'Signal::send('auth.logout'Signal::send('auth.pwchange'Signal::send('auth.pwreset.email'Signal::send('auth.pwreset.login'Signal::send('config.ttfonts'Signal::send('cron'Signal::send('export.tables'Signal::send('mail.decoded'Signal::send('mail.received'Signal::send('model.created'Signal::send('model.deleted'Signal::send('model.updated'Signal::send('object.created'Signal::send('object.deleted'Signal::send('object.edited'Signal::send('object.view'Signal::send('organization.created'Signal::send('person.login'Signal::send('person.logout'Signal::send('session.close'Signal::send('signal.name'Signal::send('syslog'Signal::send('system.install'Signal::send('task.created'Signal::send('threadentry.created'Signal::send('ticket.create.before'Signal::send('ticket.create.validated'Signal::send('ticket.created'Signal::send('ticket.view.more'Signal::send('user.audit'Signal::send('user.created'Signal::send('user.login'Signal::send('usertab.audit'Signal::send() for the same named signal.Signal::send() for the same-named signal.Signal::send\('([^']+)'/m"```
以及弄出個簡單的 osTicket plugin 來記錄一下:
搭配 osTicket 程式碼變動:
% cat -n osTicket/include/staff/header.inc.php | head -n 64 | tail -n 10
55 <link rel="icon" type="image/png" href="<?php echo ROOT_PATH ?>images/oscar-favicon-16x16.png" sizes="16x16" />
56
57 <?php
58 Signal::send('staff.header.extra');
59 if($ost && ($headers=$ost->getExtraHeaders())) {
60 echo "\n\t".implode("\n\t", $headers)."\n";
61 }
62 ?>
63 </head>
此 plugin 目的是提供引入更多 js, css resources,但如同上述提到的 osTicket plugin 沒有提供太多前端插入的 Signals ,自己得多添加一個 `Signal::send('staff.header.extra', null);` ,再來提 feature requests 來詢問開發團隊,看看是不是自己誤會了
沒有留言:
張貼留言