3.
前台顯示、編輯、刪除
一、 前台讀出資料
- 前台基本架構
include_once "header.php" ; |
$xoopsOption [ 'template_main' ] = "前台樣板檔.tpl" ; |
include_once XOOPS_ROOT_PATH . "/header.php" ; |
include_once XOOPS_ROOT_PATH . '/footer.php' ; |
header.php
為自製檔案,主要用來引入mainfile.php
及其他必要(或自己想要)引入的檔案,其餘皆為XOOPS規範的東西,如樣板及頁首頁尾。
- 前台樣板檔命名建議為「
模組名稱_檔名.tpl
」,內容可如後台樣板,採自動引入機制。
- 記得修改檔名、調整
xoops_version.php
並進行模組更新。
二、 前台選單
interface_menu.php
是自製檔案,用來產生選單。此檔若存在,選單會崁入佈景選單中。
- 若不想讓佈景選單出現該模組選項,可將該檔內容複製到
header.php
中,並刪除該檔。
- 若要自行新增選項,其設定如下:
$interface_menu [選項文字] = "連結檔案.php" ; |
$interface_icon [選項文字] = "fontawsome圖示" ; |
- 要讓模組前台都有工具列,可在頁尾前加入:
$xoopsTpl ->assign( "toolbar" , toolbar_bootstrap( $interface_menu )); |
- 記得在樣板加入
<{$toolbar}>
即可
三、 從資料庫中讀取資料
- 讀取資料庫的內容,一律用
select
語法:
SELECT `查詢的欄位` [ FROM `資料表名稱` 附加的篩選條件] |
- 其中篩選條件語法如下(有順序關係,需注意):
[ group by `欄位名稱`][ having group 的篩選條件] |
[ order by {unsigned_integer | `欄位名稱` | formula} [ asc | desc ] ,...] |
- 在函數中會用到
$xoopsDB
, $xoopsTpl
, $TadUpFiles
物件,故記得進行 global
宣告。
- 利用
$xoopsDB->query()
送出資料,並將傳回的控制器存至變數中,例如$result
。
- 利用
$snews=$xoopsDB->fetchArray($result)
取得該資料的陣列。 其中,$snews
的陣列內容如: $snews['sn']
、$snews['title']
...等同PHP的$result->fetch_assoc()
四、 取得上傳的檔案列表
- 利用
$TadUpFiles->show_files()
可取得所有上傳檔案的列表。其詳細參數為show_files($上傳欄位名稱, $是否顯示縮圖, $顯示模式, $顯示說明, $顯示下載, $呈現數量, $路徑, $是否加密, $播放速度, $以說明取代檔名, $關鍵字, $僅顯示有關建字檔案, $連結開啟位置)
,基本上,除了第一個以外,其餘皆非必填。
$TadUpFiles ->set_col( 'sn' , $sn ); |
$show_files = $TadUpFiles ->show_files( 'pic' , true, '' , true, null, null, null, true); |
- 顯示模式可以是:
空值
(縮圖)、small
(小圖示)、filename
(文字列表)、file_url
(連結)、file_text_url
(文字連結)
五、 讀出資料的安全性過濾
- 當初存入時會希望完整存入,固有可能會存入一些危險語法(如果有的話),因此,從資料庫讀出資料時必須過濾一些可能會危害網站的語法。
- 根據資料量分為兩類,一種是大量文字類(例如textarea大量文字框或CKEditor編輯器的欄位),另一種則是一般資料,如姓名、數字...等。
$myts = MyTextSanitizer::getInstance(); |
$snews [ 'content' ] = $myts ->displayTarea( $snews [ 'content' ], 1, 0, 0, 0, 0); |
$snews [ 'title' ] = $myts ->htmlSpecialChars( $snews [ 'title' ]); |
- 呈現大量文字:
$myts->displayTarea($text, $html=0, $smiley=1, $xcode=1, $image=1, $br=1);
- (1) 「
$text
」就是要被處理之後呈現的文字。
- (2) 「
$html
」是否允許使用HTML語法,用所見即所得編輯器製作出來的請填 1。
- (3) 「
$smiley
」是否轉換表情圖,預設為1,會將:) 這類的符號轉換為圖片。
- (4) 「
$xcode
」是否使用BBCode,如:[color=red]文字[/color]。
- (5) 「
$image
」是否允許在文字中使用圖片。若為0,圖片會以連結來顯示。
- (6) 「
$br
」是否要將「\n
」換行符轉換為<br>
,用所見即所得編輯器者請設為 0。
- 呈現一般文字:
$myts->htmlSpecialChars($text, $quote_style=ENT_QUOTES, $charset= null, $double_encode=true);
- (1) 「
$text
」就是要被處理之後呈現的文字。
- (2) 「
$quote_style
」要處理的引號模式,「ENT_COMPAT
」僅處理雙引號;「ENT_QUOTES
」處理雙引號和單引號(預設);「ENT_NOQUOTES
」不對任何引號進行處理。
- (3) 「
$charset
」轉換的預設編碼,通常使用預設值即可。
- (4) 「
$double_encode
」只有PHP 5.2.3之後才有效。若設為false,則不對現有的HTML實體做編碼的動作。
六、 取得上傳的單一圖案
- 利用
$TadUpFiles->get_pic_file()
可取得指定的檔案。其詳細參數為get_pic_file($顯示模式, $顯示種類, $檔案編號, $是否加密)
,搭配set_col()
,可取得一個圖案。
$TadUpFiles ->set_col( 'sn' , $sn , 1); |
$file = $TadUpFiles ->get_pic_file(); |
- 「
$顯示模式
」可以是:images
(大圖,預設)、thumb
(小圖),file
(檔案)
- 「
$顯示種類
」可以是:url
(連結網址,預設)、dir
(實體路徑)
- 隨機假圖:https://picsum.photos/400/200?image={$article@index}
- 縮圖樣式部份:https://css-tricks.com/almanac/properties/o/object-fit/
七、 XOOPS中Smarty迴圈相關用法
- Smarty迴圈用來處理陣列,常用方法如下:
<{foreach from=$來源變數 item=$別名 name=迴圈別名}> |
- 迴圈還有一些特別的用法:
<{$smarty.foreach.迴圈別名.first}> 迴圈第一圈 |
<{$smarty.foreach.迴圈別名.last}> 迴圈最後一圈 |
<{$smarty.foreach.迴圈別名.index}> 取得迴圈的索引值,依序輸出0、1、2...... |
<{$smarty.foreach.迴圈別名.iteration}> 取得迴圈的計數值,依序輸出1、2、3...... |
<{$smarty.foreach.迴圈別名.total}> 取得迴圈執行總數 |
八、 修改判斷管理權限機制
- 原本的
$isAdmin
稍嫌麻煩,在函數中或樣板中使用必須global
或assign
,改為session
會方便許多。
if (!isset( $_SESSION [ 'isAdmin' ])) { |
$_SESSION [ 'isAdmin' ] = ( $xoopsUser ) ? $xoopsUser ->isAdmin() : false; |
- 在樣板中,可以利用
<{$smarty.session.isAdmin}>
來判斷是否對該模組有管理權
<{if $smarty.session.isAdmin}> |
< a href="admin/main.php? op = snews_form &sn=<{$snews.sn}>">修改文章</ a > |
九、 修改資料
- 表單部份請加一個$sn參數,若有,表示編輯,若無,表示新增,此外,修改隱藏欄位
$form ->addElement( new XoopsFormHidden( 'op' , 'snews_update' )); |
$form ->addElement( new XoopsFormHidden( 'sn' , $sn )); |
$form ->addElement( new XoopsFormHidden( 'op' , 'snews_insert' )); |
- 最後製作修改內容的函數即可。更新語法為:
update `資料表名稱` set `欄位1`= '值1' , `欄位2`= '值2' , ... [ where 篩選條件] [limit 筆數] |
- 其中建立日期、計數器(若有)不用更新,uid則視情況,各有優缺點。
十、 刪除資料
- 開啟
tadtools/sweet_alert.php
,裡面有範例
include_once XOOPS_ROOT_PATH . "/modules/tadtools/sweet_alert.php" ; |
$sweet_alert = new sweet_alert(); |
$sweet_alert ->render( "snews_delete" , "index.php?op=snews_delete&sn=" , 'sn' ); |
- 上面語法會產生刪除的javascript函數,完整函數為
snews_delete(sn)
;
- 在樣板檔加入:
< a href="javascript:snews_delete(<{$snews.sn}>)" class="btn btn-danger">刪除</ a > |
- 接著新增流程,並製作
snews_delete()
刪除函數即可,刪除的SQL語法為
delete from `資料表名稱` [ where 篩選條件] [limit 筆數] |
- 函數如:
function snews_delete( $sn ) |
global $xoopsUser , $xoopsDB , $TadUpFiles ; |
$tbl = $xoopsDB ->prefix( 'snews' ); |
$uid = $xoopsUser ->uid(); |
$and_uid = $_SESSION [ 'isAdmin' ] ? "and `uid`='$uid'" : '' ; |
$sql = "delete from `$tbl` where `sn`='$sn' $and_uid" ; |
$result = $xoopsDB ->queryF( $sql ) or web_error( $sql ); |
$TadUpFiles ->set_col( 'sn' , $sn ); |
$TadUpFiles ->del_files(); |
- 刪除時,若非管理員,則判斷是否為發布者本人始能刪除,此外,記得也要刪除檔案。
十一、避免偽造表單
- 請在儲存或更新時加入以下檢查
if (! $GLOBALS [ 'xoopsSecurity' ]->check()){ |
$error =implode( "<br>" , $GLOBALS [ 'xoopsSecurity' ]->getErrors()); |
throw new Exception( $error ); |