:::

3. 前台顯示、編輯、刪除

一、 前台讀出資料

  1. 前台基本架構
    <?php
    include_once "header.php";
    $xoopsOption['template_main'] = "前台樣板檔.tpl";
    include_once XOOPS_ROOT_PATH . "/header.php";
    //內容
    include_once XOOPS_ROOT_PATH . '/footer.php';
  2. header.php為自製檔案,主要用來引入mainfile.php及其他必要(或自己想要)引入的檔案,其餘皆為XOOPS規範的東西,如樣板及頁首頁尾。
  3. 前台樣板檔命名建議為「模組名稱_檔名.tpl」,內容可如後台樣板,採自動引入機制。
  4. 記得修改檔名、調整xoops_version.php並進行模組更新。

二、 前台選單

  1. interface_menu.php是自製檔案,用來產生選單。此檔若存在,選單會崁入佈景選單中。
  2. 若不想讓佈景選單出現該模組選項,可將該檔內容複製到header.php中,並刪除該檔。
  3. 若要自行新增選項,其設定如下:
    $interface_menu[選項文字] = "連結檔案.php";
    $interface_icon[選項文字] = "fontawsome圖示";
  4. 要讓模組前台都有工具列,可在頁尾前加入:
    $xoopsTpl->assign("toolbar", toolbar_bootstrap($interface_menu));
  5. 記得在樣板加入<{$toolbar}>即可

三、 從資料庫中讀取資料

  1. 讀取資料庫的內容,一律用 select 語法:
    SELECT `查詢的欄位` [FROM `資料表名稱` 附加的篩選條件]
  2. 其中篩選條件語法如下(有順序關係,需注意):    
    [where 篩選條件]
    [group by `欄位名稱`][having group的篩選條件]
    [order by {unsigned_integer | `欄位名稱` | formula} [asc | desc] ,...]
    [limit [起點,] 筆數]
  3. 在函數中會用到 $xoopsDB, $xoopsTpl, $TadUpFiles 物件,故記得進行 global 宣告。
  4. 利用 $xoopsDB->query() 送出資料,並將傳回的控制器存至變數中,例如$result
  5. 利用 $snews=$xoopsDB->fetchArray($result) 取得該資料的陣列。 其中,$snews 的陣列內容如: $snews['sn']$snews['title']...等同PHP的$result->fetch_assoc()

四、 取得上傳的檔案列表

  1. 利用$TadUpFiles->show_files()可取得所有上傳檔案的列表。其詳細參數為show_files($上傳欄位名稱, $是否顯示縮圖, $顯示模式, $顯示說明, $顯示下載, $呈現數量, $路徑, $是否加密, $播放速度, $以說明取代檔名, $關鍵字, $僅顯示有關建字檔案, $連結開啟位置),基本上,除了第一個以外,其餘皆非必填。
    $TadUpFiles->set_col('sn', $sn);
    $show_files = $TadUpFiles->show_files('pic', true, '', true, null, null, null, true);
  2. 顯示模式可以是:空值(縮圖)、small(小圖示)、filename(文字列表)、file_url(連結)、file_text_url(文字連結)

五、  讀出資料的安全性過濾

  1. 當初存入時會希望完整存入,固有可能會存入一些危險語法(如果有的話),因此,從資料庫讀出資料時必須過濾一些可能會危害網站的語法。
  2. 根據資料量分為兩類,一種是大量文字類(例如textarea大量文字框或CKEditor編輯器的欄位),另一種則是一般資料,如姓名、數字...等。
    $myts = MyTextSanitizer::getInstance();
    $snews['content'] = $myts->displayTarea($snews['content'], 1, 0, 0, 0, 0);
    $snews['title']   = $myts->htmlSpecialChars($snews['title']);
  3. 呈現大量文字: $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
  4. 呈現一般文字: $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實體做編碼的動作。

