2010年5月19日

利用 Joomla 做資產管理 (Asset Management) -4 : Fabrik 套件使用小技巧 & Joomla 客製化

在前面的文章中已經介紹完 Joomla & Fabrik 套件的安裝以及使用方式,接下來整理的是我使用 Fabrik 套件過程中發現的小技巧,以及如何客製化 Joomla。
[無痛解法] Fabrik drop down 欄位的搜尋問題
開始使用 Fabrik 套件的時候發現一個問題,若把 Form 中的 Element 設定為 drop down,在輸入資料時固然方便,但是要過濾資料時會遇到一個問題:沒有「All」這個過濾條件!以下圖為例,當我想要利用「IP」來找某台主機的資料,此時「服務類別使用狀態」條件的第一個值會生效,也就是說兩個條件都必須符合 (邏輯 AND) 才能正確找到所要的資料。這是很不方便的,因為我也沒辦法記住每台主機的「服務類別使用狀態」是什麼,若「服務類別使用狀態」的值沒有設定對,就算 IP 打對還是找不到資料。若把 Element 設定為 field,過濾條件中的預設值就是「All」,也就是沒有作用,就不會遇到這個問題了!
1
經過測試,發現一個最簡單的解法,也就是在新增資料時將 Element type 設定為「drop down」,以減少資料輸入錯誤的可能;等到資料輸入完畢後,再把 Element type 改回「field」,如此在過濾條件中該欄位的下拉式選單就會出現「All」的選項。這樣做的話,就不用擔心將 drop down 改為 field 之後,drop down 的選項會消失,所有的設定資料(drop down 的 text & value) 都會保留在 DB 裡面,未來要再輸入資料時,只要將 Element type 改回 drop down 即可繼續使用。
2
如何批次匯入資料至 Fabrik Table
經過實驗以後,整理出以下幾種批次匯入資料的方法的優劣比較:
利用 Joomla / Fabrik 來匯入 在 phpMyAdmin 介面匯入
操作介面 Joomla 網站 phpMyAdmin 網站
支援檔案格式 CSV (需要保留欄位名稱列) CSV (不可保留欄位名稱列)
支援編碼 UTF-8 UTF-8
中文亂碼問題 難處理 (匯入後要手動調整,
e.g., 101—>分機101)
沒問題
其他 fabrik_internal_id 和 time_date 欄位可空白 fabrik_internal_id 可空白time_date 欄位要有資料(改為 TIMESTAMP 也不會自動填入匯入時的時間)

需將半型逗號「,」取代為全型逗號「,」,以避免匯入資料時欄位分割錯誤
最後還是決定用 phpMyAdmin 的介面來執行批次匯入/匯出。
(匯出資料的注意事項可參考:phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項)
從 phpMyAdmin 管理後台批次匯入資料:
步驟一:先準備好要匯入的原始資料:
3
步驟二:調整原始資料,要注意:
  • 不可保留頂端列的欄位名稱
  • 欄位順序要與 MySQL 中的 Table 欄位順序一致
  • 不用新增 fabrik_internal_id 欄位,但要自己給 time_date 欄位的資料
4
Excel 預設編碼方式為 ANSI,檔案只要用 Excel 編輯過,編碼就會被改成 ANSI,要再以記事本開啟另存為 UTF-8 編碼
(以 Notepad++ 編輯則不會更改原本的檔案編碼)
5
phpMyAdmin 介面的設定參考下圖:
image
利用 CSV 批次匯入資料:
步驟一:一樣先準備好要匯入的原始資料:
3
步驟二:調整原始資料,要注意:
  • 新增 fabrik_internal_id 和 time_date 這兩個欄位 (內容可空白)
  • 要把原始資料的中文欄位翻譯成英文,欄位順序要與 MySQL 中 的 Table 欄位一致
6
Excel 預設編碼方式為 ANSI,檔案只要用 Excel 編輯過,編碼就會被改成 ANSI,要再以記事本開啟另存為 UTF-8 編碼
(以 Notepad++ 編輯則不會更改原本的檔案編碼)
5
步驟三:從 Fabrik Table 的介面中,點選「Import from CSV」功能
image
設定參考下圖:
image
Fabrik 擴充套件的程式架構
由於 Joomla 採用 Model-View-Controller (MVC) 架構,Fabrik 套件也是以 MVC 架構來開發,因此程式架構很好理解,也很容易猜測如何修改。接下來記錄我小小調整 Fabrik 套件的 PHP 程式碼的作法,包括:
  • 修改 Fabrik 套件存檔時的 time_date 欄位,以儲存資料異動當下的完整時間 (原本僅記錄日期:yyyy-mm-dd 00:00:00)
  • 在資料存入 DB 之後,把異動的 log 也寫入 DB
