:::
以下是建議,但非必須(不改也可以安裝在XOOPS2.5.11):
- XOOPS 2.5.11輕鬆架(windows版)可按此處下載
- XOOPS 2.5.11 支援 PHP8,並修改樣板引擎為 smarty 3.x,故模組需做以下調整修改:
模組修改原則
- 模組盡可能同時相容 XOOPS 2.5.10及2.5.11
- 模組盡可能同時相容 PHP 7.3~8.3
- 所有Tad已修改的模組都在這裡,可以自行下載安裝:https://github.com/tad0616?tab=repositories
- 練習用模組
日後升級步驟
- 先升級 tadtools
- 升級佈景
- 升級 tad_themes,並設定一下佈景(進去按儲存即可)
- 升級 tad_login(若有裝的話)
- 升級 tad_adm
以下必須做的(不改裝在XOOPS2.5.11網站就掛了):
Smarty 部份
<{includeq不再支援改為<{include<{includeq<{include<{xoAdminIcons後面的檔案需加上引號<{xoAdminIcons home.png}><{xoAdminIcons 'home.png'}>-
<{php}><{/php}>的用法不再支援,需改寫之<{php}> <{block不再支援,改為<{xoBlock<{block<{xoBlock<{xoAppUrl 'xxx.php'}>及<{xoImgUrl 'xxx.png'}>要加上引號,或改回<{$xoops_url}>/xxx.php、<{$xoops_imageurl}>/xxx.png更好,可跨檔取代(用正則表達式(Regular Expression)模式)比較快<\{xoAppUrl ([^}]*)\}><{$xoops_url}>/$1<\{xoImgUrl ([^}]*)\}><{$xoops_imageurl}>/$1-
<{assign}>的變數和值,若是字串,都要加引號,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:<\{assign var=([^ ]+) value=([^"$'\[\]truefalsenull0-9 ][^ ]*)\}><{assign var=$1 value="$2"}><\{assign var=([^"' ]+) value=([^ ]+)\}><{assign var="$1" value=$2}> - 使用未定義的變數可能會導致錯誤,可用正則表達式(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:''}> -
<{foreach}>的from和item的值(變數名稱)不可相同,找到請修改之,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:<\{foreach\s+(?:(?:item=([\w]+)\s+from=\$\1)|(?:from=\$(\w+)(?:\s+key=\w+)?\s+item=\2))
修改xoops_version.php
- 版本寫法需判斷版本來決定寫法:
$modversion['version'] = $_SESSION['xoops_version'] >= 20511 ? '5.0.0-Stable' : '5.0'; - 若上方行不通,可改用下方:
<?php use XoopsModules\Tadtools\Utility; $xoops_version = Utility::get_version('xoops');$modversion['version'] = $xoops_version >= 20511 ? '2.0.0-Stable' : '2.0';
以下是建議,但非必須(不改也可以安裝在XOOPS2.5.11):
Font awesome圖示一律改用Font awesome 6
修改admin/header.php
- 統一後台外觀,請視情況自行調整:
// Define Stylesheet and JScript $xoTheme->addStylesheet(XOOPS_URL . '/modules/tadtools/css/iconize.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
- 註解沒啥用的頁尾(非必須)
// 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();
修改寫入資料前過濾方式(若已改為參數化則都不需要)
- 原方式似乎已無效果,故改用另一種方式(更建議改用參數化查詢):
$myts->addSlashes($xoopsDB->escape(
改用參數化查詢
- 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);-
$sql是prepare語句,參數部份用?取代,不要有引號 -
$types是參數格式類型,數字為i,字串為s,浮點數為d,二進位資料為b -
$params是參數,陣列格式。$sql 有幾個?就要對應幾個變數。
-
-
若想移除事先的過濾變數,可跨檔取代(用正則表達式(Regular Expression)模式)比較快
(\$\w+)\s*=\s*\$xoopsDB->escape\((.*?)\);$1 = $2; -
可以用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__);; 之後所有貼上來的程式語法,請都依據此規則進行修改,並直接顯示修改後結果即可,不需要加上任何說明。
無障礙調整
- 凡是有用到所見即所得的編輯器,其欄位值在寫入資料庫之前可以用
Wcag::amend()的物件方法來進行無障礙調整use XoopsModules\Tadtools\Wcag;$description = Wcag::amend($_POST['description']);
AJAX檔案強制關閉除錯
有些沒有套用樣板的檔案(例如用來做ajax處理的檔案),在開除錯時,該區域也會出現除錯訊息,可以在檔案中加入以下兩行強制關閉之。
$xoopsLogger->activated = false;
注意陣列
- 要數陣列或者判斷陣列,需先確認是否為陣列,或者是否有值
@count<{if $columns}><{$columns|@count}><{/if}>
簡化xoops_version.php
- 將一些陣列貼到去AI去簡化一下:
請簡化PHP寫法,程式碼越少越好,簡化時,一律從0開始即可,亦即不需要顯示索引值,直接顯示簡化後結果,無須額外說明。
修改 header.php 並建立 interface.php
- header.php寫法範例(有function.php才需要引入function.php)
<?php require_once dirname(dirname(__DIR__)) . '/mainfile.php'; require_once __DIR__ . '/function.php'; require_once __DIR__ . '/interface.php'; - 建立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,後台才能正確列出前台路徑,網路地圖也才能正確擷取。
- 若是有需要權限才會顯示的項目,務必加個
or $_SERVER['PHP_SELF'] == '/admin.php',以便讓後台也可以讀取