跳到主要內容

發表文章

目前顯示的是有「Smarty」標籤的文章

XOOPS 2.7 升級筆記:Smarty 4 不支援 <{php}> 的解決方法

 XOOPS 2.7 全面升級到 Smarty 4 後,舊佈景或舊模組最容易炸掉的地方,就是樣板裡的 `<{php}>...<{/php}>`。 原因很單純:Smarty 4 已經不支援在樣板中直接執行 PHP。也就是說,舊寫法如果還把 PHP 邏輯塞在 `.tpl` 裡,升級後就會出現 unknown tag、白畫面或 SmartyCompilerException。 目前比較穩的解法,不是去 hack Smarty,也不是讓 Smarty 重新開放任意 PHP,而是把原本散落在樣板中的 PHP 程式碼收回 PHP 檔案,整理成 function,再用 `$tpl->registerPlugin()` 註冊成 Smarty 標籤,最後在樣板中用新標籤取代原本的 `<{php}>`。 簡單說: 舊寫法: .tpl 直接寫 <{php}> PHP CODE <{/php}> 新寫法: PHP 檔建立 function → registerPlugin 註冊成 Smarty function → .tpl 改用 <{php_channel}> 這樣效果接近原本 `<{php}>`,但執行入口變乾淨,也比較符合 Smarty 4 的規則。 修改方法如下說明: 一、建立相容函式檔 建議先建立一個 PHP 檔,專門收納原本樣板裡的流浪 PHP,例如: modules/模組ID/function/tpl_smarty_compat.php 示例: <?php //Smarty 4 樣板流浪 PHP 收容區 function register_smarty_compat($tpl=""){ if(empty($tpl) || !is_object($tpl)) return; if(!method_exists($tpl,'registerPlugin')) return; static $registered=array(); $tplid=function_exists('spl_object_id') ? spl_object_id($tpl) : spl_object_hash($tpl); if(!empty($regist...

Xoops佈景區塊只用一個樣板程式顯示11個區塊內容包含自訂樣式的方法-教學撰寫:徐嘉裕Neil hsu

Xoops佈景其實可以透過樣板的includeq讀取子樣板傳遞變數,吧11個區塊陣列變數傳到1個樣板檔中執行,可以精簡樣版的使用也方便開發及定義內容樣式,方法如下: 1、先建立一個樣板檔->blockstpl.tpl放到佈景的tpl資料夾裡面 2、在blockstpl.tpl樣板中置如以下的code <div class="<{$site}>box"; <{foreach item=block from=$fromvar}> <aside> <h4 class="block-title"><{$block.title}></h4> <div class="blockcontent"><{$block.content}><div style='clear: both;'></div></div> </aside> <{/foreach}> </div> 3、然後就是佈景的bodytpl.tpl布局,依照設計需求分別引入blockstpl.tpl樣板並傳入$fromvar值 //左區塊 <{includeq file="$theme_name/blockstpl.tpl" fromvar=$xoBlocks.canvas_left  site=left}> //右區塊 <{includeq file="$theme_name/blockstpl.tpl" fromvar=$xoBlocks.canvas_right  site=right}> //中間上區塊 <{includeq file="$theme_name/blockstpl.tpl" fromvar=$xoBlocks.page_topcenter  site=topcenter}> //中間上左區塊 ...

寫一個清除Xoops->caches的function-教學撰寫:徐嘉裕Neil hsu

Xoops是使用Smarty樣板引擎產生內容,也就是吧php輸出成Smarty後再由樣版產生頁面,所以會產生樣板暫存檔(caches),當然Xoops後端也有刪除暫存檔的功能,不過我另外寫了一個刪除暫存檔的function方便使用,分享給大家參考! 1、在模組的function.php中加入以下code //刪除目錄中內容物件(不包含刪除目錄) function filedeletionArr($from="",$exclude="") { if (!file_exists($from)) {return false;} $dir = opendir($from); while (false !== ($file = readdir($dir))) { if ($file == '.' OR $file == '..') {continue;} if (is_dir($from . DIRECTORY_SEPARATOR . $file)) { filedeletionArr($from . DIRECTORY_SEPARATOR . $file); } else { if(empty(in_array($file, $exclude))){ unlink($from . DIRECTORY_SEPARATOR . $file); } } } closedir($dir); return true; } 2、然後再要使用刪除暫存檔的程式中呼叫 filedeletionArr(),例如定時自動刪除程式之類的,貼上以下code到程式中 // $from 暫存檔資料夾路徑 //$exclude 資料夾中不要刪除的檔案用陣列輸入 //清空smarty_cache filedeletionArr($from=XOOPS_VAR_PATH.'/caches/smarty_cache',$exclude=array('index.html')) //清空smarty_compile file...

php-smarty標籤切割字串的方法!!->xoops-教學撰寫:徐嘉裕Neil hsu

