etable手冊

壹、類別繼承關係

login 載入 DB.php 繼承 DB
etable 載入 login.php 繼承 login

貳、類別重要屬性

有屬性者,一物件僅能一值;非屬性者,一物件可以多值。
引數屬性名資料型態預設值MVC新增屬性
1查詢命令sql字串或陣列M
2顯示「插,編,刪」連結editable整數0Veditable
3每頁筆數perpage整數15C
4欄名代稱colAlias陣列空陣列M
5額外欄moreCol陣列空陣列V
6顯示型態dispType字串disp_tableV
7可「插編刪」諸表editables陣列空陣列M
8表單中諸欄描述formType陣列空陣列Mfield[$i][formType]
9是否翻譯tran布林0C
10輸入驗證formValidate布林0Cfield[$i][formValidate]

由於多表且各表可能有代稱,所以定義:
表代稱(as_name),例如select * from DVD as d,d即為表DVD之代稱。
長欄名(lc_name),只有一表時為「欄名」,多表時為「表代稱.欄名」。例如select Name from DVD as d,「d.Name」即為長欄名(lc_name)。

一、$sql:查詢命令,須為select,不可帶limit。

可為字串,亦可為陣列。

(一)字串:

  1. 諸欄可為欄名或演算式。
  2. 無預設值。
  3. 諸欄為欄名時,若在可編表中,會出現於表單並可編。依formType及欄型決定表單元件。
  4. 諸欄可為演算式,不可編,若有欄名代稱則出現於表單中;無欄名代稱則不出現於表單中。
  5. 演算式傳回的name是演算式或as 欄名之欄名,len是計算後最大可能的長度(char在utf-8中要乘三倍,整數乘一倍),type 視演算式傳回值的種類,flags 預設為not_null及其他特性,table 為空字串(非null)。
  6. 演算式中若結合純字串與字串欄時,flag變成not_null,type為string。
  7. 演算式中若結合數值與字串,會使flag變成binary。而其type有時為string有時為blob規則不明。

(二)陣列:

  1. 其第0元素(註標索引)為sql命令,規則同上段。
  2. 'where'(字串索引)元素,元素值為額外過濾條件,會用and加進第0元素。
  3. 'order'(字串索引)元素,元素值為額外排序條件,會用「,」加進第0元素。
  4. '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. 用1+2+4:代表「插,編,刪」相關連結顯不顯示。1代表插入連結,2代表編連結,4代表刪連結。
  2. 預設值0,即只可顯示。
  3. 以($editable%2)>(2/2-1)、($editable%4)>(4/2-1)、($editable%8)>(8/2-1)檢查
  4. 與各表可「插,編,刪」無關。各表是否可「插,編,刪」由$editables陣列管制。

三、$perpage:每頁筆數。

  1. 預設值15。

四、$colAlias:欄名代稱。

  1. array(lc_name=>代稱,…)
  2. 預設值為空陣列。
  3. 用以顯示表首列之各欄欄名。沒設之欄,其欄名代稱即為其長欄名。

五、$moreCol:額外欄。

  1. array($i=>array(插入序,欄名代稱,函式名),…)
  2. 預設值為空陣列。
  3. 「插入序」表示插在第幾欄之後,欄名代稱為各額外欄的欄名代稱。
  4. 函式名為產生欄值的函式。函式在載入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:顯示型態。

  1. list_body中各欄的相關位置。有disp_table、disp_text
  2. 預設值為'disp_table'。
  3. 目前支援以下型態:
    • no_thing:只完成物件,如何顯示在x.php中發揮。
    • disp_table:表格型態;
    • disp_text:文章型態;
    • disp_sentence:文句型態;
  4. 將再加入日曆型態、卡片型態

七、$editables:可插諸表,可編諸表,可刪諸表。

  1. 可插諸表:$editables['ins']=array(表代名,…);
  2. 可編諸表:$editables['edit']=array(表代名,…);
  3. 可刪諸表:$editables['erase']=array(表代名,…);
  4. 預設值為空陣列,代表全部資料表均可「插、編、刪」。

