跳到主要內容

發表文章

目前顯示的是 2018的文章

Xoops做一個php下載檔案自動壓縮成ZIP格式方法-教學撰寫:徐嘉裕Neil hsu

2021-11-15補充說明,由於PHP8.0對於new ZipArchive的寫法有改變,以下方法無法於PHP8.0中使用,如需使用PHP8.0開發Xoops模組zip下載功能的請參考這篇工作心得 Xoops做一個php8.0下載檔案自動壓縮成ZIP格式方法 通常下載檔案做個按鈕直接路徑指向檔案就能下載了,但現在瀏覽器越來越聰明,像是PDF,WOED或是圖片類型都會直接在瀏覽器開啟,而不會下載,再加上下載檔案會消耗網站上行頻寬,所以最好的方法就是吧要下載的檔案壓縮成ZIP格式再讓USER下載,減少頻寬消耗,這樣就都沒問題了,php5.2後都支援new ZipArchive函數,所以不用再去改什麼php.ini檔了。 方法如下: PHP-CODE-把以下程式碼放到模組的function.php裡面,於要觸發下載的PHP檔中引入function.php //下載檔案壓縮ZIP格式function function  zipArchivefunction($url="",$zipname="",$temp=""){ //$url 檔案原始路徑+檔名 //$zipname 檔案名稱 //$temp 檔案暫存路徑+檔名 /********利用ZipArchive產生壓縮檔************/ $zip = new ZipArchive; $zip->open($temp, ZipArchive::CREATE); //$zip->addFile($dir); //添加檔案 (若有大量檔案可使用迴圈) $new_filename = substr($url, strrpos($url, '/') + 1);  //重新定義壓縮檔路徑 $zip->addFile($url, $new_filename); $zip->close(); /********使用header命令php下載zip檔************/ header('Content-Type: application/zip'); //指定類型 header("Content-type: ".filetype(&qu

分享一個好用的PHP單位換算function-教學撰寫:徐嘉裕Neil hsu

上傳檔案的$_FILES["file"]變數共會產生以下五個陣列內容 $_FILES["file"]["name"]:上傳檔案的原始名稱。 $_FILES["file"]["type"]:上傳的檔案類型。 $_FILES["file"]["size"]:上傳的檔案原始大小。 $_FILES["file"]["tmp_name"]:上傳檔案後的暫存資料夾位置。 $_FILES["file"]["error"]:如果檔案上傳有錯誤,可以顯示錯誤代碼。 如果要取檔案大小值,只要吧$_FILES["file"]["size"]存進資料庫即可,但是$_FILES["file"]["size"]預設解析檔案大小的單位是 byte ,所以如果是1MB大小的檔案則會取得1048576-byte值,如果能有一個function能吧數值轉換成B/KB/MB/GB/TB該多好,不然一長串數字USER也看不懂,上網Google一下找一個還不錯的單位換算function,測試都沒問題分享給大家。 吧以下的code丟到模組的function.php中,記得在要使用的php檔引入function.php //單位換算 function formatBytes($size) { $units = array(' B', ' KB', ' MB', ' GB', ' TB'); for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024; return round($size, 2).$units[$i]; } 這樣在需要使用轉換的地方需呼叫涵式即可 echo $filesize= formatBytes($size= $var ); $var 數值就是存進資料表的$_FILES[&q

Google網頁翻譯套件(官網已關閉申請頁面)需自行修改js設定-教學撰寫:徐嘉裕Neil hsu

Google網頁翻譯套件是網站建置上常用的功能,點選可以翻譯網站的文字為指定的語言,原本是在Google翻譯頁面中就能申請套件, 但自從11月Google翻譯改版後沒多久,Google網頁翻譯套件的申請頁面也被關閉了,好朋友可以點一下原本申請的網站: https://translate.google.com/intl/zh-TW/about/website/ 因該會看到這個畫面,翻譯套件申請頁面GG了! 不過還好G大神還是有保留原本的JS翻譯程式及功能,但如果要使用就要自己稍作修改了喔!!原始碼如下: <div id="google_translate_element"></div><script type="text/javascript"> function googleTranslateElementInit() { new google.translate.TranslateElement({pageLanguage: ' zh-TW ', includedLanguages: ' en,ja,zh-TW ', layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element'); } </script><script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> 其中需要修改的地方為: 藍字的pageLanguage: 數值,這個是翻譯套件預設的語言。 紅字includedLanguages: 數值,這個是可以讓使用者選擇要翻譯的語言,用英文,區隔 問題是如何知道這些語言的編碼參數呢,像是什麼ja,en去哪找?這問題很好處理,進到Google翻譯網頁 https://translate.google.

ajax使用FormData物件多檔上傳的方法-教學撰寫:徐嘉裕Neil hsu