通常來說如果需要切割字串在後端php用preg_split就能處理好了,所以很少會需要在smarty上做切割字串,不過還是會有特殊情況, 例如在Xoops某個區塊標題輸入  最新消息 - Latest publicnotice 然後需要以 - 為中心切割成兩個字串,就是顯示(最新消息 及  Latest publicnotice) 但Xoops的區塊標題都是輸出成smarty樣版的,也就是<{$block.title}>,要處理還真的很麻煩,如果能在smarty上切割字串問題或許就好解決了!! 上網拜估狗大神發現一個不錯的方法,用explode可以切割smarty字串 <{assign var="blocktitle" value="-"|explode:$block.title}> 要切割字串的標題:最新消息-Latest publicnotice <{$blocktitle[0]}>  顯示:最新消息 <{$blocktitle[1]}>  顯示:Latest publicnotice 這樣問題就解決了,會這樣用是因為手機版介面不需要顯示那麼長的文字,所以吧英文的部份去掉留下中文就好,有需要的朋友參考看看吧!! 工作心的撰寫: 徐嘉裕 neil hsu

Xoops佈景升級jquery->jquery-3.5.1.min.js的方法-教學撰寫:徐嘉裕Neil hsu

Xoops佈景預設引入的jquery.js已經很老舊了,如果要引入最新的jquery-3.5.1.min.js則會與$xoops_module_header中預設jquery.js衝突,所以如果佈景要引入jquery-3.5.1.min.js必須做以下修改才行,移除Xoops預設的jquery.js。 1、在佈景樣板的<{$xoops_module_header}>標籤上方引入jquery-3.5.1.min.js,然後再引入jquery-migrate-3.3.0.min.js以便做舊版jquery.js的兼容,若沒引入jquery-migrate-3.3.0.min.js很多舊版的JS功能都會發生異常無法使用。 所以樣板程式就會是以下這樣 <{php}> global $xoopsTpl; //引入jquery-3.5.1.min.js $module_header.="<script src='".XOOPS_URL."/modules/neillibrary/js/jquery-3.5.1.min.js' type='text/javascript'></script>"; //引入jquery-migrate-3.3.0.min.js $module_header.="<script src='".XOOPS_URL."/modules/neillibrary/js/jquery-migrate-3.3.0.min.js' type='text/javascript'></script>"; echo $module_header; <{/php}> <!--module_header--> <{$xoops_module_header}> 2、再來解決$xoops_module_header重複引用jquery.js的問題,需要吧Xoops預設的jquery.js拿掉,還有tadtools中較舊版的jquery-migrate-3.0.0.min.js拿掉,這裡需要使用samty的replace功能,程式...

JQuery Tabs Generator頁籤修改範例(PHP端及JS優化修改)-教學撰寫:徐嘉裕Neil hsu

JQuery Tabs Generator是一個好用的頁籤生成器,輸入內容就能產生頁籤,大家可以點以下的網址自己試看看 https://www.html-code-generator.com/jquery/tabs-generator.php 不過如果要修改成用PHP迴圈輸出smarty樣板就還需要再做些修改,才能靈活實用美觀大方,像是下面這樣: 修改過後頁籤可隨資料自動增加跟刪減,如果只有一個頁籤也能正常顯示內容 以下為修改過的全部程式codo範例 php端-code $descriptionArr = array(); //建構陣列 $i=0; $descriptionArr[$i]['btntext']=_MD_SHOPWCASE20;  //按鈕文字 $descriptionArr[$i]['btncenter']=$productlimt['description'];  //頁籤內容 $descriptionArr[$i]['i']=$i;  //頁籤id $i++; $descriptionArr[$i]['btntext']=_MD_SHOPWCASE22;  //按鈕文字 $descriptionArr[$i]['btncenter']=$productlimt['specification'];  //頁籤內容 $descriptionArr[$i]['i']=$i;  //頁籤id $i++; $descriptionArr[$i]['btntext']=_MD_SHOPWCASE23;  //按鈕文字 $descriptionArr[$i]['btncenter']=$productlimt['productwarranty'];  //頁籤內容 $descriptionArr[$i]['i']=$i;  //頁籤id $shopwcase['descriptionbox']=$descriptionArr; 輸出smar...

Smarty->foreach 迴圈抓出第一圈跟最後一圈的方法-教學撰寫:徐嘉裕Neil hsu

Xoops是使用Smarty樣板引擎,雖然有些判斷在php端就能處理,但是像系統佈景區塊之類的還是用Smarty的code來處理會比較方便,不用再另外寫一堆PHP程式,這裡分享一個在Smarty->foreach 迴圈抓出第一圈跟最後一圈的方法,使用first及last參數即可。 例如像下圖,需要抓出迴圈的第一圈跟最後一圈然後定義CSS做樣式樣的變化! 方法如下 <{foreach item=blockmenulayers from=$block.category name=blockmenulayers}> <div class=' <{if $smarty.foreach.blockmenulayers.first eq true}>firstbox<{/if}> <{if $smarty.foreach.blockmenulayers.last eq true}>lastbox<{/if}>   panel-titlebox '> 內容內容內容內容內容............ </div> <{/foreach}> 說明: <{if $smarty.foreach.blockmenulayers. first eq true}>firstbox<{/if}> //如果是第一圈first值為true顯示firstbox <{if $smarty.foreach.blockmenulayers. last eq true}>lastbox<{/if}> //如果是最後一圈last值為true顯示lastbox 所以class隨迴圈顯示的值就會是! 第一圈->firstbox 最後一圈->lastbox 扣除第一圈跟最後一圈->panel-titlebox 這樣就有三種css樣式可以定義了,讓版面更靈活美觀!! 有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu