DedeCMS 後台添加自定義字段選「聯動類型」時,前台或後台無法正確加載二級選項,甚至報 JS 錯誤。經排查,核心原因是 路徑變量 $cmspath 缺少結尾斜杠,導致 JS/CSS 資源路徑錯誤(如 https://domain.com/include/...js 變成 https://domain.cominclude/...js)。
linked.js、jquery.linked.js)狀態 404。文件:include/customfields.func.php
搜索 $cmspath 相關代碼(多處),找到類似:
$cmspath = ( (empty($cfg_cmspath) || !preg_match('/[/$]/', $cfg_cmspath)) ? $cfg_cmspath.'/' : $cfg_cmspath );
// 在上述代碼之後添加
if (substr($cmspath, -1, 1) !== '/') {
$cmspath .= '/';
}
// 直接修改正則,匹配結尾是否為 /
$cmspath = ( (empty($cfg_cmspath) || !preg_match('/[\/]$/', $cfg_cmspath)) ? $cfg_cmspath.'/' : $cfg_cmspath );
原正則 /[/$]/ 邏輯錯誤: 字符類 [$/] 匹配「$」或「/」,但 $ 在正則中本意是「行尾」,放在字符類內變成字面量「$」。導致以「/」結尾也判定為不匹配,強制拼接「/」,產生雙斜杠;不以「/」結尾卻以「$」結尾(不可能)則不拼接。修正為 /[\/]$/ 專門匹配結尾斜杠。
cfg_cmspath 設置:後台「系統基本參數」→「站點根網址」應以 / 結尾(如 https://domain.com/ 或 /)。{$cfg_cmspath}、{$cfg_templets_skin} 等,確保輸出路徑正確。這是一個典型的「路徑拼接缺少分隔符」低級 Bug,修正正則或補充判斷即可徹底解決。建議項目中統一封裝 getCmsPath() 方法,集中處理路徑規範化,避免分散在各處重複造輪子。