之前寫了一篇心得是【 ajax使用FormData物件上傳檔案 】,那方法只針對單一檔案上傳,如果是多檔要使用FormData物件上傳需要修改一下檔案的取值方式,方法如下。 <input class="form-control" id="blockimg" type="file"  multiple/> <button id="upload">Upload</button> //$.ajax  $('#upload').on('click', function() {     var form_data = new FormData();  //建構new FormData()       for(var i=0; i<$('#blockimg')[0].files.length;i++){                    form_data.append('file[]', $('#blockimg')[0].files[i]);                }                                    $.ajax({                 url: 'upload.php',                 cache: false,                 contentType: false,                 processData: false,                 data: form_data,     //data只能指定單一物件                                  type: 'post',                success: function(data){                     $('#ajsxboxdhow').html(data);            

好用的jQuery多圖上傳即時預覽功能-教學撰寫:徐嘉裕Neil hsu

之前用過很多jQuery多圖上傳即時預覽程式,包括vmodel等,最大的問題就是會跟ck編輯器的js引入檔衝突,導致預覽圖無法顯示,很頭痛的,最近剛好有一個案子又遇到需要同時上傳多圖跟ck編輯器並存,所以只好放棄vmodel多圖預覽另外找其他的jQuery程式套件來用,上網估狗了一下找到這支jQuery多圖上傳程式還滿好用的,簡單又方便,樣式我也做了美化修改,分享給大家!! //html結構部分 <input type="file" id="showimg" multiple/> <div class='row'><div id='previewMultiple'></div>  </div> //js部分,請吧程式放到模組引入的.js檔中或自行建立一支js檔,然後引入 //需要引入bootstrap框架 $(document).ready(function() { $("#showimg").change(function(){ $("#previewMultiple").html(""); // 清除預覽 readURL(this); }); function readURL(input){ if (input.files && input.files.length >= 0) { for(var i = 0; i < input.files.length; i ++){ var reader = new FileReader(); reader.onload = function (e) { var img = '<div class=col-md-6><div class=thumbnail><img src="' + e.target.result + '"></div></div>'; $("#previewMultiple").append(i

ajax使用FormData物件上傳檔案-教學撰寫:徐嘉裕Neil hsu

如果是php表單要上傳物件只需要在form裡面加上enctype="multipart/form-data然後使用input type="file"就能吧檔案陣列中的五個屬性值一起上傳透過$_FILES["file"]來接收變數,然後使用php的製作圖檔或是檔案上傳程式來做後續處理,但如果是ajax表單是沒有form可以使用的,必須透過js取值然後用ajax來處理,好朋友一定認為這樣就能取到type="file"的值了。 var $upfile= $('input[name=file]').val(); 抱歉這樣只能抓到檔案路徑,檔案屬性是抓不到的,所以即使變數送出去也無法建立檔案,用js要抓取檔案屬性的方法必須使用 FormData 物件才行,請看以下說明: //html結構 <input class="form-control" id="blockimg" type="file" > <button id="upload">Upload</button> //$.ajax  $('#upload').on('click', function() {     var file_data = $('#blockimg').prop('files')[0];    //取得上傳檔案屬性     var form_data = new FormData();  //建構new FormData()     form_data.append('file', file_data);  //吧物件加到file後面                                    $.ajax({                 url: 'upload.php',                 cache: false,                 contentType: false,

JS接收ajax.php回傳變數值的簡易方法:徐嘉裕Neil hsu

JS如要接收ajax.php回傳變數值,最常用的方法就是使用dataType: 'json',然後在ajax.php使用陣列方式來傳遞變數,像是下面這樣 $res['1']=123; $res['2']=456; echo json_encode($res);exit; 但最近想出一個更簡單的方法來讓js來接收ajax.php回傳變數值,也不需要使用到json,只要吧變數用 , 串接起來就好了,例如: $text="".$var1.",".$var2.",".$var3.",".$var4.",".$var5.""; echo $text; 這樣在JS的$.ajax的success: function(response) {}裡面加上 var $response_arr = response.split(' , '); //切割陣列 $var1=$response_arr[0]; $var2=$response_arr[2]; $var3=$response_arr[3]; $var4=$response_arr[4]; $var5=$response_arr[5]; 吧原本串接的5個變數切割成5個列陣,這樣就能輕鬆的接收ajax.php回傳的變數值了,感覺比json好用,有需要的朋友可以參考看看! 教學撰寫: 徐嘉裕 Neil hsu

寫一個PHP高效率資料表交叉條件查詢方法!!-教學撰寫:徐嘉裕Neil hsu