六、 取得上傳的單一圖案

  1. 利用$TadUpFiles->get_pic_file()可取得指定的檔案。其詳細參數為get_pic_file($顯示模式, $顯示種類, $檔案編號, $是否加密),搭配set_col(),可取得一個圖案。
    $TadUpFiles->set_col('sn', $sn, 1);
    $file = $TadUpFiles->get_pic_file();
  2. $顯示模式」可以是:images(大圖,預設)、thumb(小圖),file(檔案)
  3. $顯示種類」可以是:url(連結網址,預設)、dir(實體路徑)
  4. 隨機假圖:https://picsum.photos/400/200?image={$article@index}
  5. 縮圖樣式部份:https://css-tricks.com/almanac/properties/o/object-fit/
    img.cover  {
      width: 100%;
      height: 200px;
      object-fit: cover;
    }

七、 XOOPS中Smarty迴圈相關用法

  1. Smarty迴圈用來處理陣列,常用方法如下:
    <{foreach from=$來源變數 item=$別名 name=迴圈別名}>
      <{$別名.索引}>
    <{foreachelse}>
      該變數沒有值時要出現的內容
    <{/foreach}>
  2. 迴圈還有一些特別的用法:
    <{$smarty.foreach.迴圈別名.first}> 迴圈第一圈
    <{$smarty.foreach.迴圈別名.last}> 迴圈最後一圈
    <{$smarty.foreach.迴圈別名.index}> 取得迴圈的索引值,依序輸出0、1、2......
    <{$smarty.foreach.迴圈別名.iteration}> 取得迴圈的計數值,依序輸出1、2、3......
    <{$smarty.foreach.迴圈別名.total}> 取得迴圈執行總數

八、 修改判斷管理權限機制

  1. 原本的$isAdmin稍嫌麻煩,在函數中或樣板中使用必須globalassign,改為session會方便許多。
    if (!isset($_SESSION['isAdmin'])) {
        $_SESSION['isAdmin'] = ($xoopsUser) ? $xoopsUser->isAdmin() : false;
    }
  2. 在樣板中,可以利用<{$smarty.session.isAdmin}>來判斷是否對該模組有管理權
    <{if $smarty.session.isAdmin}>
        <a href="admin/main.php?op=snews_form&sn=<{$snews.sn}>">修改文章</a>
    <{/if}>

九、 修改資料

  1. 表單部份請加一個$sn參數,若有,表示編輯,若無,表示新增,此外,修改隱藏欄位
    if ($sn) {
        $form->addElement(new XoopsFormHidden('op', 'snews_update'));
        $form->addElement(new XoopsFormHidden('sn', $sn));
    } else {
        $form->addElement(new XoopsFormHidden('op', 'snews_insert'));
    }
  2. 最後製作修改內容的函數即可。更新語法為:
    update `資料表名稱` set `欄位1`='值1', `欄位2`='值2', ... [where 篩選條件] [limit 筆數]
  3. 其中建立日期、計數器(若有)不用更新,uid則視情況,各有優缺點。

十、 刪除資料

  1. 開啟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');
  2. 上面語法會產生刪除的javascript函數,完整函數為 snews_delete(sn);
  3. 在樣板檔加入:
    <a href="javascript:snews_delete(<{$snews.sn}>)" class="btn btn-danger">刪除</a>
  4. 接著新增流程,並製作 snews_delete() 刪除函數即可,刪除的SQL語法為
    delete from `資料表名稱` [where 篩選條件] [limit 筆數]
  5. 函數如:
    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();
    }
  6. 刪除時,若非管理員,則判斷是否為發布者本人始能刪除,此外,記得也要刪除檔案。

十一、避免偽造表單

  1. 請在儲存或更新時加入以下檢查
    //安全判斷
    if(!$GLOBALS['xoopsSecurity']->check()){
      $error=implode("<br>" , $GLOBALS['xoopsSecurity']->getErrors());
      throw new Exception($error);
    }

     

    第三週模組下載


:::

搜尋

QR Code 區塊

https%3A%2F%2Fwww.tad0616.net%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D44%26tbdsn%3D1439

書籍目錄

展開 | 闔起

線上使用者

34人線上 (8人在瀏覽線上書籍)

會員: 0

訪客: 34

更多…