:::
重要 tad - 開發者公告 | 2024-07-08 | 點閱數: 600
  1. XOOPS 2.5.11輕鬆架可按此處下載
  2. XOOPS 2.5.11 支援 PHP8,並修改樣板引擎為 smarty 3.x,故模組需做以下調整修改:

模組修改原則

  1. 模組盡可能同時相容 XOOPS 2.5.10及2.5.11
  2. 模組盡可能同時相容 PHP 7.3~8.3
  3. 所有Tad已修改的模組都在這裡,可以自行下載安裝:https://github.com/tad0616?tab=repositories
  4. 練習用模組

日後升級步驟

  1. 先升級 tadtools
  2. 升級佈景
  3. 升級 tad_themes,並設定一下佈景(進去按儲存即可)
  4. 升級 tad_login(若有裝的話)
  5. 升級 tad_adm

Smarty 部份

  1. <{includeq 不再支援改為<{include
    <{includeq
    <{include
  2. <{xoAdminIcons 後面的檔案需加上引號
    <{xoAdminIcons home.png}>
    <{xoAdminIcons 'home.png'}>
  3.  <{php}><{/php}>的用法不再支援,需改寫之
    <{php}>
     
  4. <{block 不再支援,改為<{xoBlock
    <{block
    <{xoBlock
  5. <{xoAppUrl 'xxx.php'}><{xoImgUrl 'xxx.png'}> 要加上引號,或改回 <{$xoops_url}>/xxx.php<{$xoops_imageurl}>/xxx.png 更好,可跨檔取代(用正則表達式(Regular Expression)模式)比較快
    <\{xoAppUrl ([^}]*)\}>
    <{$xoops_url}>/$1
    <\{xoImgUrl ([^}]*)\}>
    <{$xoops_imageurl}>/$1
  6.  <{assign}>的變數和值,若是字串,都要加引號,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:
    <\{assign var=([^ ]+) value=([^"$'\[\]truefalsenull0-9 ][^ ]*)\}>
    <{assign var=$1 value="$2"}>
    <\{assign var=([^"' ]+) value=([^ ]+)\}>
    <{assign var="$1" value=$2}>
  7. 使用未定義的變數可能會導致錯誤,可用正則表達式(Regular Expression)模式修改比較快這樣改:
    <\{if\s+\$([a-zA-Z_][a-zA-Z0-9_]*)\}>
    <{if $$$1|default:false}>
    <\{if\s+(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\.[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)\}>
    <{if $1|default:false}>
    <\{assign\s+var="([a-zA-Z_][a-zA-Z0-9_]*)"\s+value=\$([a-zA-Z_][a-zA-Z0-9_]*)\}>
    <{assign var="$1" value=$$$2|default:''}>
    <\{(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}>
    <{$1|default:''}>
  8.  <{foreach}>的from和item的值(變數名稱)不可相同,找到請修改之,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:
    <\{foreach\s+(?:(?:item=([\w]+)\s+from=\$\1)|(?:from=\$(\w+)(?:\s+key=\w+)?\s+item=\2))

修改xoops_version.php

  1. 版本寫法需判斷版本來決定寫法:
    $modversion['version'] = $_SESSION['xoops_version'] >= 20511 ? '5.0.0-Stable' : '5.0';

     

  2. 若上方行不通,可改用下方:
    <?php
    use XoopsModules\Tadtools\Utility;
    $xoops_version = Utility::get_version('xoops');
     
    $modversion['version'] = $xoops_version >= 20511 ? '2.0.0-Stable' : '2.0';

     

修改admin/header.php

  1. 請視情況自行調整:
    // Define Stylesheet and JScript
    $xoTheme->addStylesheet(XOOPS_URL . '/modules/tadtools/css/iconize.css');
    $xoTheme->addStylesheet(XOOPS_URL . '/modules/tadtools/css/font-awesome/css/font-awesome.css');
    $xoTheme->addStylesheet(XOOPS_URL . "/modules/tadtools/css/xoops_adm{$_SESSION['bootstrap']}.css");
    $xoTheme->addStylesheet(XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . '/css/module.css');
    $xoTheme->addStylesheet(XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . '/css/admin.css');

     

修改admin/footer.php

  1. 註解沒啥用的頁尾(非必須)
    // echo '<div align="center"><a href="https://xoops.org" target="_blank"><img src="../images/admin/xoopsmicrobutton.gif" alt="XOOPS" title="XOOPS"></a></div>';
    // echo "<div class='center smallsmall italic pad5'><strong>" . $xoopsModule->getVar('name') . "</strong> is maintained by the <a class='tooltip' rel='external' href='https://xoops.org/' title='Visit XOOPS Community'>XOOPS Community</a></div>";
    
    xoops_cp_footer();
    

     

修改寫入資料前過濾方式(若已改為參數化則都不需要)

  1. 原方式似乎已無效果,故改用另一種方式(更建議改用參數化查詢):
    $myts->addSlashes(
    $xoopsDB->escape(

改用參數化查詢

  1. tadtools有新增一個 Utility::query($sql, $types = '', array $params = array(), $throwExceptions = true, $debug = true) 的物件,可以用參數化的方式來執行資料庫,更為安全。使用此方法,請勿過濾變數(例如:用 $xoopsDB->escape()$myts->addSlashes()來過濾變數)。範例:
    $sql = 'SELECT * FROM `' . $xoopsDB->prefix('tad_faq_cate') . '` WHERE `fcsn`=? AND `enable`=?';
    $result = Utility::query($sql, 'ii', [$fcsn, $enable]) or Utility::web_error($sql, __FILE__, __LINE__);
    $data = $xoopsDB->fetchArray($result);

     

    1. $sql 是prepare語句,參數部份用 ? 取代,不要有引號

    2. $types 是參數格式類型,數字為 i,字串為 s,浮點數為 d,二進位資料為 b

    3. $params是參數,陣列格式。$sql 有幾個 ? 就要對應幾個變數。

  2. 若想移除事先的過濾變數,可跨檔取代(用正則表達式(Regular Expression)模式)比較快

    (\$\w+)\s*=\s*\$xoopsDB->escape\((.*?)\);
    $1 = $2;
  3. 可以用AI協助處理(比較省事),亦可至這裡來處理: XOOPS 資料庫語法參數化 AI 工具

    你是一個PHP開發者,要修改MySQL資料庫 SQL 語句,以下是具體的需求:
    原始的 SQL 語句範例如下:
    $sql = "select count(*) from " . $xoopsDB->prefix("priv_msgs") . " where to_userid ='$uid' and enable=1 and read_msg='{$msg}' group by `to_userid`";
    $result = $xoopsDB->queryF($sql) or Utility::web_error($sql, __FILE__, __LINE__);;
    
    需根據以下條件進行修改:
    1.將 $xoopsDB->query() 或 $xoopsDB->queryF() 方法一律修改為 Utility::query()。
    2.將 SQL 語句中的變數的部份(如 $uid、$msg)改為參數化查詢(用?佔位符取代變數),並使用 Utility::query() 來傳入1或3個參數:
        (1)第一個參數是 SQL 語句。(必要)
        (2)第二個參數是變數類型格式字串,需根據第三個參數中的陣列元素,其值的型態字串用 s,整數用 i 來組成字串。(有用?佔位符取代變數時才需要此參數)
        (3)第三個參數是一個包含變數值的陣列,依序對應到 SQL 語句中的 ? 佔位符。(有用?佔位符取代變數時才需要此參數)
    3.資料庫欄位名稱與資料表名稱,加上反引號(`)以避免保留字問題。
    4.在 SQL 語句中,用 ? 替換原本的變數值,並移除該變數值的引號。
    5.使用? 佔位符後,若SQL語句中已經沒有單引號,則將雙引號改為單引號,以統一 SQL 語句的引號風格。
    6.貼上來的程式語法若有 $result = 這部分,不要遺漏 $result = 這部分,若沒有,也別自行加上去
    7.將 SQL 指令(如 SELECT, WHERE, GROUP BY 等)變為大寫。
    
    最終結果應該如以下範例所示:
    $sql = 'SELECT COUNT(*) FROM `' . $xoopsDB->prefix('priv_msgs') . '` WHERE `to_userid` =? AND `enable`=1 AND `read_msg`=? GROUP BY `to_userid`';
    $result = Utility::query($sql, 'is', [$uid, $msg]) or Utility::web_error($sql, __FILE__, __LINE__);;
    
    之後所有貼上來的程式語法,請都依據此規則進行修改,並直接顯示修改後結果即可,不需要加上任何說明。

     

無障礙調整

  1. 凡是有用到所見即所得的編輯器,其欄位值在寫入資料庫之前可以用 Wcag::amend() 的物件方法來進行無障礙調整
    use XoopsModules\Tadtools\Wcag;
    $description = Wcag::amend($_POST['description']);

AJAX檔案強制關閉除錯

有些沒有套用樣板的檔案(例如用來做ajax處理的檔案),在開除錯時,該區域也會出現除錯訊息,可以在檔案中加入以下兩行強制關閉之。

error_reporting(0);
$xoopsLogger->activated = false;

 

注意陣列

  1. 要數陣列或者判斷陣列,需先確認是否為陣列,或者是否有值
    @count
    <{if $columns}><{$columns|@count}><{/if}>

簡化xoops_version.php

  1. 將一些陣列貼到去AI去簡化一下:
    請簡化PHP寫法,程式碼越少越好,簡化時,一律從0開始即可,亦即不需要顯示索引值,直接顯示簡化後結果,無須額外說明。

     

修改 header.php 並建立 interface.php

  1. header.php寫法範例(有function.php才需要引入function.php)
    <?php
    require_once dirname(dirname(__DIR__)) . '/mainfile.php';
    require_once __DIR__ . '/function.php';
    require_once __DIR__ . '/interface.php';
    

     

  2. 建立interface.php(不需要將選項放到導覽列時)或interface_menu.php(要將選項放到導覽列時),例如:(建議也加上 $interface_icon 圖示,圖示可以到此查詢名稱
    <?php
    //判斷是否對該模組有管理權限
    if (!isset($_SESSION['tad_blocks_adm'])) {
        $_SESSION['tad_blocks_adm'] = ($xoopsUser) ? $xoopsUser->isAdmin() : false;
    }
    
    $interface_menu[_MD_TAD_BLOCKS_MY_BLOCKS] = "index.php";
    $interface_icon[_MD_TAD_BLOCKS_MY_BLOCKS] = "fa-cube";
    
    if ($_SESSION['tad_blocks_adm'] or $_SERVER['PHP_SELF'] == '/admin.php') {
        $interface_menu[_MD_TADBLOCKS_BLOCKS] = "blocks.php";
        $interface_icon[_MD_TADBLOCKS_BLOCKS] = "fa-cubes";
    }
    

    有interface.php或interface_menu.php,後台才能正確列出前台路徑,網路地圖也才能正確擷取。

  3. 若是有需要權限才會顯示的項目,務必加個 or $_SERVER['PHP_SELF'] == '/admin.php' ,以便讓後台也可以讀取
:::

快速登入


https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftadnews%2Findex.php%3Fnsn%3D20

計數器

今天: 4106410641064106
昨天: 2489248924892489
總計: 8026088802608880260888026088802608880260888026088