在開發模組功能最怕遇到就是多條件的資料表交叉查詢,例如查詢資料表條件A+條件B,但又可單獨查詢條件A及條件B,如果只有1-2個查詢項目還好,但如果同時有5個或更多的查詢項目,有時候容易出錯,所以想出來一個高效率又方便的交叉查詢function寫法分享給大家!! 例如像下面這個介面圖有5項查詢功能,要能同時查詢單項及多項交叉查詢並將結果顯示右方的總表內容中!! 這樣必須設資料表的where查詢條件!如果一個一個判斷,5項查詢會產生5*5=25總組合!會寫到累死,所以乾脆直接function起來批次處理!! //資料交叉查詢組合 function crossquery($where=""){ foreach($where as $key=> $val){ $wherevar.=$val; } $wherevar=!empty($wherevar) ? "where ".$wherevar."" : ''; // get TRUE //去除最後字元 $wherevar=substr($wherevar,0,-4); return $wherevar; } 這樣就吧查詢條件全部交叉組合起來了,只需要在要讀取資料表的php檔中呼叫crossquery()函式並吧$where陣列直送入 //資料交叉查詢 $wherevar['0']=!empty($setuptime) ? "`setuptime` LIKE '%$setuptime%' and " : false; //時間有值 $wherevar['1']=!empty($enfunction) ? "`enfunction` = '".$enfunction."' and " : false; //功能有值 $wherevar['2']=!empty($basid) ? "`basid` = '".$basid."' and " : false; //單位有值 $wherevar[

Xoops吧多個資料表合併顯示按照建立日期排序在一個table中的方法-教學撰寫:徐嘉裕Neil hsu

之所謂關關難過關關過,遇到問題就要爆肝解決了阿?阿不然呢!! 講這麼多也是要抱怨一下,目前遇到一個問題就是客戶有4個資料表,分別是影片/相片/新聞/檔案,四個表都是獨立的,需要做一個總表吧4個表的內容按照建立時間排序顯示,之前一直卡在join的邏輯中解不出來,後來才想到join主要是做資料表欄位關連,而不是合併顯示,上網查了一下mysql操作手冊終於讓我找到一個可以解決問題方法,真是感動阿,用UNION ALL就可以解決了阿,方法如下。 //重點說明-很重要 使用UNION ALL查詢的多個資料表的欄位名稱都要相同才能抓地到數值,例如資料表table1中的name欄位那table2也必須要相同的name欄位名稱,欄位格式也都需相同,才能抓到兩個表的相同資料。 資料表 table1  ID TITLE TIMES NAME1 1 影片標題01 2018-10-18 AAA 2 影片標題02 2018-9-18 BBBBB 資料表 table2 ID TITLE TIMES NAME2 1 相片標題01 2018-10-17 AAA 2 相片標題02 2018-9-17 BBBBB 資料表 table3 ID TITLE TIMES NAME3 1 新聞標題01 2018-10-16 AAA 2 新聞標題02 2018-9-16 BBBBB 資料表 table4 ID TITLE TIMES NAME4 1 檔案標題01 2018-10-15 AAA 2 檔案標題02 2018-9-15 BBBBB 我們只需要取得ID,

Xoops做一個單頁資料上下頁切換功能-教學撰寫:徐嘉裕Neil hsu

之前在開發Xoops模組如果有遇到上下頁切換都是使用Xoops內建函數,但是為了美觀改用bootstrap3的上下頁按鈕,這樣整個mysql查詢語法都要自己寫了,本來邏輯一直被卡在Limit查詢上解不出來,後來靈光乍現想到一個更簡單的方法來解決,分享給好朋友參考。 1、先引入neillibrary模組的function.php 2、加上以下的上下頁查詢資料表語法 //接收變數 $dbid=isset($_REQUEST['dbid'])?$_REQUEST['dbid']:""; $dbneme=" 資料表名稱 "; //上下頁面控制 //下一頁 $where=" where dbid > '".$dbid."' order by dbid ASC "; $enshow['goahead']=moduledb($dbneme,$where); //上一頁 $where=" where  dbid < '".$dbid."' order by dbid DESC "; $enshow['retreatc']=moduledb($dbneme,$where); 備註說明:dbid為頁面的欄位id數值(PRIMARY KEY),這裡用dbid如要使用這個code可以改成自己頁面的id欄位名稱 3、然後輸出到smarty樣板 <nav > <ul class="pager"> <{if $enshow.retreatc.dbid}>  //如果有上一筆數值才出現按鈕判斷 <li><a href="<{xoAppUrl /}>modules/<{$xoops_dirname}>/moviecenter.php?op=page&dbid= <{$enshow.retreatc.dbid}> "><span aria-hidden=&qu

CentOS7->SELinux設定(防火牆)-教學撰寫:徐嘉裕Neil hsu

如果剛安裝好CentOS需要檢查一下SELinux設定,如為Enforcing則除了本地端以為其他外連都無法連入主機需要修改才行,方法如下! 先用SSH連線進入主機,輸入以下查詢指令觀看目前的SELinux設定狀態! # getenforce SELinux 共有三種模式如下: Enforcing:強制模式,依據設定來限制檔案資源存取。 Permissive:寬容模式,不限制檔案資源存取,但仍會依據設定檢查並記錄相關訊息。 Disabled:停用模式,SELinux 已被停用。 預設是Enforcing,要將其修改為Disabled 找到以下檔案/etc/selinux/config  打開編輯 # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. #SELINUXTYPE=targeted  //註解掉 修改紅字那一段,改成 disabled 然後再重新啟用CentOS,這樣外部連線就能進入網站主機了!! 重啟CentOS指令:#  reboot 要檢查 SELinux 的狀態, 執行 sestatus