八、$formType:指定欄位的表單元件型態。

作用於以下方法:main 中 輸出蒐尋排序表單、javascript之驗證區、相依選單前置處理,ana_fields 之 抄入或製作各欄之 formType 屬性,disp_table_body 中欄數的決定,col_value 中各欄顯示值的決定,form_edit 及 form_ins 中 hidden 及 unix_time之條件處理,addElements 中 hidden外其他欄型處理。給程式產生器用的 search 段處理函式。

  1. 預設值為空陣列。
  2. 有select(選單欄),radio(選鈕欄),radioyn(10選鈕欄),checkbox(核取方塊欄),unix_time(時間戳記),date(yyyy-mm-dd),hidden
  3. 陣列元素之索引為長欄名,值為陣列,其諸元素說明如下:
    1. $formType[lc_name][0]欄的種類;
      • wrap欄,除欄的種類外,無其他元素,作用是將欄值中的「;」轉成換行,於tran屬性為真時表現。
      • auto是陣列
    2. $formType[lc_name][1]欄值和提示
      • select,select22,radio,radioyn,checkbox,date為陣列,元素索引是欄值,元素值是提示
      • hidden,unix_time是字串,hidden是算出欄值的函式、unix_time是格式。
      • auto是陣列,陣列中放的是各種文字過濾器,作用於顯示區,不作用於頭區及表單區
      • oneWaySwitch是陣列
    3. $formType[lc_name][2]後送條件
      • 僅函式產生值自動後時才會有,目前僅unix_time,hidden
      • 編一筆和插一筆各有:以函式生值隱藏後送(簡稱函)、由使用者輸入(簡稱手)、不產生任何表單元素(簡稱不)三種情形,3×3共九種情形,其中有三種情形編、插都用不到函數生值(手不,不手,不不),但只用ins,ins_only,edit,both,預設描述了五種情形,還有一種情形未描述:編輯時函數生值隱藏後送,插入時不產生表單元素而以欄位預設值插入,建議此情形可命名為edit_only,但尚未實作。
  4. 派值範例:
      $formType=array('長欄名'=>array('select',array('值'=>'提示文字','值'=>'提示文字','值'=>'提示文字',…)),
                      '長欄名'=>array('select2',第一選單陣列,第二選單長欄名,第二選單二維陣列,第二選單以提示代表欄值),
                      '長欄名'=>array('select22',array(0=>'===請選擇===')),
                      '長欄名'=>array('searchSelect', array(''=>'===請輸入姓名或公司名稱===')),
                      '長欄名'=>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('function',函式名),
                      '長欄名'=>array('password',array('編碼方式'=>'編碼指示')),編碼方式目前有plain,其指示為1,MD5其指示有
                      '長欄名'=>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=>'按鈕字',值=>'按完字')),
                      '長欄名'=>array('wrap'),
                      );
  5. unix_time型:在body中強迫翻譯為日期時間樣式。其後的表單種類:
    • 'ins':在插入表單中以隱藏欄後傳mktime(),編輯表單則用小日曆。
    • 'ins_only':在插入表單中以隱藏欄後傳mktime(),編輯表單時則略過該欄不產生任何表單元素(原值將不會修改)。
    • 'edit':在編輯表單中以隱藏欄後傳mktime(),插入表單則用小日曆。
    • 'both':在插入表單及編輯表單中均以隱藏欄後傳mktime()。
    • 其他字串:在插入表單及編輯表單中均用小日曆。
  6. 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. 1代表body顯示時將欄值翻譯成對應之提示文字,提示文字在formType中指定。
  2. 預設為0,除unix_time外,其餘均不翻譯。

十、$formValidate:輸入驗證陣列。

  1. array(lc_name=>array('合法輸入值的正規表示式','驗證不過之提示'),lc_name=>array(…),…),以各欄的lc_name為索引。
  2. 預設值為空陣列。
可用的驗證正規表示式
'.+' 必填
'^[^\\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]))$' 合理的日期