顯示具有 plugin 標籤的文章。 顯示所有文章
顯示具有 plugin 標籤的文章。 顯示所有文章

2024年7月18日 星期四

PHP 開發筆記 - 研究 osTicket plugins 架構,以一個可擴充前端資源 plugin 為例


之前團隊在擴充 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 | uniq
Signal::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 call
Signal::connect\('([^']+)'/m"
Signal::send($action
Signal::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 來詢問開發團隊,看看是不是自己誤會了

2022年9月1日 星期四

Electron 開發筆記 - 使用 @electron-forge/plugin-webpack

評估 electron 到底要跟哪套網頁開發的流程合在一起用,先研究一下 @electron-forge/plugin-webpack,粗略整合還堪用,但還有一些路徑或程式碼架構要處理。

先規劃了 src 目錄:

  % tree src 
  src
  ├── html
  │   └── mainRenderer
  │       ├── index.html
  │       └── index.js
  ├── main
  │   └── index.js
  ├── preload
  │   └── mainRenderer.js
  └── renderer
      ├── index.js
      └── mainRenederer.js
  
  5 directories, 6 files

其中 html 就是預期每個 renderer 的網頁所在地;而 main/index.js 就是 Electron main process 處理的項目;而 renderer/mainRenederer.js 是預期在 Electron main process 中處理 createWindow 的項目抽取出來重複使用;而 preload/mainRenderer.js 就是 Electron Renderer 展現前的 preload script

如此,想讓純前端網頁的程式碼都可以賴在 html 目錄下,屆時要靠常見工具封裝成 SPA 也方便。

而使用 electron-forge/plugin-webpack 上,只需要留意二件事:

1. 在 package.json 描述要被 webpack 封裝的項目

% cat package.json | jq '.config'
{
  "forge": {
    "plugins": [
      [
        "@electron-forge/plugin-webpack",
        {
          "mainConfig": "./webpack.main.config.js",
          "renderer": {
            "config": "./webpack.renderer.config.js",
            "entryPoints": [
              {
                "name": "main_window",
                "html": "./src/html/mainRenderer/index.html",
                "js": "./src/html/mainRenderer/index.js",
                "preload": {
                  "js": "./src/preload/mainRenderer.js"
                }
              }
            ]
          }
        }
      ]
    ]
  }
}

2. 在 Electron main process 中,使用 createWindow 後要讀取的 index.html 跟 preload.js 要改用變數

MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY, MAIN_WINDOW_WEBPACK_ENTRY

目前還會卡到 webpack dev server 運行時,有些 js code 執行異常,正考慮不要靠 webpack dev server,可能就要正式離開 @electron-forge/plugin-webpack" 用法了

2014年8月27日 星期三

[PHP] Mantis Plugin 開發筆記 @ Mantis 1.2.17

由於公司管理者熟悉 Mantis 系統,最近挑了 Mantis 來做類似 Customer Relationship Management (CRM) 服務,接著很容易碰到 User Group 的需求,這是在系統本身不存在的功能。

在網路上找了許久,有發現 User Group 相關的 Plugin,但是拿出來搭配最新版 Mantis 1.2.17 時,出現很多 Link 失效、或是某些表單送出時,導向回來失敗等。由於 trace/fix 完就等於把整個 plugin 做完了,就順便把 Mantis Plugin 開發筆記起來 Orz

首先,在 Mantis 架構下,有提供 Plugin 開發機制,提供在系統任何一個端點加入 Event Notification 架構,透過這個 notification 導入 Plugin 程式碼,以 User Group 來說,就是管理者在編輯使用者帳號時,希望也有張表可以查看目前使用者歸屬的 User Group Management,以及簡易的編輯、刪除等。

其中 Mantis Event 架構可以查詢:mantis/core/event_api.php,而 Mantis Plugin 架構可參考:mantis/core/plugin_api.php。開發 Mantis Plugin 文件,請參考這份:Building a Plugin,看完大概也了解了。

整體流程:
  1. 寫個 class ExamplePlugin extends MantisPlugin 
  2. 定義 plugin 需要的 db schema
  3. 綁定 event 串接自己定義的 function
其他心得:
  • 若 plugin db schema 想要變更時,除了刪除既定存在的外,還需要去刪除 mantis_config_table 裡頭的記錄,例如刪掉 config_id 等價於自己 plugin 名稱才行。如此一來,plugin 重新安裝時,才會重新建立對應的 table