寫了一個Xoops防止外部位置傳參寫入網站資料表的方法-教學撰寫:徐嘉裕Neil hsu

Xoops雖然有自己的表單驗證方式,但如果是用bootstrap框架寫的表單,就沒辦法套用Xoops的表單驗證功能,必須要自己寫一個驗證,否則像是非會員權限的聯絡我們表單,如果有別人吧form的action指向到您的網站,欄位都一樣是可以吧資料post過來寫入資料表的,所以必須要驗證傳入的網址是否為網站網址,如果相符才讓資料寫入,方法如下: 1、先在模組的function.php中加上以下的判斷函數 //檢查傳入網址 //網址合併 function urlpregmatch($var=""){ $url1= str_replace ("/","",$var); //去除/ $url2= str_replace ("http:","",$url1); //去除http: $url3= str_replace (".","",$url2); //去除. $url4= preg_replace("/[&?=.#]/", '',$url3); //去除&?=.# return $url4; } //比對網址(防外部傳參) function alignmenturl(){ //本地端網址合併 $url1=urlpregmatch($var=XOOPS_URL); //傳入端網址合併 $url2=urlpregmatch($var=$_SERVER['HTTP_REFERER']); //判斷傳入網址是否為相同網站 if (!empty(preg_match("/".$url1."/i", "".$url2.""))) { return true; } } 然後再php接收變數端加上以下判斷函數 //機器人檢查 if(empty( alignmenturl() )) redirect_header(XOOPS_URL,0 , _MD_NOTWELCOME); 備註_MD_NOTW

CK編輯器使用JS取值的方法-教學撰寫:徐嘉裕Neil hsu

CK編輯器相信大家一定不陌生,是一套非常好用的所見即所得編輯器(WYSIWYG),能編排HTML格式及上傳圖檔諸多功能,這裡就不再描述,重點是如何用js取得文字編輯框中的數值?如果是用PHP的form透過post是完全沒問題的,只要取的textarea的name值即可,但如果是吧ck編輯器包在ajax裡面,那就不能用form來傳值了,必須用js來取值,例如下面的ck編輯器 <textarea id=" CKcontent " name="CKcontent" > </textarea> 如果用 var  $CKcontent= $("#CKcontent").val(); 很抱歉,這樣是完全取不到值的,因為ck編輯器本身在內部又用js建構一層html的p元素來顯示內容,被這問題卡了好久,終於找到解決方法!! 就是用 var  $CKcontent=CKEDITOR.instances. CKcontent .getData(); 這樣就能用js抓取ck編輯器中編輯框的數值了, 紅字 的部分就是textarea的id值,有需要的朋友參考看看!! 教學撰寫: 徐嘉裕 Neil hsu

js使用each迴圈讀取val值以陣列型態儲存的方法-教學撰寫:徐嘉裕Neil hsu

在開發ajax的ui介面時需要寫一個排序功能,也就是像下面這樣可以輸入數字來排列順序的表格。 由於是全ajax的ui介面,所以取得input ->  var值得方法跟php不一樣,不能用php的邏輯來思考,希望當夠按下變更排序按鈕時,吧所有的input -> var及input -> name值全部以陣列方式打包再透過ajax.php來儲存,方法如下。 //html結構 <input type='text' class=' sorteach form-control' name='1' value='' placeholder=''> <input type='text' class=' sorteach form-control' name='2' value='' placeholder=''> <input type='text' class=' sorteach form-control' name='3' value='' placeholder=''> <input type='text' class=' sorteach form-control' name='4' value='' placeholder=''> <button type='submit' id='sortbtn' class='btn btn-primary btn-lg btn-block button'>變更排序</button> 紅字的 name值 為需要儲存的資料表的欄位id值, 藍字為each 所需要的class值 所以按下變更排序至少需要取得兩個陣列,一個是name值陣列一個是value值陣列。 //JS結構 $("#sort

修改bootstrap分頁選單使用jQuery新增及刪除class方法-教學撰寫:徐嘉裕Neil hsu

如果我們要使用bootstrap分頁選單做一個自動流程控制,像是下面這樣,當AJAX建立完成影片新增後自動切換到下一個頁籤,可以使用jQuery的removeClass()跟removeClass( )來達成這樣的功能需求。 bootstrap分頁選單是用 class="active"來定義當前顯示的頁籤按鈕及內容區塊,預設定義在是第一個頁籤及區塊的class裡面, <ul class="nav nav-tabs" role="tablist" id='movievar' name="1,<{$enshow.basid}>"> <li id='limoviebtn1' role="presentation" class="active" ><a id="moviebtnfunction1" href="#moviebtn1" aria-controls="moviebtn1" role="tab" data-toggle="tab"><{$smarty.const._MD_MOVIECENTERPHP02}></a></li> <li id='limoviebtn2' role="presentation"><a id="moviebtnfunction2" href="#moviebtn2" aria-controls="moviebtn2" role="tab" data-toggle="tab"><{$smarty.const._MD_MOVIECENTERPHP03}></a></li> </ul> <!-- Tab panes --> <div class=&qu

