1041 XOOPS模組開發
一、 smarty樣板
- 樣板(template)是使用者眼睛看到的界面,我們經由程式產生的任何結果,都可以傳送至樣板以便呈現在畫面上。
- 樣板檔=html檔+smarty樣板標籤,樣板標籤看起來像這樣:<{$樣板標籤}>
- XOOPS透過$xoopsTpl物件,來將PHP產生的值套用到樣板中(即樣板標籤):
- $xoopsTpl->assign('樣板標籤' , $值);
- 若是在函數中要使用$xoopsTpl樣板物件,記得用global $xoopsTpl,才能使用。
- 若要在樣板中直接使用語系,請用:
- <{$smarty.const._語系名稱}>
- 樣板標籤除了一次傳一個值外,也可以傳陣列,方法一模一樣,但陣列格式必須像這樣:
資料庫 二維陣列格式 實際範例 第一筆資料 $陣列名稱[0]['索引名稱1']
$陣列名稱[0]['索引名稱2']
$陣列名稱[0]['索引名稱3']$list_ebook[0]['ebook_sn']=1;
$list_ebook[0]['ebook_title']="第一期 創刊號";
$list_ebook[0]['ebook_post_date']="2015-04-15";第二筆資料 $陣列名稱[1]['索引名稱1']
$陣列名稱[1]['索引名稱2']
$陣列名稱[1]['索引名稱3']$list_ebook[1]['ebook_sn']=2;
$list_ebook[1]['ebook_title']="第二期 會考特輯";
$list_ebook[1]['ebook_post_date']="2015-05-15"; - 利用 $ebook = $xoopsDB->fetchArray($result); 剛好可以取得一維陣列,即:
$ebook['ebook_sn']=1;
$ebook['ebook_title']="第一期 創刊號";
$ebook['ebook_post_date']="2015-04-15";該筆資料的「ebook_sn」欄位值
該筆資料的「ebook_title」欄位值
該筆資料的「ebook_post_date」值 - 也就是說,在while迴圈中,再給予一個數字索引即可完成所需的二維陣列 //用$i做第一個索引,這裡先設初始值 $i=0; //設定二維陣列變數的初始值 $list_ebook=""; //用迴圈一筆一筆抓出資料庫的數據 while($ebook = $xoopsDB->fetchArray($result)){ //將抓出的數據陣列,放到一維陣列中 $list_ebook[$i]=$ebook; //索引值+1 $i++; } //將此陣列套用到樣板標籤 list_ebook $xoopsTpl->assign('list_ebook' , $list_ebook);
- 做好二維陣列並套用到樣板後,可以利用<{foreach}>的方式來一筆一筆讀出陣列值:
<{foreach from=$list_ebook item=ebook}>
<tr>
<td><{$ebook.ebook_sn}></td>
<td><{$ebook.ebook_title}></td>
<td><{$ebook.ebook_post_date}></td>
<td><{$ebook.ebook_publish_date}></td>
</tr>
<{/foreach}>從$list_ebook擷取一筆資料,並塞入ebook樣板標籤中
建立一列表格
秀出期刊編號
秀出期刊標題
秀出投稿截止日
秀出發行日
一列結束
迴圈結束 - from就是來自PHP的二維陣列變數
- item就是設定樣板標籤名稱,以便將該變數取出陣列值後,塞進此樣板標籤
- 樣板標籤若是陣列,其表示方式為:<{$樣板標籤.索引名稱}>
- 在表格標籤加入 class="table table-striped table-bordered table-hover"
- table-striped 會出現斑馬紋,較容易辨識
- table-bordered 會加入表格框線
- table-hover 移過去該列會變色,較醒目
- 利用 get 的傳遞方式可過連結來傳遞各種參數,格式為: <a href="檔案.php?參數1=值1&參數2=值2&參數3=值3">連結名稱</a>
- 流程控制是利用$op,所以需傳遞一個op變數,以便告訴程式接下來要執行什麼動作。
- 此外,還要傳遞流水號,如此,才能知道要刪除哪一筆資料(編號請用樣板標籤): <a href="main.php?op=delete_ebook&ebook_sn=編號">刪除</a>
- 一旦有設定一組op的動作(如op=delete_ebook),接收端(main.php)就必須在流程控制的switch中加入一組 case "delete_ebook": 的對應動作。 //若$op=del_ebook時 case "del_ebook": //執行del_ebook()函數以刪除資料 del_ebook($ebook_sn); //刪除後轉向回自己這頁 header("location:{$_SERVER['PHP_SELF']}"); //停止程式 exit; //跳出流程(基本上執行不到...) break;
- 由於del_ebook()需要傳入期刊編號$ebook_sn,此編號用get方式傳來,但未來易可能從post方式傳來,故在流程控制之前,可先產生$ebook_sn的初始值: $ebook_sn=empty($_REQUEST['ebook_sn'])?"":intval($_REQUEST['ebook_sn']);
- 這是三元一次式的寫法:(條件)?真:假;
- intval()用來強制數字化,用$_REQUEST則可接收來自get、post、cookie的變數。
- 在資料庫中要刪除資料的SQL語法: delete from 資料表where 條件
- 執行刪除或更新等動作時,需用 $xoopsDB->queryF($sql) 來強制執行 SQL 語法。
- 先修改原先的刪除連結,改為執行javascript函數 <a href="javascript:del_ebook_func(編號)" class="btn btn-mini btn-danger">刪除</a>
- 在樣板中,加入以下javascript函數語法(需在執行之前)
<script>
function del_ebook_func(sn){
var sure = window.confirm('確定要刪除此資料?');
if (!sure) return;
location.href="main.php?op=del_ebook&ebook_sn=" + sn;
}
</script>script起始標籤
定義del_ebook_func(ebook_sn)函數
使用確認框,將使用者的選擇存入sure變數
假如按「否」,則跳出函數,不執行刪除
跳轉頁面至main.php,並帶參數,+是連接符,連接sn參數
script結束標籤
- 和加入刪除的動作差不多,但op值可改為edit_ebook,一樣要傳遞流水號。
- 新增一組edit_ebook流程,直接呼叫原有的表單函數ebook_form($ebook_sn),並傳入流水號,以便修改之。換言之,有傳入流水號即修改,沒傳入流水號即新增。
- 在ebook_form()函數加入一組$ebook_sn參數。
- 修改時,需讀出原有資料,並將之設為表單元件預設值。
- 記得將$xoopsDB物件設為global,以便在函數中使用。 // 假如有流水號(更新模式) if($ebook_sn){ // 先加入資料表前置字串 $tbl=$xoopsDB->prefix('ebook'); // 讀取指定流水號的所有資料 $sql="select * from $tbl where $ebook_sn='$ebook_sn'"; // 送出執行,執行失敗則停止,並秀出原因 $result=$xoopsDB->query($sql) or die(mysql_error()); // 利用list()將得到的一筆結果,四個欄位值,分別塞入四個指定變數中。 list($ebook_sn,$ebook_title,$ebook_post_date,$ebook_publish_date) = $xoopsDB->fetchRow($result); // 設定$op值為 update_ebook $op="update_ebook"; // 將投稿截止日的日期轉為時間戳記 $ebook_post_date=strtotime($ebook_post_date); // 將發行日的日期轉為時間戳記 $ebook_publish_date=strtotime($ebook_publish_date); // 若沒有傳入流水號(新增模式) }else{ // 標題和編號初始值均為空值 $ebook_title=$ebook_sn=""; // 投稿截止日設為現在時間 $ebook_post_date=time(); // 發行日設為現在時間 $ebook_publish_date=time(); // 設定$op值為insert_ebook $op="insert_ebook"; }
- op的值記得改為變數,變根據不同情形,使用不同op。另加入ebook_sn的隱藏欄位,以便將流水號帶給下一個動作。 $form->addElement(new XoopsFormHidden('ebook_sn', $ebook_sn)); $form->addElement(new XoopsFormHidden('op', $op));
- 修改樣板檔,在列出所有期刊列表的語法前後,利用<{if $list_ebook}><{/if}>將之包起來,如此,只有在有傳入$list_ebook二維陣列時,才會出現列表。
- 編輯時,並不會產生$list_ebook陣列,故列表剛好可以隱藏,無須出現。
- 在流程新增一組update_ebook的流程,並建立update_ebook函數
- 在資料庫中要更新資料的SQL語法: update 資料表 set 欄位1='值1' , 欄位2='值2' , … where 條件
- 在<a>或<button>標籤中,加入 class="btn" 可使用bootstrap的按鈕風格
- btn-mini 可以讓按鈕縮小,另有btn-small或btn-large
- btn-primary 藍色按鈕,用在主功能按鈕,例如「送出」、「儲存」、「查詢」
- btn-warbing 黃色按鈕,有警告意味,例如「修改」
- btn-danger 紅色按鈕,較重要或危險之動作,例如「刪除」
- 另有btn-success 綠色按鈕及btn-info淺藍色按鈕可套用。