etable手冊
- 概觀
- 與xoops之比較及結合
- 通道諸變數
- 類別重要屬性
- 類別重要方法
- 單獨使用時之常數
- 未來改良方向
- 目前使用及測試的case
- 程式說明
- etable.php
- 工作程式
- mkphp.php
附錄
使用手冊
dot.gif
程式撰寫提示
待處理:
constant.php 中 webContent 函式,運用上 ajax 適合不跳頁的情形,不適合不跳頁的情形。
session 變數同一網站同一會期皆相同,所以只能用來認登入者是誰,工作
壹、etable 概觀
一、效用與開發目的:
- 透過MVC模式(Model-View-Controller),使像資料庫查詢語句這樣的資料層代碼和像HTML這樣的表示層代碼分離,以便多個檢視介面能共享一個模型。並且封裝到一個物件類別中。
- 模型部分專注於資料表的輸出,與筆的維護(基本的插、編、刪)。
- 只要維護這個物件類別,相同的除錯工作做一次就好,不必做很多次。除錯是程式開發最耗時的部分,除一次,用很多次。
- 增進分工:
- 高手:撰寫新方法
- 中手:組合運用方法,熟悉運用html及php陣列
- 低手:直接套用方法,熟悉MySQL的Select語法及php陣列。
- 超低手:使用程式產生器。
二、功能:。
- 支援多表。
- 支援數學公式。
- 支援ajax,佈景不重畫僅資料重畫,第一次載入時才load 諸css,諸js,其餘時機只引用就好。
- 可調整sql指令,使工作程式的能力和MySQL新版功能與時俱進。
- 支援自行定義的額外欄位,並可指定插入位置。
- 支援多種顯示格式:表格式、文章式、文句式、月曆式,將開發卡片式及日曆式。
- 畫面分解為head,form,body三部分,三部分可進行多種樣式組合。
- 支援sql演算式欄位。
- 可在xoops中使用,也可單獨使用。單獨使用可套佈景,有etable.css可參考。要載入常數檔constant.php。
單獨使用時用到四個class:database,xoopsform,calendar,logger.php,均可從xoops拷出來。
- 單獨使用可使用帳號認證。
- 支援單筆插入及連續插入。
- 蒐尋功能
- 排序功能
- 繪圖功能
- 多國語言
三、類別繼承關係:。
- DB 負責叫通資料庫。
- login 載入 DB.php 繼承 DB。
- etable 載入 login.php 繼承 login。
四、基本規畫與工作流程:。
- 考慮處理對象是「多人同時」使用的資料表,其他client可能正使用相同的工作程式(x.php),所以和資料表相關的畫面須即時重畫。
登入者,已登入
session↓
通道→x.php→→→→→→叫main函式(諸引數)
↑ 通道傳入:exec_type, └→ 共同完成main()
↑ action ,perpage↗
載入etable.php rid[表],start
- 變數值彈性:物件屬性預設 < 函式預設 < x.php中寫死引數(每支php不同) < 通道傳入(每次不同)
- form中省略action會後送給自己,省略method會使用GET,所有submit無過濾一定後送,這有時會壓掉ajax的局部後送回應,要小心
- 而通道應只傳與單一client與其他client無關的變數。
五、程式檔案:。
- x.php :實際運作的工作程式。
- constant.php:單獨使用時之常數定義。一constant.php支援多個工作程式。
- DB.php :負責連通資料庫。無屬性,四方法connect、queryF、parseDSN、getDSNString皆可當函式由外部直接叫用。
- login.php :負責登入及翻頁。
- etable.php :類別定義。一個類別定義支援多個constant.php。
- etable.css :單獨使用時之布景範例。
- etloc_ct.php:正體中文語系檔。
- etloc_en.php:英文語系檔。
- edraw.php :繪圖類別定義。
- drawbar.php :長條圖。
- drawpoly.php:折線圖。
- drawpie.php :派圖。
- mimetex.cgi :數學公式繪圖二元執行檔。
- mimetex.php :數學公式過濾程式。將[tex]公式[/tex]換成圖檔。
- Sanitizer.php:處理HTML tag 與屬性的專用函式群。wiki類別會用到其中的 fixTagAttributes 函式。
- wiki.php :wiki語法轉換 HTML。
- dot.gif :一圖素之白點,讓ajax可以透過onload來執行javascript。
- xoopsform目前只使用了formhidden.php,formlabel.php,formbutton.php,formtext.php,formselect.php,formradio.php,formradioyn.php,formcheckbox.php,formcheckbox.php等表單元素。修改:
- formelement.php和formtext.php原在標籤內有$_extra,以getExtra()實體化,丁丁增加$_extra2,在標籤外用getExtra('2')實體化,以支援小日曆。<img onload='Calendar.setup(物件實字)'>
- 因為原來的xoopsform,靠臨時產生javascript函式作輸入驗證,但此法在改用ajax後便失效,所以進行以下修改:
form.php和themeform.php原在lt;form>標籤內有$_extra,支援form屬性設定,丁丁增加$_extra2,在form中實體化時</form>前加getExtra('2')。以便日後利用setExtra('2'),透過<img onload='runJava()或其他函式或設定物件實字>,然後讓sendFormData()進行表單驗證。
runJava遺址在et/jj_test內。
- formcheckbox-et.php在xoops2.2版時,抑制掉複選。但2.3版尚未抑制複選。
- formselect.php、formcheckbox.php、formtextarea.php在xoops2.3版時因多了「xoops_load('xoopsformelement');」只能為xoops版使用,無法為etable單獨版所使用,所以必須改用xxxx-et.php(抑制過xoops_load())。
- formhidden.php 原 value= 之後用單引號包起來,但 hidden 表單元素,可能傳 sql 條件句,值可能含單引號,所以 value= 之後改用雙引號包起來。
- etable.html :基本說明文件
五、範例檔案:。
- etdemo.php 是九參數的例子,額外欄button,隱藏欄
- etdemo2.php 測單獨使用
- etdemo3.php 測單一表格時
- article/sel.php 文章/一筆時無頭
- bt.php 文句/基測題目/簡易認證
- account.php 記帳/秀圖/條件/排序
貳、與xoops之比較及結合
一、大體比較:
功能類別 | xoops | 參考其他軟體 | etable獨立使用
|
---|
小、快、易設定,易與多種CMS結合。 | 自行優化
|
ajax | 沒有 | | 自行強化
|
PHP繪圖 | 沒有 | | 自行強化(edraw)
|
資料表通用表達管理 | 沒有 | phpmyadmin | 強化
|
google服務Data擷取 | 沒有 | | 自行強化
|
CSV編輯 | 沒有 | | 自行強化
|
跨資料庫 | 沒有 | | 自行強化
|
樣版列印 | 沒有 | | 自行強化,支援ODF
|
簡報製作 | 沒有 | | 自行強化(mkweb)
|
跨平台桌面AP | 沒有 | Abyss Web Server | 整合
|
日期時間 | | jscalendar | 沿用
|
資料庫物件 | 完整 | | 沿用
|
通用表單 | 完整 | | 沿用
|
使用者登入管理 | 有 | | 連結LDAP
|
設定 | 完整 | | 極簡化,在x.php中處理
|
模組 | 完整 | | 極簡化,一x.php一功能
|
多國語言 | 完整 | | 極簡化,在x.php中處理,etable.php中多國語言由constant.php處理
|
布景 | 完整 | | 極簡化,用x.css處理
|
區塊 | 完整 | | 不用
|
樣板引擎 | 完整 | | 未定
|
二、項目比較:
xoops | etable獨立使用
|
---|
全域變數 | $xoopsRequestUri | /modules/kpfood/x.php | $_SERVER['PHP_SELF']
|
$xoopsUserIsAdmin | 1或0 | 不用
|
$xoopsConfig | 整體性一般設定陣列 | 不用
|
$xoopsModuleConfig | 此模組偏好項目設定陣列 | 不用
|
$xoopsOption | 頁面及佈景控制陣列 | 不用
|
$xoopsSecurity | | 未定
|
$xoopsErrorHandler | 編錯誤碼,設定各種顯示 | 仿做
|
$sess_handler | | 未定
|
$xoopsLogger | | 已用
|
$xoopsDB | 資料庫連結 | 已用
|
$config_handler | 設定控制 | 不用
|
$member_handler | 使用者及其群組 | 不用
|
/$xoopsUser | 使用者 | 將用
|
$module_handle | 模組控制 | 不用
|
/$xoopsModule | 現用模組 | 不用
|
$xTheme | 佈景 | 不用
|
/$xoopsTpl | 樣版引擎 | 未定
|
非全域物件 | XoopsImage | 圖片管理 | 仿做
|
XoopsLists | 列表 | 已用
|
class.tar.php | 處理TAR檔 | 未定
|
class.zipfile.php | 處理zip檔 | 未定
|
XoopsDownloader | 使網頁轉成其他MIME格式的header | 未定
|
block.php | 區塊 | 不用
|
comment.php | 評論 | 仿做
|
notification.php | 通知 | 仿做
|
editor,xoopseditor | 編輯器 | 仿做
|
profile.php | 使用者管理 | 將用
|
privmessage.php | 私人訊息 | 將用
|
auth_ldap.php | ldap登入 | 將用
|
通用物件 | phpmailer | 郵寄 | 將用
|
smarty | 樣板引擎 | 未定
|
xml/css | | 將用
|
snoopy | webclient:擷取某個網址的網頁資訊,直接傳送表單資訊餵(post)給某個網頁的 | 將用
|
二、xoops之校調與修改:
- xoops用$_SESSION看是空值,但是用cookie看有PHPSESSID=唯一碼。
- common.php的198行是session_start,然後將$xoopsUser物件初始化。如session_start未執行,會導致$xoopsUser成為空字串,而非物件。
- 但執行198行又會出現header已送出的警告訊息,不可用headers_sent()判斷標頭是否送出然後決定要不要session_start,而要用@session_start,抑制警告訊息。
- 改form.php、formelement.php,在_extra屬性外再加_extra2,用於表單外、元素外額外字串。改其setExtra方法、getExtra方法。
- 改themeform.php,在其實體化方法render()中,在table和form結束前加入getExtra('2'),取得_extra2。
- 改formtext.php,在其實體化方法render()中, 在input結束後加入getExtra('2'),取得_extra2。
參、通道諸變數
一、登入與權限
登入表單以 POST 通道送 user_ 、psd兩變數到伺服器的工作程式,如果驗證過user_放入$_SESSION['login_user']。
- $exec_type:執行型態。0或無:重畫布景,1:不重畫布景但重畫head,form,body,2以上只執行相應的javascript。次次不同,不可由main引數設死。
- $perpage:每頁筆數。
- $start:開始筆。
- $rid:此次要編刪的筆索引,必須在各表中均唯一,$rid[表代名]值為「主鍵欄名=欄值」或諸「 and 欄名=欄值」。
- $action:資料表前置處理。
- 'ins'要插一筆,出插入表單。
- 'ins_ed'已插畢,update資料表。
- 'inss'連續插入,是ins和ins_ed的綜合。
- 'edit'要編某筆
- 'edited'已編畢
- 'erase'刪某筆
肆、類別重要屬性
(壹)特殊屬性
有屬性者,一物件僅能一值;非屬性者,一物件可以多值。
一、翻頁處理
不能用 url 加GET變數來控制工作程式的行為,因為etable只允許 overPage 屬性中固定的變數可以穿透各種翻頁變數。所以要用變數控制工作程式的行為請用載入內含變數的 php。
屬性 overPage 為陣列,共放:
- PHPSESSID 來自 session_id()
- exec_type 設為 1
- workControl 來自工作程式的 GPC 通道,用以設定工作程式的行為,一旦設定就會黏住蒐尋、翻頁,宛如工作程式的一部分
- listId 來自 $this->listId
- perpage 來自 $this->perpage
- start 來自 $this->start
- rid 來自 $_REQUEST['rid']
- ['sql']['where'] 來自 $this->sql
- ['sql']['order'] 來自 $this->sql
- action 來自 插編刪連結,及編畢插畢按鈕
但蒐尋、排序小表單中的「確定」按鈕會重設 exec_type 和 workControl 以外的 overPage 元素。
(貳)工作程式對模型與檢視之控制
序 | 引數 | 屬性名 | 資料型態 | 預設值 | MVC | 相關屬性 | 位置 |
1 | 查詢命令 | sql | 字串或陣列 | 無 | M | | etable.php |
2 | 顯示「插,編,刪」連結 | editable | 整數 | 0 | V | | login.php |
3 | 每頁筆數 | perpage | 整數 | 15 | C | | etable.php |
4 | 欄名代稱 | colAlias | 陣列 | 空陣列 | M | | etable.php |
5 | 額外欄 | moreCol | 陣列 | 空陣列 | V | | etable.php |
6 | 顯示型態 | dispType | 字串 | disp_table | V | | etable.php |
7 | 可「插編刪」諸表 | editables | 陣列 | 空陣列 | M | | etable.php |
8 | 表單中諸欄描述 | formType | 陣列 | 空陣列 | M | field[$i][formType] | etable.php |
9 | 是否翻譯 | tran | 布林 | 0 | C | | etable.php |
10 | 輸入驗證 | formValidate | 陣列 | 0 | C | field[$i][formValidate] | etable.php |
11 | 批次處理 | batch | 陣列 | 無 | C | | etable.php |
由於多表且各表可能有代稱,所以定義:
表代稱(as_name),例如select * from DVD as d,d即為表DVD之代稱。
長欄名(lc_name),只有一表時為「欄名」,多表時為「表代稱.欄名」。例如select Name from DVD as d,「d.Name」即為長欄名(lc_name)。
一、$sql:查詢命令,須為select,不可帶limit。
可為字串,亦可為陣列。
(一)字串:
- 諸欄可為欄名或演算式。
- 無預設值。
- 諸欄為欄名時,若在可編表中,會出現於表單並可編。依formType及欄型決定表單元件。
- 諸欄可為演算式,不可編,若有欄名代稱則出現於表單中;無欄名代稱則不出現於表單中。
- 演算式傳回的name是演算式或as 欄名之欄名,len是計算後最大可能的長度(char在utf-8中要乘三倍,整數乘一倍),type 視演算式傳回值的種類,flags 預設為not_null及其他特性,table 為空字串(非null)。
- 演算式中若結合純字串與字串欄時,flag變成not_null,type為string。
- 演算式中若結合數值與字串,會使flag變成binary。而其type有時為string有時為blob規則不明。
(二)陣列:
- 其第0元素(註標索引)為sql命令,規則同上段。
- 'where'(字串索引)元素,元素值為額外過濾條件,會用and加進第0元素。
- 'order'(字串索引)元素,元素值為額外排序條件,會用「,」加進第0元素。
- 'stats'(字串索引)元素,為陣列,代表各統計圖形。
- $sql['stats'][0]['sql'] ,選取兩欄第一欄為值,第二欄為值之註解
- $sql['stats'][0]['file'] ,drawbar.php畫長條圖,drawpoly.php畫折線圖
- $sql['stats'][0]['x_word'] ,x軸說明
- $sql['stats'][0]['y_word'] ,y軸說明
- $sql['stats'][0]['vu'] ,值之倍率
- $sql['stats'][0]['x_angle'],值之註解旋轉角度
- $sql['stats'][0]['xu'] ,x軸每單位幾點
- $sql['stats'][0]['yu'] ,y軸每單位幾點
二、$editable:顯示「插,編,刪」連結。
- 用1+2+4:代表「插,編,刪」相關連結顯不顯示。1代表插入連結,2代表編連結,4代表刪連結。
- 預設值0,即只可顯示。
- 以($editable%2)>(2/2-1)、($editable%4)>(4/2-1)、($editable%8)>(8/2-1)檢查
- 與各表可「插,編,刪」無關。各表是否可「插,編,刪」由$editables陣列管制。
三、$perpage:每頁筆數。
- 預設值15。
四、$colAlias:欄名代稱。
- array(lc_name=>代稱,…)
- 預設值為空陣列。
- 用以顯示表首列之各欄欄名。沒設之欄,其欄名代稱即為其長欄名。
五、$moreCol:額外欄。
- array($i=>array(插入序,欄名代稱,函式名),…)
- 預設值為空陣列。
- 「插入序」表示插在第幾欄之後,欄名代稱為各額外欄的欄名代稱。
- 函式名為產生欄值的函式。函式在載入etable.php的php(x.php)中定義:function 函式名($i,$j,$k){演算式…return 值;},
其中$i為在本頁中第幾筆,$j為本次查詢中第幾筆,皆從1開始算。$k為本筆其他欄的欄值陣列。
$k[0]~$k[n]代表各欄原欄值,$k['rid']代表各表之rid,由$k['rid']['as_name']取其值。
所以額外欄之欄值可由$i,$j,$k此三者設定演算式算出後傳回。
六、$dispType:顯示型態。
- list_body中各欄的相關位置。有disp_table、disp_text
- 預設值為'disp_table'。
- 目前支援以下型態:
- no_thing:只完成物件,如何顯示在x.php中發揮。
- disp_table:表格型態;
- disp_text:文章型態;
- disp_sentence:文句型態;
- 將再加入日曆型態、卡片型態
七、$editables:可插諸表,可編諸表,可刪諸表。
- 可插諸表:$editables['ins']=array(表代名,…);
- 可編諸表:$editables['edit']=array(表代名,…);
- 可刪諸表:$editables['erase']=array(表代名,…);
- 預設值為空陣列,代表全部資料表均可「插、編、刪」。
八、$formType:指定欄位的表單元件型態。
作用於以下方法:main 中 輸出蒐尋排序表單、javascript之驗證區、相依選單前置處理,ana_fields 之 抄入或製作各欄之 formType 屬性,disp_table_body 中欄數的決定,col_value 中各欄顯示值的決定,form_edit 及 form_ins 中 hidden 及 unix_time之條件處理,addElements 中 hidden外其他欄型處理。給程式產生器用的 search 段處理函式。
- 預設值為空陣列。
- 有select(選單欄),radio(選鈕欄),radioyn(10選鈕欄),checkbox(核取方塊欄),unix_time(時間戳記),date(yyyy-mm-dd),hidden
- 陣列元素之索引為長欄名,值為陣列,其諸元素說明如下:
- $formType[lc_name][0]欄的種類;
- $formType[lc_name][1]欄值和提示
- select,radio,radioyn,checkbox,date為陣列,元素索引是欄值,元素值是提示
- hidden,unix_time是字串,hidden是算出欄值的函式、unix_time是格式。
- auto是陣列
- $formType[lc_name][2]後送條件
- 派值範例:
$formType=array('長欄名'=>array('select',array('值'=>'提示文字','值'=>'提示文字','值'=>'提示文字',…)),
'長欄名'=>array('select2',第一選單陣列,第二選單長欄名,第二選單二維陣列,第二選單以提示代表欄值),
'長欄名'=>array('select22',array(0=>'===請選擇===')),
'長欄名'=>array('radio' ,array('值'=>'提示文字','值'=>'提示文字','值'=>'提示文字',…)),
'長欄名'=>array('radioyn',array('0之提示','1之提示')),
'長欄名'=>array('checkbox',array('勾選後送值'=>'提示')),
'長欄名'=>array('date',array('ifFormat'=>'daFormat')),改畢,因欄值'%Y-%m-%d'是小日曆認得的格式,所以預選日期為欄值日期
'長欄名'=>array('auto',array('plain','html','wiki','tex')),改畢,$this->formType中未定義,則$this->fields[$i]['formType']會自動將該欄定為auto型,如欄型為TEXT則form出textarea,其他出文字欄。第二元素為語法組合陣列,預設為plain(純文本)。
'長欄名'=>array('hidden',函式,表單種類),
'長欄名'=>array('unix_time','Y-m-d<bR>H:i:s',表單種類),待改,因欄值'%s'是小日曆不認得的格式,所以預選日期為跑到當天日期,要認得欄值格式須為「年-月-日 [10] 時:分」,用Calendar.setDateFormat('%s');無效。此事無解,參看http://192.168.3.175/et/class/calendar/jstest.htm,不是每一種格式jscalendar都可以認得出日期,如Date #0:的%s會解不出日期,Date #2:的…會解錯日期,Date #4:解不出日期。
'長欄名'=>array('oneWaySwitch',array(0=>'按鈕字',值=>'按完字')),
);
- unix_time型:在body中強迫翻譯為日期時間樣式。其後的表單種類:
- 'ins':在插入表單中以隱藏欄後傳mktime(),編輯表單則用小日曆。
- 'ins_only':在插入表單中以隱藏欄後傳mktime(),編輯表單則不改其值。
- 'edit':在編輯表單中以隱藏欄後傳mktime(),插入表單則用小日曆。
- 'both':在插入表單及編輯表單中均以隱藏欄後傳mktime()。
- 其他字串:在插入表單及編輯表單中均用小日曆。
如果要在插入時自動插入時間戳記,而編輯時用小日曆,應選用'ins'表單種類。
小日曆無法將input/text型改成input/hidden。
- hidden型:在body中不顯示。其後的表單種類:
- 'ins':在插入表單中以函式值用隱藏欄位後傳,編輯表單則正常。
- 'ins_only':在插入表單中以函式值用隱藏欄位後傳,編輯表單則不改其值。
- 'edit':在編輯表單中以函式值用隱藏欄位後傳,插入表單則正常。
- 'both':在插入表單及編輯表單中均以函式值用隱藏欄位後傳。
- 其他字串:在插入表單及編輯表單中均正常。
型態 | 插表單中 | 編表單中 | body不翻譯時 | body翻譯時
|
---|
select | select諸option | 值 | 提示文字
|
radio | 諸radio | 值 | 提示文字
|
radioyn | 兩radio | 值 | 提示文字
|
checkbox | 一checkbox | 值 | 提示文字
|
date | yy-mm-dd及小日曆 | 值 | 值
|
unix_time | 小日曆 | 指定的date()樣式
|
隱藏欄後送mktime()
|
hidden | 隱藏欄後送函式值 | 不顯示
|
九、$tran:是否翻譯。
- 1代表body顯示時將欄值翻譯成對應之提示文字,提示文字在formType中指定。
- 預設為0,除unix_time外,其餘均不翻譯。
十、$formValidate:輸入驗證陣列,諸元素為表單中諸欄的所用的驗證條件。
- xoops的javascript檢驗無法在ajax中作用,須重寫。但必填欄有*。
- 預設值為空陣列。
- array(lc_name=>array('合法輸入值的正規表示式','驗證不過之提示'),lc_name=>array(…),…),以各欄的lc_name為索引。
可用的驗證正規表示式'.+' 必填
'^[^\\s]+@[^\\s]+\\.[^\\s]+$' email
'^[1-9]\\d*$' 正整數
'^[A-Z]{1}[0-9]{9}$' 身份證號
'^(\\d+|[1-9]\\d*)$' 非負整數
'^(-?(\\d+|[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+))$' 數字
'^(\\d+|[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+)$' 非負數值
'^((19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))$' 合理的日期
十一、$batch:批次處理
在工作程式中設計核取方塊及函式,於單筆資料插、編、刪後,對核取各筆執行批次處理。核取方塊用演算欄每筆自動產生。
陣列中每一元素為一種批次處理,索引為該批次處理確認按鈕的顯示字樣,元素值為批次處理的函式名稱。
(參)重要屬性
- $rid :要找到某一筆資料,通道傳入,在main解析,在mk_tbl比對
- $sql :現用查詢,sql[0]是x.php中函式引數,sql['from']…為命令中的各段,sql['tmp']是未解析前帶as的諸表字串
- $colnum :查詢指令總欄數,ana_sql完得初值,不含索引欄、額外欄
- $rownum :查詢指令總筆數,ana_sql完得初值
- $tblnum :查詢指令資料表數,ana_table完得初值
- $table_list:諸資料表名串成字串,ana_table完得初值。
- $tables :諸資料表陣列,ana_table完得初值。由於from段中,諸表的as name不可重覆,且考慮了不同庫名同表名的問題所以tables可用as name索引,欄好依as_name找表。
- tables['as_name']['t_name']
- tables['as_name']['PRI'] 可能有可能沒有,有時用作$rid
- tables['as_name']['sql_col']為陣列,元素為「欄名=>欄序」,表示sql中slect 諸欄中,屬於本表的有那幾欄
- $fields :查詢指令諸選用欄,ana_fields後得初值,含索引欄,不含額外欄。由於不同表可取相同欄名,所以要用註標索引,如用欄名索引,後欄壓前欄,同名欄會只出現一次。
- fields[$i]['colname']欄名
- fields[$i]['collen'] 欄長
- fields[$i]['coltype']欄型
- fields[$i]['colflag']欄旗
- fields[$i]['as_name']所屬表名,代稱
- fields[$i]['lc_name']長欄名,只有一表時為「欄名」,多表時為「表代稱.欄名」
- fields[$i]['default']預設值
- fields[$i]['colalias']欄代稱
- fields[$i]['must']是否必填。1必填,0非必填。
- $tbl :查詢指令結果多維陣列,含索引欄,不含額外欄,含各筆之rid
- $defau_v :defau_v[表代名][欄名]為該欄預設值
- $form :表單物件
- $extra :額外傳遞項
- 屬性來源一覽表:
$perpage | 通道>main()>方法預設
|
$start=0 | 通道>方法預設>類別預設
|
$action | 通道
|
$rid | 通道
|
$sql | main()參數
|
$colnum | 由sql決定
|
$rownum | 由sql決定
|
$tblnum | 由sql決定
|
$tables | 由sql決定
|
$table_list | 由sql決定
|
$editables | main()參數
|
$fields | 由sql決定
|
$col_alias | main()參數
|
$tbl | 由sql+perpage+start決定
|
$defau_v | 由sql決定
|
$form | 由sql+col_alias+form_type決定
|
$form_type | main()參數
|
$tran | main()參數
|
$extra | main()參數中$sql陣列中的where,order元素
|
- $users :登錄驗證陣列
其中每一元素為一個人,以帳號為索引:
$users[帳號]['psd']之值為密碼,可由帳密資料表查得,亦可由在工作程式中指定。
$users[帳號]['editable']之值為權限,應由各個工作程式分別指定。因為每一人對不同的工作程式應有不同的權限,所以權限對工作程式應有專一性。如果要設計資料表,應將工作程式權限指定的資料表和帳密資料表分開。
- $loginTable:群組登錄驗證資料表
$loginTable['tableName']之值為表名,指認證資料表;
$loginTable['name']之值為欄名,指帳號欄;
$loginTable['psd']之值為欄名,指密碼欄;
$loginTable['grp']之值為欄名,指群組欄,兩群組用「;」間開。
$loginTable['canWorkGrp']之值為可以使用本工作程式的群組列表,為字串,如果有兩個以上群組則用「;」間開。
在工作程式中配合 if(isset($_SESSION['login_user_group']) && in_array('群組名',$_SESSION['login_user_group'])){作該群組可做之事;}else{echo 訊息;} 控制工作程式的表現。
- $calendar_start:月曆中該月起始秒數
伍、類別重要方法
陸、單獨使用時之常數:
define('CMS','alone'); 脫離xoops獨立執行。
define('CLASS_HTML_PATH','路徑'); 包含諸class之url路徑。以url之根節點為根目錄。
define('CLASS_FILE_PATH','絕對路徑');┐伺服器中包含諸class之檔案路徑。
define('DSN','資料庫種類://可用帳號:可用密碼@可用HOST/資料庫名');
柒、未來改良方向:
- 物件一覽表
- 屬性一覽表
- 方法一覽表
- 跳頁選單上下都有
- 唯一插入(不重覆插入),目前靠 sql 控制。
- 多筆插入
- 多筆編輯
- 群組 LDAP
- 桌面端AP開發環境,配合Abyss Web Server(小,跨平台,多國語言,免費)
- 繪圖增加資產負債圖
- 跨資料庫
CSV模式
- 拖曳
- 列印
- 簡報
捌、目前使用及測試的case:
- xoops 文章模組。
- 教育2.0網站網路連署。
- 教育2.0捐款。
- 教育2.0基測題目公布。
- 開平食材網站(不小)。
- 開平綜高課程→自製行事曆。
- 開平綜高課程→LDAP認證。
- 開平綜高課程→自製設施管理系統。
- 開平綜高課程→自製收支帳記帳軟體。
- 開平綜高課程→自製記帳過帳軟體→Open Source for NGO。
- 開平綜高課程→自製動態欄位管理工具。
- 開平綜高課程→自製階層樹解析軟體。
- TOP→ODF檔案格式解析及轉檔。
玖、程式解說:
一、三層程式
- (一)etable.php
- 基本處理
- 語系處理
- 載入相關的css,js
- 載入logger.php,xoopsformloader.php,/class/database/mysqldatabase.php
- 類別定義
- 屬性
- 預載函式
- 主函式
- 由exec_type決定主函式功能
- 98 輸入帳號密碼畫面
- 99 檢查帳號密碼
- 解析區
- 顯示區
- 組合函式區
- disp_table
- disp_text
- disp_sentence
- disp_calendar
- 諸頭
- ins_link
- std_head
- calendar_head
- 諸體
- mk_rid
- edit_link
- del_link
- no_thing
- disp_table_body
- disp_text_body
- disp_sentence_body
- disp_calendar_body
- col_value 求欄值
- 表單區
- form_edit
- form_ins
- addElements
- 繪圖區
- 其他程式區
- 其他函式區
- 基本功能區
- todatetime 秒換算成日期
- textdisp 非html欄位將\n換為<br>
- encode 處理角括號、引號、&
- decode 還原角括號、引號、&
- cuts 擷取頭尾所夾字串
- (二)工作程式
判斷是否獨立執行環境:載入常數檔
- (三)mkphp.php
2 帶時分秒日曆
3 日曆
exec_java2
exec_java3
二、互動介面
附錄一、使用手冊
- 建資料表。字串欄、數值欄、日時欄都能和excel互通。日時欄datetime欄、timestamp格式完全一樣,只接受now()函式或字串輸入,差別在於前者的預設值只能固定如0000-00-00 00:00:00;後者的預設值可固定或CURRENT_TIMESTAMP插入當地時間(作用同now())。
- 執行mkphp.php,並指定sql。
- 指定參數,儲存參數。
- 如果以數值編碼,數值必須「定長」,以後才能支援複選欄位蒐尋。因為複選欄位的蒐尋只能用like而不能用=,而like '%1%'會把1和10都找出來,但是like '%01%'只會找到01不會找到10。
- 改sql需到後台資料表中修改,其和介面有相依關係。
附錄二、dot.gif
byte值 bits
7 6 5 4 3 2 1 0
Byte序+-----------+---------------+
0-5 |GIF87a | | GIF 識別
+-----------+---------------+ ---------------------------------+
6-7 |1,0 | 顯示框寬 | (最小值位元優先) |
+-----------+---------------+ |
8-9 |1,0 | 顯示框高 | (最小值位元優先) |
+-----------+-+-----+-+-----+ M=1,隨後描述全體色彩映圖 |
10 |128 |M| cr |0| 像素| cr值+1=顏色的解析度由幾個bits代表+-- 顯示框描述
+-----------+-+-----+-+-----+ 像素值+1=每像素由幾個bits代表 |
11 |0 | 背景色色碼 | (依全體色彩映圖或預設映圖指定) |
+-----------+---------------+ |
12 |0 |0 0 0 0 0 0 0 0| |
+-----------+---------------+ ---------------------------------+
13-15|255,255,255| 紅,綠,藍強度 | 色碼0 --+ 缺全體色彩映圖時 |
+-----------+---------------+ +--IE預設為黑色 +-- 全體色彩映圖(2的n方個項目,n為每像素由幾bit代表)
16-18|255,255,255| | 色碼1 --+ Firefox預設為白色 |
+-----------+---------------+ ---------------------------------+
19 |, | 圖形描述前導字| |
+-----------+---------------+ |
20-21|0 | 左側起點 | |
+-----------+---------------+ |
22-23|0 | 上側起點 | |
+-----------+---------------+ +-- 圖形描述 --+
24-25|1 | 圖寬 | M=0 使用全體色彩映圖,忽略像素欄 | |
+-----------+---------------+ M=1 隨後有局部色彩映圖,使用像素欄| |
26-27|1 | 圖高 | I=0 圖形格式為連續式 | |
+-----------+---------------+ I=1 圖形格式為交錯式 | |
28 |0 |M|I|0|0|0|pixel| 像素值+1=每像素由幾個bits代表 | |
+-----------+---------------+ ---------------------------------+ +-- 重覆一到多次
| | | 局部色彩映圖(本例無) | |
+-----------+---------------+ ---------------------------------+ |
29 |2 | 壓縮碼大小 | 通常為幾bit代表像素但不能為1 | |
+-----------+---------------+ ---------------+ | |
30 |0 | 資料塊byte數目| | | |
+-----------+---------------+ +--重覆一到多次 +-- 點陣資料 --+
| | 點陣資料塊 | LZW編碼(本例無)| |
+-----------+---------------+ ---------------+ |
31 |0 |0 0 0 0 0 0 0 0| 結束本圖形 |
+-----------+---------------+ ---------------------------------+
32 |; | | GIF 終止指示
+-----------+---------------+
Firefox可接受有顯示框無圖形的gif圖,加上省略全體色彩映圖預設為白色,所以畫一白點最少14byte,IE一定要有圖形不能只有顯示框,圖的寬高不能為0,一定要有點陣資料區,但編碼的點陣資料塊大小可為0,所以畫一白點最少為33byte。
附錄三、程式撰寫提示
javascript部分
- index屬性只隸屬於select之下的option,指出該option是第幾個(從0算起)。不能用來查表單元素是該表單的第幾個。而selectedIndex則傳回被選的option是第幾個。
- 已知該元素是表單中的第幾個元素可以用elements[幾]來標示此元素;反之不然,無法查出此元素是第幾個元素。
- 不啟用javascript時也能使用,對連結有問題。ajax連結可以用post通道送參數,但如改用href就非走get通道不可。
- 抓出表單元素的諸方法:
- document.表單.elements[i]
- document.表單.元素名
- document.getElementsByName('元素名稱')[0]
- document.表單.elements['元素id']
- document.表單['元素id']
- 為了使表單後送資料結構良好,所以表單元素常會設定name=xxx[xxx],這種元素名稱含有[]的表單元素無法用「document.表單名.元素名」來找出該表單元素,但可以用上項的其他方法來找出該表單元素。
- 表單元素名稱也可以使用變數,利用上項方法再加上eval()指令,如eval('document.表單.'+變數)。
- 如果同一表單中有多個 NAME 屬性相同的對象,將會自動創建一個該名稱的陣列。該陣列中的每一個元素描述一個單獨的對象。元素按照源文件的順序從 0 開始依次索引。例如,如果相同窗體中有 NAME 屬性同為「myField」的兩個 Text 元素和一個 Button 元素,將會自動創建元素為 myField[0]、myField[1] 和 myField[2] 的陣列。你需要在代碼中注意到這種情況,並且自行識別 myField 到底是對單個元素還是元素陣列的引用。
PHP部分
- 關於引號,儘量以'為最裡層,約為HTML階層(除javascript事件觸發後包裹多指令)或SQL階層或PHP中之短字串(無換行、變數);再向外為',約為PHP階層,用以包裹長字串,其中有'者表達為\',給工作程式及etable.php用;再向外為<<<,約為編譯程式階層,在mkphp.php中使用。
其他部分
- 有關POST、GET通道編碼後送之詳述,請參閱ajax.html之「貳/三、後送資料」。現摘要如下:由於通道資料送至伺服器必經解碼,先用「&」切成一組一組變數,再用「=」切成變數名和變數值,變數名中發現「+」或「空白」或「%20」代換成「_」,變數值中發現「+」代換成「空白」;此外,不論變數名或變數值,「%xx」一概轉換成相應的非英數符號。所以etable只用POST通道,以下通道資料編成%xx:
- 「&」在變數值組成時就換掉,不然會干擾變數組分段。
- 「+」換掉,不然會被解碼成空白。
- 「<」「>」換掉,不然在連結<a onclick='postData('檔名','通道資料','輸出div');…'>中會破壞HTML標籤。
- 「'」「'」換掉,不然會破壞引號對稱性和階層關係。引號常用於SQL指令欄值包裹。
- 「%」換掉,不然會和其他%xx url編碼混淆。%常用於SQL指令Like之後。
- 所以PHP中有 encode() 函式,提供諸表rid值編碼;傳送命令where、order之值編碼。
- javascript中也有 encode() 函式,提供sendFormData中非按鈕、非核取方塊、非隱藏欄之表單元素值後送前編碼。但此編碼不用管<、>。
由於對%編碼,所以同一段字串絕不能編碼兩次,否則會將第一次編碼結果%xx的%再編碼,就錯了。所以javascript的encode()不對隱藏欄編碼。這樣就不會對rid,extra等已經在PHP編過碼者再編一次碼。