jQuery取type='radio'值的方法-教學撰寫:徐嘉裕Neil hsu

例如向下圖這樣的單選核取type='radio'按鈕 如果要用JS來取得Radio數值然後透過 $.ajax來儲存數值,方法如下: //結構 <div class='form-group'> <label class='col-sm-4'>狀態(啟用/關閉)</label> <div class='col-sm-8'> <label class='radio-inline'> <input type='radio' id='' name=' enable ' value=' 0 '>不啟用 </label><label class='radio-inline'> <input type='radio' id='' name=' enable ' checked=checked value=' 1 '>啟用 </label> <br /><br /><br /></div> </div> 藍字 為input的name值,我們就要利用name來取得value中 紅色 的數值 //JS $("body").on("click", " 按鈕id或class值 ", function (e){ $enable=$('input[name=enable]:checked').val() // alert($enable); }) 這樣當點擊按鈕時就會取得name=enable被核取中數值,之後再吧$enable變數值透過$.ajax存進資料庫即可!! 教學撰寫: 徐嘉裕 Neil hsu

Xoops免費佈景:neilambilight2.8正式版釋出-佈景設計開發:徐嘉裕Neil hsu

neilambilight2.8正式版發佈了,本次發佈更新除了更改了手機介面的按鈕列顯示方式,主選單及網站功能選單全部收納到按鈕列以節省空間,調整與除錯修正佈景及模組的BUG問題,升級優化程式結構,資料表結構調整,最重要的更新是翻新了neothemesadmin佈景管理後台的五項功能,分別為 【管理首頁】【佈景設定】【佈景圖片播放器管理】【網站選單管理】及【區塊選單管理】 ,全部UI介面均採用bootstrap3框架及neillibrary函數庫模組與JS互動元件,跳脫原本死板的Xoops原生介面型態,並增加了許多實用的功能,精簡及合併刪除未使用的檔案。目前neothemesadmin佈景管理後台90%都已翻新完成,預計下次改版就能全部翻新,這樣就能再繼續增加新的功能開發及準備佈景介面的改版工作。 neilambilight2.8 更新內容 ============================== 增加聯絡我們送出欄位資料無害化設定,增加回覆時郵件中自動附上詢問問題。 修改手機版介面,增加登入登出按鈕功能。 修改手機版介面,增加功能導覽bar,吧主選單收納到功能功能導覽bar的選單列裡面,精簡優化界面。 手機版佈景主選單移除Google外部讀取字形,加快選單開啟速度。 修改手機版聯絡我們表單排版樣式,CSS調整。 解決電腦手機版tad_uploader模組檔案文字過多會拉破版面的問題。 修正跑馬燈管理按鈕出現PHP常數問題。 修改neothemesadmin佈景管理模組首頁,使用bootstrap3框架重新編排。 電腦版介面增加網站管理按鈕,點了直接進Xoops管理後台。 neothemesadmin佈景管理模組sql兼容資料庫嚴格模式。 neothemesadmin佈景管理模組多層區塊按鈕管理分類增加url欄位及target選項及是否使用分類連結選項功能及欄位。 修改多層區塊按鈕程式及樣版檔,前台增加開啟滑動選單按鈕(若無子分類時不會顯示),增加編輯分類按鈕。 更新neothemesadmin佈景管理模組->佈景設定UI介面,使用JS控制元件+bootstrap3框架及neillibrary函數庫模組與優化程式結構重新編寫。 於模組更新檔中增加刪除無用的analyzefbid.php檔案設定。 更新neothem

JQuery常用的表單驗證function(正規表示式)-教學撰寫:徐嘉裕Neil hsu

整理一些常用的JQuery表單驗證方法如下,有需要的朋友自己參考看看!!這些都測試過沒問題的!! //數字格式檢查,如不符條件返回false值 function isNum(isNum) {     var reg = /^[0-9]*$/;         if(!reg.test(isNum) || isNum=='' ) {             return false;         }else{             return true;         }     } //手機格式檢查-台灣手機格式09xx-xxx-xxx,如不符條件返回false值 function Isphone(phone) { var regex = /^[0-9]+$/; if(!regex.test(phone)) { return false; }else{ return true; } }  //E-MAIL格式檢查,如不符條件返回false值 function IsEmail(email) { var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; if(!regex.test(email)) { return false; }else{ return true; } }  //網址url格式檢查,如不符條件返回false值 function isURL(str){ return !!str.match(/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/g); }  //HTML格式檢查 ,如不符條件返回false值 function strip_tags(str) { str = str.toString(); return str.replace(/<\

