2.
後台頁面與表單物件

一、 今天要做的流程:
- 產生資料庫架構檔,安裝時才會自動建立出所需的資料表(務必再安裝模組前完成)
- 建立後台管理頁面,需先設定好後台選單,並建立該檔案的樣板以及相關語系。
- 編輯樣板檔,建立刊物建立表單,並使之可以存入資料庫。
二、 匯出SQL檔案
- http://163.26.52.243/~帳號/modules/tad_adm/pma.php
- 儲存至模組的sql目錄下為mysql.sql,並將裡面的一些註解及 set 刪除,避免日後模組無法安裝。
- 修改 xoops_version.php:
1 | $modversion [ 'sqlfile' ][ 'mysql' ] = "sql/mysql.sql" ; |
2 | $modversion [ 'tables' ][1] = "ebook" ; |
3 | $modversion [ 'tables' ][2] = "ebook_page" ; |
- 至此已經可以將模組安裝起來囉!
三、 XOOPS的模組管理後台
- XOOPS並沒有規定一定要有管理後台,若是沒有管理後台,只要在xoops_version.php中把$modversion['hasAdmin']設為0即可。
- $modversion['adminindex'] = 'admin/index.php'; 定義當使用者點選模組管理時,要連到的後台預設頁面。
- $modversion['adminmenu'] = 'admin/menu.php'; 定義後台模組管理界面的其他功能選單。
四、 模組管理後台選單檔
- 每多一個功能選項,請多一組以下設定,其中路徑部份是以該模組目錄為基準(頭尾那兩組設定無須動它,改中間那組即可)。
04 | $adminmenu [ $i ][ 'title' ] = _MI_TAD_EBOOK_ADMENU1; |
06 | $adminmenu [ $i ][ 'link' ] = "admin/main.php" ; |
08 | $adminmenu [ $i ][ 'desc' ] = _MI_TAD_EBOOK_ADMENU1_DESC ; |
10 | $adminmenu [ $i ][ 'icon' ] = 'images/admin/ebook.png' ; |
- 有中文的地方盡量用語系常數,直打中文也行,只是這樣只有相同編碼的網站才能使用。
- admin/menu.php的語系一樣是放在language/tchinese_utf8/modinfo.php中。
1 | define( '_MI_TAD_EBOOK_ADMENU1' , '電子刊物管理' ); |
2 | define( '_MI_TAD_EBOOK_ADMENU1_DESC' , '電子刊物管理' ); |
五、 模組管理後台架構
- 後台檔案最基本架構如admin/main.php,樣板檔位置在templates下,一般建議命名規則為「模組名_目錄_檔名.html」。樣板要在引入header.php之前設定好。
2 | $xoopsOption [ 'template_main' ] = "tad_ebookadm_main.html" ; |
4 | include_once "header.php" ; |
6 | include_once "../function.php" ; |
- 請將templates/demo_adm_index.html改為實際樣板名稱(連同b3樣板一起改)。
- xxx_b3.html是bootstrap3的樣板,等日後預設樣板做好後,再來轉為b3樣板即可。
- 頁尾需引入頁尾檔。至於中間部份隨人習慣任意發揮。
1 | include_once 'footer.php' ; |
- 【重要】記得修改 xoops_version.php中的樣板設定,改完請更新模組,以套用新值。
六、 物件的基本動作
- PHP的Class(類)是一個物件藍圖
- 要讓Class有作用需要經過實體化(new)的動作:$物件 = new PHP_Class();
- 物件會有所謂的方法(method)其實就是函數,讓您對此物件進行設、取值或執行特定物件功能:$物件->方法();
- XOOPS的表單物件設定完,最後都需要進行$物件->render();以產生程式碼。
- 詳細的XOOPS Class請參考:http://api.xoops.org/2.5.6/annotated.html
七、 XOOPS內建表單Class
- 要使用內建表單需先引入此行:
1 | include_once(XOOPS_ROOT_PATH. "/class/xoopsformloader.php" ); |
- 建立一個表單:
1 | $form = new XoopsThemeForm( '表單標題' , 'name' , 'action.php' , 'post' , '使用token' , '摘要' ); |
- 把表單元件加入表單中的方法:
1 | $form ->addElement($元件變數); |
- 把幾個元件組合在一起,並放到表單中:
1 | $Tray = new XoopsFormElementTray( '標題' , ' ' , 'name' ); |
2 | $Tray ->addElement( new XoopsFormButton( '' , 'name' , '送出' , 'submit' )); |
3 | $Tray ->addElement( new XoopsFormButton( '' , 'name' , '清除' , 'reset' )); |
4 | $form ->addElement( $Tray ); |
- 產生表單程式碼:
- 各種表單元件:
02 | $Label = new XoopsFormLabel( '標題' , '內容' ); |
04 | $Text = new XoopsFormText( '標題' , 'name' , 大小 , 最大長度 , '值' ); |
06 | $Hidden = new XoopsFormHidden( 'name' , '值' ); |
08 | $Token = new XoopsFormHiddenToken( 'XOOPS_TOKEN' ,360); |
10 | $form ->setExtra( "enctype='multipart/form-data'" ); |
11 | $File = new XoopsFormFile( '標題' , 'name' , '2048' ); |
13 | $Password = new XoopsFormPassword( '標題' , 'name' , 大小, 最大長度, '值' ); |
15 | $TextArea = new XoopsFormTextArea( '標題' , 'name' , '值' , 欄寬 , 列高 , 'id' ); |
17 | $DateSelect = new XoopsFormTextDateSelect( '標題' , 'name' , 15, 0); |
19 | $DateTime = new XoopsFormDateTime( '標題' , 'name' , 15, 0); |
21 | $DhtmlTextArea = new XoopsFormDhtmlTextArea( '標題' , 'name' , '值' , 欄寬 , 列高); |
23 | $Button = new XoopsFormButton( '標題' , 'name' , '值' , '類型' ); |
- 有選項的表單元件,其選項預設值得設定方式為:
1 | $表單元件->setValue($多重預設值陣列); |
- 新增選項方式有兩種,第一種是一個一個加入:
1 | $表單元件->addOption( '選單值1' , '顯示值1' , false); |
- 第二種是先設好選項陣列,一次加入。(和上面那種方法可以同時使用)
1 | $options [ '選單值2' ]= '顯示值2' ; |
2 | $options [ '選單值3' ]= '顯示值3' ; |
3 | $表單元件->addOptionArray( $options ); |
- 所有有選項的表單元件:
02 | $CheckBox = new XoopsFormCheckBox( '標題' , 'name' , '值' , 'id' ); |
04 | $Radio = new XoopsFormRadio( '標題' , 'name' , '值' ); |
06 | $RadioYN = new XoopsFormRadioYN( '標題' , 'name' , '值' ); |
08 | $Select = new XoopsFormSelect( '標題' , 'name' , '預設值' , 大小, 多選); |
10 | $SelectCheckGroup = new XoopsFormSelectCheckGroup( '標題' , 'name' , '值' , 大小 ,多選); |
12 | $SelectCountry = new XoopsFormSelectCountry( '標題' , 'name' , 'TW' , 大小); |
14 | $SelectEditor = new XoopsFormSelectEditor(& $form , 'name' , '值' , 使用HTML , 可選編輯器陣列); |
16 | $SelectGroup = new XoopsFormSelectGroup( '標題' , 'name' , 含訪客, '值' , 大小 ,多選); |
18 | $SelectLang = new XoopsFormSelectLang( '標題' , 'name' , '值' , 大小); |
20 | $SelectMatchOption = new XoopsFormSelectMatchOption( '標題' , 'name' , '值' , 大小); |
22 | $SelectTheme = new XoopsFormSelectTheme( '標題' , 'name' , '值' , 大小); |
24 | $SelectTimezone = new XoopsFormSelectTimezone( '標題' , 'name' , '值' , 大小); |
26 | $SelectUser = new XoopsFormSelectUser( '標題' , 'name' , 含訪客, '值' , 大小 ,多選); |
八、 在內建表單元件加入額外設定
- 利用$表單元件->setExtra()的方法,可以在表單元件中加入任何額外的語法。
1 | $Text ->setExtra( "class='span12'" ); |
2 | $Text ->setExtra( "style='width: 90%'" ); |
3 | $Text ->setExtra( "placeholder='請輸入標題'" ); |
九、 $xoopsTpl 樣板物件,將程式執行結果傳送至樣板
- 樣板(template)是使用者眼睛看到的界面,我們經由程式產生的任何結果,都可以傳送至樣板以便呈現在畫面上。
- 若是在函數中要使用$xoopsTpl樣板物件,記得用global $xoopsTpl,才能使用。
- 其用法如下:
1 | $xoopsTpl ->assign( '樣板標籤' , $呈現的內容); |
- 在樣板檔中(如:tad_ebookadm_main.html),用<{$樣板標籤}>來顯示其內容。
十、 $xoopsDB資料庫物件的幾個常用方法
- 若是在函數中要使用$xoopsDB樣板物件,記得用global $xoopsDB,才能使用。
- $xoopsDB->prefix('資料表名稱') 自動加上資料表前置字串
- $xoopsDB->query($sql) 及$xoopsDB->queryF($sql) 執行SQL語法
- $xoopsDB->getInsertId() 取得最後新增的編號
- $xoopsDB->fetchRow($result) 抓回以數字為索引的資料陣列
- (1) 得到的結果會像:$data[0]、$data[1]、$data[2]...這樣的
- (2) 可搭配list($sn,$title,$content)=$data 來將內容指派到變數中。
- $xoopsDB->fetchArray($result)抓回以欄名為索引的資料陣列
- (1) 得到的結果會像:$data['sn']、$data['title']、$data['content']...這樣的
- 寫入範例:
2 | $tbl = $xoopsDB ->prefix( 'ebook' ); |
4 | $sql = "insert into $tbl (`ebook_title` , `ebook_post_date` , `ebook_publish_date`) values('$ebook_title' , '$ebook_post_date' , '$ebook_publish_date')" ; |
6 | $xoopsDB ->query( $sql ) or die (mysql_error()); |
8 | $ebook_sn = $xoopsDB ->getInsertId(); |
十一、 建立必填欄位
- 建立表單時new XoopsThemeForm(),一定要設定name。
- 新增元件時addElement(),第二個參數設為true。
十二、 建立安全的表單
- 表單加入「安全檢查」的表單元件。 new XoopsFormHiddenToken();
- 儲存或更新時,請加入以下這段檢查語法,若不是合法表單,會被轉向到首頁:
2 | if (! $GLOBALS [ 'xoopsSecurity' ]->check()){ |
4 | $error =implode( "<br />" , $GLOBALS [ 'xoopsSecurity' ]->getErrors()); |
6 | redirect_header( $_SERVER [ 'PHP_SELF' ],3, $error ); |
十三、 從資料庫讀出資料
- 寫好SQL的select讀出語法,並利用 order by `欄位` 來進行排序。
- 利用while()迴圈,抓出所有資料,利用「.」(字串連接符)集成所有內容後,套進樣板檔中以便呈現。
02 | $tbl = $xoopsDB ->prefix( 'ebook' ); |
04 | $sql = "select * from $tbl order by ebook_post_date desc" ; |
06 | $result = $xoopsDB ->query( $sql ) or die (mysql_error()); |
08 | $list_ebook = "<h2>現有刊物列表</h2>" ; |
10 | while ( $ebook = $xoopsDB ->fetchArray( $result )){ |
12 | $list_ebook .= "<li>{$ebook['ebook_title']} ({$ebook['ebook_post_date']} 截稿, {$ebook['ebook_publish_date']} 發行)</li>" ; |
15 | $xoopsTpl ->assign( 'list_ebook' , $list_ebook ); |
- 樣板檔中記得用 <{$list_ebook}> 來顯示出所有內容。
- 若是在函數中要同時使用 $xoopsDB 及 $xoopsTpl 物件,可用「global $xoopsDB,$xoopsTpl;」,用逗號隔開,以便在函數中使用之。
- 目前用字串連接符把所有內容串起來的作法並非最佳方法,下次會說明如何做成樣板標籤的陣列值,使之彈性更大。