MVC 架構:
8
修改 Fabrik 套件存檔時的 time_date 欄位,以儲存資料異動當下的完整時間
7  10
  • 修改檔案:
    [path/to/Joomla Dir]/components/com_fabrik/models/table.php
  • 新增 function getDateTime(),利用 php 內建的 getdate 函式取得目前時間,再調整為「yyyy-mm-dd hh:mm:ss」的格式。
  • 修改 function storeRow() <負責 Insert & Update>,在適當位置加入:$oRecord->time_date=$this->getDateTime();。
image
getDateTime() 函式的內容:
12
留下資料異動記錄 (Insert、Delete、Update)
  • MySQL 內建的 bin-log 無法區別不同的 Joomla 使用者,一律會記錄為 Joomla 用來登入 MySQL 的 user (通常為 root)
  • 利用 jos_fabrik_log 這個 fabrik 內建的 table 來儲存資料異動的 log:
欄位名稱 內容
id auto_increment 的流水號,作為 PK
timedate_created 每一筆資料的異動時間,採預設值即可(CURRENT_TIMESTAMP)
referring_url 用來儲存進行此操作的 username
(e.g., user1, user2)
message_type 用來儲存該 user 進行的操作
(i.e., INSERT, DELETE, UPDATE)
Message 該 user 執行的 SQL Statement
(重要:必須將「`」和「」取代為空白)
  • 修改檔案:
    [path/to/Joomla Dir]/components/com_fabrik/models/table.php
  • 新增 function getUserName(),以取得目前登入的使用者名稱,參考 [path/to/Joomla Dir]/components/com_fabrik/models/formsession.php 中的 getUserId() function
  • 新增 function logDBOperation($SQL),取得 log 所需的資料,並存入 jos_fabrik_log。
  • 修改 storeRow <負責 Insert & Update>及 deleteRows <負責 Delete> 兩個 function,在適當位置加入:
    $this->logDBOperation 的呼叫。
成果(登入 phpMyAdmin 查看):
11
經過測試,批次匯入資料時也會留下每一筆資料的異動記錄。
getUserName() 函式的內容:
13
logDBOperation($SQL) 函式的內容:
14
設定 MySQL 排程定期備份
參考資料:MySQL備份 shell script
  • 修改以下程式,另存為 [path/to/Joomla Dir]/backup/backup.sh:
    • 設定 db_user、db_passwd 以及 db_host 變數
    • backup_dir=“[path/to/Joomla Dir]/backup“
    • # get all databases 以下的內容,改為僅備份 Joomla DB:
      $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd [JoomlaDB] | $GZIP -9 > "$backup_dir/backup.0/$time.Joomla2.gz“
  • 設定 cron job 每月1日進行備份:
    • crontab -u root -e:
      0 0 1 * * sh [path/to/Joomla Dir]/backup/backup.sh
將 Joomla 從測試環境轉移到正式環境
在正式環境上最好是用 clean installation 比較保險,並且把網站名稱和 DB 名稱都設定成與測試環境相同,再用 phpMyAdmin 把資料匯出成 insert SQL,以免忘記修改到 DB 中的設定造成網站運作的異常。
其他待解問題
  • 先排序好A欄位,再排序B欄位,不要把A欄位的順序重排
  • 暫時提昇某個user的權限為可讀寫 (調整「存取」為「作者」無效)
  • Range filter 會清掉其他 filter 的設定值 (要設定兩次,多出一個Go button)
以上就是最近使用 Joomla 的一些心得分享,整理完畢之後,未來要查筆記就方便多啦 :D

本系列其他文章:

1 則留言:

tom 提到...

請問fabrik問題 謝謝解惑
1.用excel編輯資料後轉存為csv檔再經由 import form csv 上傳 結果欄位內資料為中文者全數變亂碼?
2.用 add 增加資料上傳者則正常?

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D