JS外部載入延遲加載的方法-教學撰寫:徐嘉裕Neil hsu

最近遇到一個問題,就是佈景的災害示警區塊外連js解析拖慢站其他JS解析的問題,災害示警區塊是讀取https://alerts.ncdr.nat.gov.tw網站的JS後API橋接顯示在網站容器中的內容,如果遇到https://alerts.ncdr.nat.gov.tw網站流量塞爆或是或是外連頻寬不穩,就會發生因為瀏覽器解析JS一直在等待https://alerts.ncdr.nat.gov.tw網站的資料回傳,所以其他的JS解析都被卡住了,然後像是圖片播放器JS功能突然失效,JS動畫突然要很久才會播放,反正跟JS有關的解析都會因為一個外部JS讀取LOG全部都卡住。 上網估狗了一下找到一個簡單的解決方法分享給大家!! 只需要在外連的script標籤中加上defer="defer"延遲加載屬性期可,這樣被加上屬性的script就會等其他沒有屬性的script全部腳本解析完畢後才開始下載解析  <script defer="defer"  type="text/javascript" src="https://alerts.ncdr.nat.gov.tw/temp/StaticFiles/Immediately/<{$alertsncdr}>"></script>  <script> 即使https://alerts.ncdr.nat.gov.tw網站頻寬嚴重塞車也不會拖慢網站的其他JS解析運作,有需要的朋友參考看看! 教學撰寫: 徐嘉裕 Neil hsu

Xoops任意模組取得指定模組的$xoopsModuleConfig設定方法!!-教學撰寫:徐嘉裕Neil hsu

在開發Xoops模組的時候如果有用到偏好設定的欄位時,會在模組根目錄中的xoops_version.php檔案建立以下的設定,例如果們要建一個偏好設定欄位名為 text1 //---偏好設定---// $modversion['config'] = array(); $i=1; $modversion['config'][$i]['name'] = "text".$i."";  //欄位名為text1 $modversion['config'][$i]['title'] = '_MI_XOOPS_VERSION5'; $modversion['config'][$i]['description'] = '_MI_XOOPS_VERSION5'; $modversion['config'][$i]['formtype'] = 'text'; $modversion['config'][$i]['valuetype'] = 'int'; $modversion['config'][$i]['default'] = '1'; //0不啟用1啟用 $i++; 更新模組後,Xoops會自動吧text1欄位即設定新增到config資料表中 如果是同一個模組要取得text1的conf_value值很簡單,只需要! global  $xoopsModuleConfig; echo $xoopsModuleConfig['text1']; 即可,但如果遇到不是同一個模組時候呢?例如模組A想讀取模組B的conf_value值,這方法就不行了,因為$xoopsModuleConfig預設只能讀取自己模組的config欄位數值,無法取得其他模組的,解決方法是使用Xoops內建函數來取的 例如模組A->讀取模組B的conf_value     $modhandler        =

用PHP做一個自動判斷學年度跟上下學期的方法-教學撰寫:徐嘉裕Neil hsu

目前一個模組開發專案剛好要用到學年度跟上下學期功能,本來是想說後台做個選單讓管理員自己建立,但發現每個學校的學年度跟上下學期都是一樣的全國統一格式,因此就不用那麼麻煩還要進資料表,直接抓時間函數來判斷就好了,方法如下: 1、在模組檔案函數最上方引入neillibrary模組的function.php include_once XOOPS_ROOT_PATH . "/modules/neillibrary/function.php"; 2、進行時間判斷 //學年度計算 $year=timedate($datevar="Y")-1911; //上下學期判斷 $month=timedate($datevar="m") >='08' && timedate($datevar="m") >='02' ? _MD_CONTENTPHP55 : _MD_CONTENTPHP54; // get TRUE /輸出標題 $content['title']=sprintf(_MD_CONTENTPHP56,$year,$month); //記得輸出$content到樣板上 $xoopsTpl->assign( "contentbox" , $content) ; 3、然後在語系檔main.php中加上語系 define("_MD_CONTENTPHP54","下學期"); define("_MD_CONTENTPHP55","上學期"); define("_MD_CONTENTPHP56","%s學年度-%s"); 4、在樣板上讀取標題 <div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-calendar" aria-hi

js取得下拉選單中文字後輸出input送出變數的方法-教學撰寫:徐嘉裕Neil hsu

我們都知道下拉選單select本身可以設定一個name值,然後會吧作用中的選單value值post出去,但如果要連同選單中文字一起post出去,那就用另外用js來撈取作用中選單中數值在透過input傳送出去,方法如下: 選單結構: <select size='1' name='options[2]' id=' select ' > <option value='0' >選擇影片分類</option> <option value=1 selected='selected'>活動影片</option> <option value=2 >宣導影片</option> <option value=3 >校園新聞</option> </select> <div id='hiddenbox'><input  type='hidden' name='options[3]' value='".$options[3]."'></div>   //這是要讓js傳值建立input的容器 js-code: $(document).ready(function(){ $('#select').change(function(){ $classification=$(this).find(':selected').text(); hiddenbox($classification); }); function hiddenbox($classification){ $('#hiddenbox').html("<input type='hidden' name='options[3]' value='"+$classification+"'>"); } }); 這樣就能

Xoops取得newblocks資料表中bid數值的方法(包含複製後區塊bid數值)-教學撰寫:徐嘉裕Neil hsu

如果建立Xoops區塊都會在newblocks資料表中寫入一筆設定資料,其中的bid數值就是區塊的編號,包含複製區塊也會產生編號, 雖然佈景樣板中是有<{$block.id}>變數可以取得區塊的bid值,但在模組區塊中卻無法使用<{$block.id}>變數,上網查了Xoops結構說明手冊發現都要用class的方法來撈數值,實在太麻煩了,所以自己寫了一個取得bid的函數,分享給大家,方法如下: 1、在模組blocks資料架的區塊檔案函數最上方引入neillibrary模組的function.php include_once XOOPS_ROOT_PATH . "/modules/neillibrary/function.php"; 貼上以下function //區塊取得bid function bidnamefunction($op="",$bid=""){ //取得newblocks資料表最新一筆編號 $dbneme="newblocks"; //資料表名稱 $where=" order by bid DESC"; //where數值 $newblocksList=moduledb($dbneme,$where); //最新編號+1 $newbid=$newblocksList['bid']+1; //判斷複製還是編輯 $bid=$op==edit ? $bid : $newbid; // get TRUE return $bid; } 2、在編輯區塊函數裡面增加以下設定(block_edit) //取得變數 $op=isset($_REQUEST['op'])?$_REQUEST['op']:""; $bid=isset($_REQUEST['bid'])?$_REQUEST['bid']:""; $bid=bidnamefunction($op=$op,$bid=$bid); 加上儲存options設定 <i

兼容修正IE9鎖住外連preventDefault()無效的方法-教學撰寫:徐嘉裕Neil hsu

之前寫了一篇- JS解決submit同時存入AJAX跟POST外部傳參先後順序問題 的教學文章, 基本上這方法是沒問題的,程式邏輯沒錯,但是現卻遇到一個問題導致原本鎖住外連的preventDefault()函數無效,就是IE9瀏覽器,IE9完全不支援 e.preventDefault(); 方法,所以就無法形成先讓程式跑AJAX後在POST參數出去的流程,解決的方法只好加上整個 preventDefault() 兼容判斷流程,CODE如下: function cancelHandler(event) { var event = event || window.event;//兼容IE //取消事件相關的預設行為 if (event.preventDefault) //標準技術 event.preventDefault(); if (event.returnValue) //兼容IE9之前的IE event.returnValue = false; return false; //用於處理使用對象屬性註冊的處理程序 } 這樣IE9包含以上的瀏覽器preventDefault()就都能正常運作了,有需要的朋友參考看看!! 教學撰寫: 徐嘉裕 Neil hsu

修復tadgallery相片捲軸區塊開啟燈箱效果點選詳細內容sn為空值問題-教學撰寫:徐嘉裕Neil hsu

tadgallery是一套多功能的相簿模組,為tad老師所開發,也是目前Xoops使用率最高的相簿模組,不過目前發現一個問題,就是開啟相片捲軸區塊啟用燈箱效果時下方的詳細內容按鈕連結失效問題,為了先確認是否為系統環境造成的,我吧以下套件都改成tad的來做測試。 模組: tadtools => 3.19最新版 tad_themes => 4.9最新版 tadgallery => 3.79最新版 佈景: => school2015最新版 都更換好配置後在測試燈箱效果,結果 詳細內容 還是一樣sn為空值 點了詳細內容因為sn沒值所以開啟的是空值頁面,沒內容的,初步排除是系統兼容問題。 沒辦法了阿,這樣是無法跟客戶交差的,只好動手來處理了,發現問題是出在blocks/colorbox.tpl這支檔的<{$block.sn}>為空值,相片捲軸既然是跑回圈的,那sn因該也是迴圈產生,所以修改了一下程式即可, 先找到tadgallery_block_carousel.tpl樣板檔,用筆記本打開 (在tadgallery/templates/blocks/tadgallery_block_carousel.tpl) 原本的code <{if $block.pics}> <style type="text/css" media="all"> .list_carousel { position: relative; } .list_carousel ul { margin: 0; padding: 0; list-style: none; display: block; } .list_carousel li { padding: 0; margin: 0px; display: block; float: left; } .list_carousel.responsive { width: auto; margin-left: 0; } .clearfix { float: none; clear: both; } a

用JS計算左右邊距固定position: fixed;位置方法!!-教學撰寫:徐嘉裕Neil hsu

在使用CSS的position: fixed浮動區塊最常遇到的問題就是無法指定位置,position: fixed的左右邊距是以瀏覽器的總寬度來做計算,所以假使您在1440px解析度設的position: fixed;位置是正確的,但如果吧解析度放大或縮小時,fixed區塊位置就會跑掉,例如下面圖示! 假使瀏覽器解析度為1440px,左右fixed區塊剛好在兩邊! 可是如果吧解析度改成1920,內容區#tpl-content寬度不變還是1280px,可是左右區塊卻是以瀏覽器的總寬度為主,因此就會變成下面這樣: 解決的方法就是用js來計算指定物件對齊左右邊距,方法如下: js部分 $(window).load(function() { var position = $('#tpl-content').offset(); var x = position.left;  //取得#tpl-content容器的left位置 var r =$('#tpl-content').width(); $("#leftframe").css("left", x-80+"px");  //計算左區塊位置 $("#righttframe").css("left", x+r+"px");  //計算右區塊位置 }); css部分 //左邊浮動區塊 #leftframe { position: fixed; top: 0px; width: 80px; height: 800px: background: url(../../img/frame/01.jpg) repeat-y left top; } //右邊浮動區塊 #righttframe { position: fixed; top: 0px; width: 80px; height: 800px: background: url(../../img/frame/02.jpg) repeat-y left top; } 這樣即使瀏覽器設成19

修改Xoops佈景結構增加一個入口首頁的方法!!-教學撰寫:徐嘉裕Neil hsu

之所謂客戶百百款,每個客戶對於網站的需求都不一樣,最近就遇到一個客戶需要再Xoops網站的首頁前面再加一層入口首頁,如果用原本的作法是用html做個頁面丟到網站根目錄然後指定伺服器預先讀取html即可,但是這樣做變成是獨立頁面,離開Xoops系統了,如果要使用Xoops的模組或區塊功能就不可行了,所以解決的方法還是修改佈景結構比較實在。 這是修改好之後的佈景樣式,如果輸入網址會出現入口頁面, 點進入網站按鈕則會顯示原本的Xoops預設首頁跟11個區塊! 修改方法如下: 1、先在佈景根目錄建立一個config.php檔 2、於佈景theme.tpl中引入config.php檔 <{include_php file="$xoops_rootpath/themes/$xoops_theme/config.php"}> 3、於config.php檔中增加以下的php code <?php global   $xoopsTpl; $types=isset($_REQUEST['types'])?$_REQUEST['types']:""; if(!empty(trim($xoopsTpl->_tpl_vars['xoops_contents'])) ){ $contentstrue=true; } $xoopsTpl->assign('contentstrue', $contentstrue); $xoopsTpl->assign('types', $types); ?> 4、然後在佈景的tpl資料夾建立一個index.tpl檔,這個樣板就是用來放入口首頁內容的,包括區塊程式也能在這裡運作,index.tpl檔裡面要做個按鈕連到Xoops預設首頁。 <a title='前往首頁'  href="<{xoAppUrl /}> ?types=index " >前往首頁</a> 5、修改佈景的結構樣板檔,加上以下的判斷 <body> <

使用JS去除nowrap標籤解決tad_uploader檔案名稱過長版面被拉破的問題-教學撰寫:徐嘉裕Neil hsu

tad_uploader是一套非常好用的檔案上傳模組,相信用過的朋友都說讚,但目前遇到一個問題,就是如果檔案說明文字太長的時候,版面會被拉到破版!!像下面這樣!! 原因是因在td結構裡面被下了一個nowrap屬性 <td headers="h2" nowrap> 最快的解決方法就是進到php檔或tpl樣板吧nowrap拿掉就好了啊,不用1秒解能解決,幹嘛還要那麼麻煩用js來解決的,這問題問得好,直接修改檔案當然是最快的方法,但必須要考量到日後更新的問題啊,如果客戶升級了tad_uploader模組,樣板都被覆蓋掉,那原本修改就不見了不又變回破版的樣子。 想說用css的white-space:nowrap;屬性來覆蓋nowrap屬性,但也不行,方法都試過了,好吧,最後還是要靠js了,方法如下: 先在引入js檔案的地方引入Xoops模組id變數! <script> var $xoopsdirname="<{$xoops_dirname}>"; </script> 然後再js檔案裏面貼上以下的code //去除nowrap if($xoopsdirname=='tad_uploader'){ //只有在tad_uploader模組執行 $(document).ready(function(){ $('#sort tr').each(function(index) {    var $sorttext=$(this).html(); //取得tr中的HTML內容       var $sorttextreplace=$sorttext.replace(/nowrap/g,''); //去除nowrap標籤    $(this).replaceWith($(this).html($sorttextreplace)); //輸出內容 }); }); } 儲存檔案後,再去看一下tad_uploader模組!!破版的問題已經解決了 這樣不但能更新模組,又能解決版面的問題,js大神真的好棒棒啊!! 教學撰寫: 徐嘉裕 Neil hsu