跳到主要內容

發表文章

目前顯示的是 2021的文章

使用Ajax長輪詢跨頁資料查詢操作-教學撰寫:徐嘉裕Neil hsu

會使用到Ajax長輪詢功能也是意外,本來是想用JS跨域查詢,由A頁面查詢B頁面執行ajax程序後返回值做同步處理,結果經測試JS跨域查詢只能查到讀取頁面的原始資料,無法取得JS程序處理過後的變動數值,試了半天,只好用Ajax長輪詢來解決問題了,順便寫一個工作心得做為紀錄 Ajax長輪詢跨頁資料查的運作原理如下圖 以上圖解也就是使用Ajax長輪詢保持連線持續查詢資料庫,若有比對到資料則返回數值後以非同步方式更新內容,沒有就繼續查,保持連線狀態,舉一個Ajax長輪詢應用實例大家就清楚了,FB上貼文留言,即便未更新頁面,有其他用戶的的留言也會即時顯示在留言處,這就是使用了Ajax長輪詢的效果讓Ajax一直保持在 連線查詢返回更新 狀態,即時同步資料。 以下為Ajax長輪詢CODE 範例 //HTML結構 <div id='showbox'><span id='numberbox'> 30 </span></div> <script>ajaxlongpolling();</script> // 30 為固定值,透過JS取值後傳送到ajax.php比對資料 //JS結構-$.ajax function ajaxlongpolling() { $.ajax({ url: 'ajax.php', timeout: '80000', //ajax請求超時時間80秒 type: 'POST', data: { var1: $("#numberbox").text(), //取的#numberbox中數值 timedate: '80' //40秒後無論結果伺服器都返回數據 }, success: function(response) { var $response_arr = response.split(','); //切割陣列 //返回1->查詢到資料-重新讀取ajaxlongpolling(); if

Xoops->logcounterx流量統計模組系統分析增加Windows10設定-教學撰寫:徐嘉裕Neil hsu

logcounterx是日本人開發專門分析網站流量的Xoops模組,不過近幾年似乎沒有更新版本發佈,所以模組系統分析還停留在Windows7,好像是時光暫停了一樣!! 這樣就失去系統分析的意義了,既然沒人要維護只好自己加上Windows10的分析設定,分法如下: 1,找到以下檔案,用筆記本打開 ../../modules/logcounterx/include/functions.php 2、搜尋 Windows7 找到以下程式  if (preg_match('/Windows NT 6\.1/i', $agent) || preg_match('/WinNT 6\.1/i', $agent)) { return 'Windows7'; } 3.在搜尋Windows7程式下面再加上Windows10的程式碼 (紅字部分)  if (preg_match('/Windows NT 6\.1/i', $agent) || preg_match('/WinNT 6\.1/i', $agent)) { return ' Windows7 '; } if (preg_match('/Windows NT 10\.0/i', $agent) || preg_match('/Win64\.0/i', $agent)) { return 'Windows10'; } 存檔後,前往模組首頁系統分析就會顯示Windows10的數據了 這樣就完成logcounterx流量統計模組系統分析增加Windows10設定,有需要的朋友參考看看! 備註說明:logcounterx模組的log是紀錄user瀏覽器當日IP不做重複紀錄,所以如果修改好程式需要測試請用今日內尚未開啟網站的瀏覽器測試才會有數據(例如Edge已被紀錄就用Chrome測試) 工作心的撰寫: 徐嘉裕 Neil hsu

PHP8.0->TypeError: count(): Argument 的解決方法-教學撰寫:徐嘉裕Neil hsu

在PHP8.0中count()函數增加了必須要有 傳遞參數 不能為無效值,否則就會出現 TypeError: count(): Argument 的錯誤訊息 只需要調整一下架構即可 PHP8.0範例count() //正常  count()有 傳遞 參數 $a[0] = 1; $a[1] = 3; $a[2] = 5; echo count($a); //錯誤 count()沒有 傳遞 參數 /*$a[0] = 1; $a[1] = 3; $a[2] = 5;*/ echo count($a); //解決方法A  用is_array()判斷 傳遞 參數是否有值且為陣列 $a = is_array($a) ? count($a) : 0 ; echo $a; //解決方法B  在if中使用is_array()判斷 傳遞 參數是否有值且為陣列 if(is_array($a) && count($a)!=0){ echo count($a); } echo count($a); 這兩個方法都能解決TypeError: count(): Argument 的問題,有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu

Xoops做一個php8.0下載多檔打包壓縮成ZIP格式方法

之前寫過一篇【 Xoops做一個php下載多檔打包壓縮成ZIP格式方法 】工作心得,不過那方法在PHP8.0中無法使用,原因是new ZipArchive必須要先有實體的zip檔才能實體化,否則會出現 ValueError: ZipArchive::open(): Argument #1 ($filename) cannot be empty 錯誤訊息,必須修改new ZipArchive寫法在$zip->open之前就先建立一個暫存的zip檔,這樣後面的程式就沒問題了,修改方法如下 ※原本的new ZipArchive code function zipArchivefunction($url="",$zipname="",$temp="){ //$url 檔案原始路徑+檔名(陣列格式) //$zipname zip檔案名稱 //$temp 檔案暫存路徑+檔名 $zip = new ZipArchive; $zip->open($temp, ZipArchive::CREATE); //$url檔案路徑迴圈加入zip中 foreach ($url as $file) { $new_filename = substr($file, strrpos($file, '/') + 1); //重新定義壓縮檔路徑 $zip->addFile($file, $new_filename); } $zip->close(); /********使用header命令php下載zip檔************/ header('Content-Type: application/zip'); //指定類型 header("Content-type: ".filetype("$temp")); //指定下載時的檔名 header("Content-Disposition: attachment; filename=".$zipname.""); //輸出下載的內容。 readfile($temp); unlink($temp); //刪除暫存檔 } ※ php8.0修改過後的new Z

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

之前寫過一篇【 Xoops做一個php下載檔案自動壓縮成ZIP格式方法 】工作心得,不過那方法在PHP8.0中無法使用,原因是new ZipArchive必須要先有實體的zip檔才能實體化,否則會出現 ValueError: ZipArchive::open(): Argument #1 ($filename) cannot be empty  錯誤訊息,必須修改new ZipArchive寫法在$zip->open之前就先建立一個暫存的zip檔,這樣後面的程式就沒問題了,修改方法如下 ※原本的new ZipArchive code 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("$temp")); //指定下載時的檔名 header("Content-Disposition: attachment; filename=".$zipname.""); //輸出下載的內容。 readfile($temp); unlink($temp);

XAMPP8.0 須於php.ini啟用gd圖形庫-教學撰寫:徐嘉裕Neil hsu

PHP8.0之後GD圖形庫被更名為extension=gd,預設是被註解掉的需要手動啟用,不過還好XAMPP8.0本身有GD圖形庫不須另外安裝,因此只需要修改php.ini啟用GD,方法如下: 找到php.ini用筆記本打開 c:\xampp\php\php.ini 搜尋 extension=gd 會找到 #extension=gd 吧前面的 # 號拿掉,然後重新啟用Xampp的Apache即可啟用GD圖形庫,可以用phpinfo();檢查GD圖形庫是否有正常運行 若顯示GD資訊就表示GD圖形庫有正常運作,網站上傳圖片也不會發生異常了,有需要的朋友可以參考看看。 工作心得撰寫: 徐嘉裕 Neil hsu

php8.0使用foreach批次大量接收變數的方法-教學撰寫:徐嘉裕Neil hsu

之前寫過一篇【 php使用each批次大量接收變數 】的工作心得,但PHP8.0之後each()被棄用,原本使用each都會出現以下錯誤 Error: Call to undefined function each()  解決方法就是用foreach替換each,且foreach效能比each快10倍以上,是個不錯的替換方案 替換方法如下說明: //允許傳送變數 $allowvar =array("of_sortid","centerid","enable","arrange","search","type","useruid","post"); 原本的each code //接收變數區 while (list( $var , $value ) = each( $_REQUEST )) { if(in_array($var,$allowvar)){ $$var=trim(isset($value)?$value:""); } } 修改為foreach code //接收變數區 foreach( $_REQUEST as $var => $value ){ if(in_array($var,$allowvar)){  $$var=trim(isset($value)?$value:"");  }  } 只需要吧原本each 紅字 跟 藍字 的變數替換到foreach 紅字 跟 藍字 ,其他程式都不需要更動,這樣就完成替換作業,在php8.0中也能正常運作,有需要的朋友參考看看。 教學撰寫: 徐嘉裕 Neil hsu

寫一個jQuery點擊當前按鈕操作對應區塊並隱藏其他非點擊按鈕對應區塊(類似滑動選單收合效果)-教學撰寫:徐嘉裕Neil hsu

簡單來說,就是作用中的按鈕觸發對應的區塊開啟或關閉,其他非作用中按鈕對應的區塊自動隱藏,類似滑動選單的原理如下圖這樣: 當點擊按鈕1時開啟區塊1,若再次點擊按鈕1則區塊1隱藏(收合) 當點擊按鈕2時開啟區塊2,並吧按鈕1的區塊隱藏,這樣就會一值保持只有一個被點擊的按鈕在操作區塊開啟或隱藏 code如下 //html結構 <a type='button' class=' openbtn1 btn btn-md btn-info active openadmin'>按鈕1</a> <div class= 'openbox1 openboxArr'>區塊1區塊1區塊1</div> <a type='button' class=' openbtn2 btn btn-md btn-info active openadmin'>按鈕2</a> <div class=' openbox2 openboxArr'>區塊2區塊2區塊2</div> <script>nopenadminfunction();</script> //js code function nopenadminfunction() { $('.openboxArr').hide(); $(".openadmin").each(function(index) { var $topindex = index; var $openbtn = '.openbtn' + (index + 1); var $openbox = '.openbox' + (index + 1); $("body").on("click", $openbtn, function(e) { //非點擊區隱藏內容 $(".openboxArr").each(function(index) { if ($topinde

寫一個用php解析youtube影片網址ID的function-教學撰寫:徐嘉裕Neil hsu

如果想要在自己開發的Xoops模組中播放youtube影音,就必須解出youtube影片網址串後面的ID才行,然後套入到iframe中,youtube影片網址目前有兩種格式 1、瀏覽器網址有?v=變數值,像是https://www.youtube.com/watch?v= yeWbbzDDNAc  紅字即為影片ID 2、播放器滑鼠右鍵->複製影片網址,沒有?v=變數值,像是https://youtu.be/ yeWbbzDDNAc  紅字即為影片ID 所以function必須兩種格式網址都要能解出影片ID,以下為CODE部分 //youtube取得網址ID function function youtubeurl($url=""){ //解析youtube網址?v值 //網址類型:https://www.youtube.com/watch?v=zIE8htt4HLg $urlarr=parse_url($url); parse_str($urlarr['query'],$parr);      $vid=$parr['v'];  //解析複製網址後ID值 //網址類型:https://youtu.be/SfPeulcfbSI if(empty($vid)) $vid=end(preg_split("/\//",reset(preg_split("/\?/",$url)))); return $vid; } 使用範例 $url="https://www.youtube.com/watch?v=yeWbbzDDNAc"; 或是 $url="https://youtu.be/yeWbbzDDNAc"; 以上兩種格式都能解 echo $youtubbox="<iframe width='950' height='534' src='https://www.youtube.com/embed/". youtubeurl($url) ."' title='YouTube video player' frameborder='

XOOPS->mainfile.php自解網站路徑設定方法-教學撰寫:徐嘉裕Neil hsu

在Xoops根目錄底下有一個mainfile.php,其中一項設定 define('XOOPS_URL', 'http://www.example.com'); 這是設定Xoops網站網址的URL,設定值會套用到模組的XOOPS_URL及樣板<{$xoops_url}>變數,但如果網站要同時能用網址跟IP開啟,又要能開啟http及https網址,那就必須要修改一下XOOPS_URL的設定,改成下面這樣就行了 define('XOOPS_URL', $http . $_SERVER['HTTP_HOST' ]);    $http->會自動取得mainfile.php中$http變數值,依照來訪者輸入網址帶入http及https值, $_SERVER['HTTP_HOST']->取得來訪者輸入的 Host 名稱 這樣不管是IP,網址,WWW或沒有WWW,http及https都能全部開啟Xoops網站,最後如果網站是建在根目錄底層目錄,像是 http://www.example.com/webdate,吧網站目錄加在$_SERVER['HTTP_HOST']後面即可 define('XOOPS_URL', $http.$_SERVER['HTTP_HOST'].'/ webdate ');   最後在吧XOOPS_COOKIE_DOMAIN->也改為$_SERVER['HTTP_HOST'],這樣記錄登入資訊的COOKIE也會隨網址改變。 define('XOOPS_COOKIE_DOMAIN', $_SERVER['HTTP_HOST']); 這樣Xoops網站就什麼網址都能解也能登入,有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu

分享一個jquery->scroll防止重複觸發防抖function-教學撰寫:徐嘉裕Neil hsu

使用jquery->scroll進行判斷取值時遇到頭痛的問題就是會重複觸發兩次,這樣會導致觸發後執行的function也跑兩次,輕者消耗CPU效能,嚴重的像是瀑布流相同內容輸出兩次,所以必須要有scroll的防抖機制才行(只取一次觸發值)。 這是原生的scroll code ,大家可以執行看看 $(window).scroll(function() {     alert($(window).scrollTop()); }); 只要滑鼠滾輪向下停住時就會發生兩次觸發,為了解決這問題透過G大神找到這個好用的scroll 防抖程式 //scroll防抖程式 var timeout = null; window.addEventListener('scroll', function() {     if(timeout !== null) clearTimeout(timeout);     timeout = setTimeout(function() {     var scrollTop =$(window).scrollTop();          //程式執行區            alert(scrollTop);     }.bind(this), 1000); }); 只需要吧工作function放在紅字的 程式執行區 即可,防抖程式會以setTimeout延遲1000毫秒為誤差範圍取最後一個觸發值,用這支程式來跑AJAX瀑布流資料也不會亂噴了,CPU消耗也減低很多,有需要的朋友可以參考看看。 工作心得撰寫: 徐嘉裕 Neil hsu

Xampp在CentOS7上使用 Let's Encrypt建立ssl憑證及自動更新憑證的方法-教學撰寫:徐嘉裕Neil hsu

Xampp在CentOS7上使用 Let's Encrypt建立ssl憑證及自動更新憑證的方法 Let's Encryp是一個免費、自動化、開放,為了公眾利益而運作的憑證頒發機構 (Certificate Authority, CA)。它是由 Internet Security Research Group (ISRG) 所提供的服務。 Let's Encryp為傳輸層安全 (TLS) 加密提供免費證書,從而在 Web 服務器上啟用加密的 HTTPS。它通過提供可自動執行大部分步驟的軟件客戶端Certbot 來簡化證書的創建、驗證、簽名、安裝和更新過程。 如需申請Let's Encryp憑證需在伺服器端執行,以下為Xampp在CentOS7上使用 Let's Encrypt建立ssl憑證及自動更新ssl憑證方法 前置準備 1->安裝PuTTY 使用ssh連線進入伺服器端 如您有root權限,建議建議安裝以下自由軟體可更便利操作編輯設定,如果沒有root權限請跳過2.3 2->安裝filezilla 使用root->ssh連線進入伺服器端 3->安裝Notepad++,並吧filezilla預設編輯器設為Notepad++ 開始設定(如有root權限不用輸入 sudo ) 1、首先要先關閉XAMPP伺服器,因為apache會占用80port或443port導致憑證申請驗證失敗,請輸入以下指令關閉Xampp sudo /opt/lampp/lampp stop 2、安裝 Certbot Let's Encrypt 於伺服器端 要使用 Let's Encrypt獲取 SSL憑證,您首先需要安裝Certbot和mod_sslApache套件,它提供對SSLv3加密的支持。 增加 CentOS7 EPEL存儲庫,請輸入以下指令: sudo yum install epel-release 3、安裝所有必需的套件: sudo yum install certbot python2-certbot-apache mod_ssl CENTOS 8需安裝certbot sudo yum -y install epel-release mod_ssl certbot' Ubuntu22.04需安裝c

jQuery 排除指定區塊以外的任意點擊觸發事件-教學撰寫:徐嘉裕Neil hsu

今天要說的這個功能其實就跟FB粉絲團管理後台的左右收合選單是一樣的原理,也就是當選單開啟時,在選單以外的任何地方發生點擊事件觸發選單收合,但於選單內發生的點擊不產生作用,除非點選關閉按鈕,像下圖這樣 這裡分享一個好用的jQuery  function,原生的code是這樣 $(document).mouseup(function (e) { var container =$("#leftmenu"); // 這邊放你想要排除的區塊 if (!container.is(e.target) && container.has(e.target).length === 0) { container.hide(); } }); 當點擊發生在#leftmenu以外的地方就會關閉區塊,但會有一個問題,如果使用css動畫效果時(滑動/移動),不管是開啟還是關閉任意點擊,動畫一樣會被觸發,這樣效果上就會有問題了,所以做了以下調整! $(this).mouseup(function(e) { if ($("#leftmenu").css("left") == '0px') {  //以開啟時的left的位置做判斷 var container = $("#leftmenu"); // 這邊放你想要排除的區塊 if (!container.is(e.target) && container.has(e.target).length === 0) { $("#leftmenu").css({ "animation-name": "leftclose", "left": "-350px"  //關閉時的left的位置 }); } } }); 紅字部分增加了以css樣式的狀態為判斷依據,這裡用 0px 表示選單是開啟狀態,點擊任意區塊可以出觸發code關閉選單,反之選單為收合狀態時left為 -350px

dt標籤使用CSS->before建構內容加上nth-child()產生中文數字編號一、二、三-教學撰寫:徐嘉裕Neil hsu

在做網頁編排最常見的問題就是CSS的list-style-type無法產生中文數字如一、二、三,如果直接吧內文加上中文數字沒段行還好,字太多時會分切兩行,第二行的文字開頭會對齊左邊基線,像下圖這樣 如果有強迫症的人看了會很不舒服,解決方法就是吧內文的一、二、三拿掉,然後再標題的dt標籤用before建構內容+nth-child()判斷列數產生一、二、三,就可以做出像以下的排版方式,第二行由數字後開始顯示。 這樣就美觀多了~遇到處女座的客戶也不會有問題,製作方法如下 1、HTM:結構吧內文標題的一、二、三拿掉 (紅字為標題) <dl> <dt>以學生為中心:發展以學生為中心,教學優先的核心價值。培養學生新三好運動。</dt> <dd> 1.把書讀好:養成終生學習的能力<br /> 2.身要練好:養成終生運動的能力<br /> 3.人要做好:養成終生反省的能力 </dd> <dt>以專業為依歸:教師有專業、行政有效能。</dt> <dd> 1.活力行政:力持「依法行政、穩健成長」的經營要領。<br /> 2.專業教師:提升教師教學專業能力,形塑專業形象。<br /> 3.建立專業社群之學校文化,建立團隊學習機制,以專業對話、團隊學習的機制,落實教學品質保證。 </dd> <dt>愛、榜樣與熱誠:打造「溫馨校園、全人教育、終身學習」的辦學環境。</dt> </dl> 2、CSS部分加上以下CODE dt{ position: relative; font-size: 115%; padding: 10px 0px 10px 50px; color: #174960; line-height: 170%; } dt:nth-child(1)::before{ position: absolute; left: 0px; content:"一、"; } dt:nth-child(3)::before{ position: absolute; left: 0px; content:"二

Xoops忘記管理密碼->修改資料表重建密碼方法-教學撰寫:徐嘉裕Neil hsu

如果忘記Xoops管理員密碼,想要修改資料庫中資料表取回,首先必須要有進入phpmyadmin的權限,進入phpmyadmin後在左邊選單找到XOOPS網站的資料表名稱,點擊進入資料表列,然後使用瀏覽器的搜尋功能(ctrl+F),輸入users,找到被標註的users資料表,點擊進入 進入users資料表後,找到管理員帳號 (看uname欄位) ,點選左邊的編輯 然後使用瀏覽器搜尋(ctrl+F),輸入pass,找到密碼欄位,將右邊的文字框清空,輸入新密碼,這裡用(12345)做測試,然後吧右邊的類型選擇MD5 按下方的執行儲存更新 之後輸入 帳號admin 跟密碼 12345 就能用管理員登入Xoops網站了,有需要的朋友參考看看! 教學撰寫: 徐嘉裕 Neil hsu

解決php程式迴圈使用Bootstrap框架排版內容高度無法一致的問題 -教學撰寫:徐嘉裕Neil hsu

使用Bootstrap框架排版來跑php迴圈,除非是要做瀑布流,一定會遇到以下的問題,就是每個div的高度都不一致,導致區塊跑位的情況 這樣不是很奇怪嗎?解決方法就使用js的each取得nth-child引響範圍內區塊高度的最大值,再輸出到範圍內的全部區塊,例如每列有三個區塊,迴圈跑三次共三列,程式就會以每三個區塊取值比對一次抓出最大高度在輸出,這樣每一列的高度都會一致,不會再發生區塊跑位的情況。 方法如下: html結構 <div class="row">   <div class="col-md-4">.col-md-4</div>   <div class="col-md-4">.col-md-4</div>  <div class="col-md-4">.col-md-4</div>   <div class="col-md-4">.col-md-4</div> <div class="col-md-4">.col-md-4</div> </div> 呼叫function <script>sameheightfunction();</script> js-code 吧以下的code放在頁面引入的js檔中 //區塊高度相等 function sameheightfunction() {   var $column=3; //欄位數   var $range = $column - 1;   var $sections = $('.col-md-4');  //區塊class   $sections.filter(':nth-child(' + $column + 'n-' + $range + ')').each(function() {     var $this = $(this),       $els = $this.nextAll(':lt(' + $range + ')&

用PHP遞迴作switch流程控制範例-教學撰寫:徐嘉裕Neil hsu

遞迴的運作原理就是在同一個function裡面再次或多次執行同樣的function,通常用在解階層式資料,像是分類父層子層之類的,但遞迴也能作為switch流程控制用途,這樣就能吧本來要用很多的function用一個function就能執行完畢了,程式也精簡很多,以下是參考範例: 例如我們要做一個以陣列方式選取星期的功能,然後吧陣列數值儲存為unserialize字串格式 所以儲存進資料表的字串內容如下: a:4:{i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"5";i:3;s:1:"7";} 接下來要在頁面上吧選擇星期的字串內容改為輸出星期一~星期日,並指定顯示選取的內容,我們利用PHP遞迴作switch流程控制一次搞定 //PHP-function //活動星期 function activityweek($week="",$type=""){ switch($type){ case "1": //開啟字串轉陣列解出數值 foreach(unserialize($week) as $val){ $weektext.="<span class='glyphicon glyphicon-check' aria-hidden='true'></span>". activityweek($week=$val,$type="2") ." &nbsp;" ; } $weektext= activityweek($week=$weektext,$type="3") ; break; case "2": //按數值對應星期 switch($week){ case "1": $weektext=_MS_SHARED162; //星期一 break; case "2": $weektext=_MS_SHARED163; //星期二 break; case "3"

PHP好用的QRcode產生套件phpqrcode->Xoops模組應用範例-教學撰寫:徐嘉裕Neil hsu

如果要在Xoops模組中使用php產生的QRcode套件,phpqrcode是個不錯的選擇,且套用方便利於擴充管理,首先先去phpqrcode官網下載套件包回來 http://phpqrcode.sourceforge.net/ PHP QR Code庫的某些功能包括: 支持QR Code版本(大小)1-40 數字,字母數字,8位和漢字編碼。(日文漢字編碼尚未經過全面測試,如果您啟用了日文編碼,則可以通過驗證它來做出貢獻:)) 完全用PHP實現,除GD2外沒有任何外部依賴項 導出為PNG,JPEG圖像,也導出為位表 TCPDF 2-D條碼API集成 易於配置 數據緩存可加快計算速度 提供的合併工具有助於將庫作為一個沒有依賴關係的大文件進行部署,易於“包含且不擔心” 調試數據轉儲,錯誤記錄,時間基準測試 100%開放源代碼,LGPL許可 解壓縮後吧phpqrcode丟到Xoops模組的class資料夾中 然後再Xoops的uploads資料夾中建立一個qrcode資料夾存放QRcode圖檔 (資料夾需設777權限) 再吧以下的code放到模組的function.php裡面 //QR CODE 產生器 function qrcodeGenerator($url='',$level='',$size='',$qrcodeimg=''){ //參數說明 //$url  產生QRcode連結 //$level  容錯級別 H 30% 校正 / L = ~7% 校正 / M = ~15% 校正 / Q = ~25% 校正 //$size  生成圖片大小 max10 //$qrcodeimg  產生QRcode圖檔名 include_once XOOPS_ROOT_PATH."/modules/ 模組ID /class/phpqrcode/phpqrcode.php"; $value = $url; //二維碼內容 $errorCorrectionLevel = $level; //容錯級別 $matrixPointSize = $size; //生成圖片大小 //生成二維碼圖片 $filename = XOOPS_ROOT_PATH.'/uploads

解決CentOS安裝XAMPP後MariaDB大量產生err的方法-[ERROR] Incorrect definition of table mysql.column_stats: expected column 'max_value' at position 4 to have type varbinary(255), found type varchar(255)-教學撰寫:徐嘉裕Neil hsu

最近靈異事件真的很多,像是完全按照官網版本安裝的XAMPP7.4X在CentOS上,照理說官方釋出的版本因該都正常的吧,沒想到一運行XAMPP就產生大量的.err檔,而請增加速度非常快,不用幾天就會吧root撐爆,不處理也不行 先來看一下.err錯誤訊息內容(.err位置在/opt/lampp/var/mysql/ xxx.err ) 2021-04-12  8:33:48 13 [ERROR] Incorrect definition of table mysql.column_stats: expected column 'max_value' at position 4 to have type varbinary(255), found type varchar(255). 2021-04-12  8:33:48 13 [ERROR] Incorrect definition of table mysql.column_stats: expected column 'min_value' at position 3 to have type varbinary(255), found type varchar(255). 2021-04-12  8:33:48 13 [ERROR] Incorrect definition of table mysql.column_stats: expected column 'max_value' at position 4 to have type varbinary(255), found type varchar(255). 是說table的mysql表裡面的column_stats欄位預設是varchar(255),但正確因該是varbinary(255),但mysql表不是MariaDB的系統預設表嗎??怎麼會出錯......真是見鬼了! 但不解決又不行,因為err會一直增加,那只能修改欄位類型了! 在phpmyadmin->mysql->sql執行以下sql語法 use mysql;  alter table column_stats modify column max_value varbinary(255);  alter table colum

JS捲軸觸發後按時間依次顯示的動畫效果-教學撰寫:徐嘉裕Neil hsu

 寫了一個JS捲軸觸發後按時間依次顯示的動畫效果的範例,效果如下影片 就是當捲軸拉到觸發的ID時物件按照時間依序觸發動畫,這通常用在視差設計裡面,方法如下 //HTML結構 <div class="row"> <div id='addressbox14' class="each" > <div class="col-md-6 addressbox01 " > 略..... </div></div> <div id='addressbox15' class="each" > <div class="col-md-6 addressbox02 " > 略..... </div></div> <div id='addressbox16' class="each" > <div class="col-md-6 addressbox01 " > 略..... </div></div> <div id='addressbox17' class="each" > <div class="col-md-6 addressbox02 " > 略..... </div></div> </div> //JS結構 $(window).scroll(function() { var $scrollTopa =$(this).scrollTop(); //當前座標位置 var $scrollTopb=$scrollTopa+850; //觸發位置 $(". each ").each(function(index) {   var $index=index*270; //setTimeout時間each迴圈取index乘270數

jQuery使用each->substr()擷取指定字元分割並套用html標籤做突顯色的方法-教學撰寫:徐嘉裕Neil hsu

css的first-letter選擇器可以讓第一個字元自訂樣式,也就是第一個字能變顏色變大變小都行,但問題來了,如果客戶希望第二個字元或第三個字元都能套用特別的顏色,first-letter方法就不可行了,還是要靠js來處理才行。 例如要做一個像下圖這樣的效果,新聞標題的前2個字元為紅色,其他字元為黑色。 code如下: html結構部分 <div id='titlebox'><a   class='exchangeArr'   href="https://www.blogger.com/">標題文字標題文字標題文字標題文字標題文字標題文字</a></div> 在標題<a>標籤加上 class='exchangeArr' js-code部分 在樣板底端加上以下code <script> $(".exchangeArr").each(function(index) { var $exchangetext = 2; //由0開始到擷取位置字元數 //擷取指定字元 var $substrbefore=$(this).html().substr(0,$exchangetext); //擷取剩餘字元 var $substrRear=$(this).html().substr($exchangetext); //輸出 $(this).html(' <span id="textcolor"> '+$substrbefore+' </span> '+$substrRear+''); }); </script> 綠色的<span>標籤跟id="textcolor就是指定第2個字元切割後套用上去的,在跟剩餘字元組合輸出的結果。 最後就是給id="textcolor定義一個css顏色樣式 #textcolor{ color: #ff1b1b; } 這樣就完成了,可以修改要擷取的字元數套用樣式,有需要的朋友參考看看! 工作心的撰寫: 徐嘉裕 Neil hsu

PHP數字轉英文字母套用Excel列標的方法-教學撰寫:徐嘉裕Neil hsu

之前寫過一篇【PhpSpreadsheet電子表格PHP匯出excel排版範例】的工作心得 https://neohsuxoops.blogspot.com/2020/09/phpspreadsheetphpexcel-xoops.html 但是發現一個問題,就是excel的列標一定是英文字母A~Z組合,例如: //表頭區 $worksheet ->setCellValue('A1', 'Product') ->setCellValue('B1', 'Quantity') ->setCellValue('C1', 'Unit Price') ->setCellValue('D1', 'Price'); 如果吧C1刪除剩下ABD,匯出Excel還是會空一格C的欄位,必須要重編A~Z的列標,實在不方便,最好的方法就是以數字增加自動生成英文,這樣的好處是如果要刪除欄位或是需要設定匯出條件某些欄位不匯出時,就不會產生空欄位的問題,方法如下: 1、先在模組的function.php中置入以下的function function IntToChr($index, $start = 65) { $str = ''; if (floor($index / 26) > 0) { $str .= IntToChr(floor($index / 26)-1); } return $str . chr($index % 26 + $start); } 這樣只要輸入數字就能產生英文 echo IntToChr(0); 輸出:A echo IntToChr(1); 輸出:B 再來就是修改Excel程式部分,吧原本英文字改為IntToChr($i),然後帶入$i值產生數字->帶出英文字母 //表頭區 $i=0; $worksheet ->setCellValue(''. IntToChr($i) .'1', 'Product'); //A1 $i++; $worksheet ->setCellValue('

解決 CentOS Linux release 7.9安裝XAMPP後啟動出現cat: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory的方法-教學撰寫:徐嘉裕Neil hsu

根據G大神資料得知只要是CentOS X.9版安裝XAMPP都會出問題,這次是安裝XAMPP7.4..15啟動時出現以下錯誤訊息 cat: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory 解決方案如下: 找到以下檔案 /opt/lampp/lampp 用筆記本打開編輯 if test $(osguess) = "rh9" then # for now disable PNTL. if PNTL gets more popular we will support it. - oswald [8apr3] export LD_ASSUME_KERNEL=2.2.5 #echo "XAMPP: DISABLE PNTL..." fi 吧紅字那段改為 export LD_ASSUME_KERNEL=3.1.0 修改後更新檔案 再次啟用XAMPP  /opt/lampp/xampp restart 就能正常啟動了 Starting XAMPP for Linux 7.4.15-0... XAMPP: Starting Apache...ok. XAMPP: Starting MySQL...ok. XAMPP: Starting ProFTPD...ok. 有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu

CentOS->XAMPP變更檔案或資料夾 擁有人/群組 的方法-教學撰寫:徐嘉裕Neil hsu

將備份的XAMPP中下載回本地端的MYSQL的DB檔再次上傳回主機卻無法使用,原因是在於 擁有人/群組 設定不一樣,CentOS中的XAMPP->MYSQL路徑在/opt/lampp/var/mysql/資料表目錄,可以看一下擁有人/群組 預設都是mysql/mysql,但重新上傳後DB的擁有人/群組卻變成root/root或其他,所以自然無法讀取資料,解決方法就是修改  擁有人/群組 改為mysql/mysql,方法如下 使用以下的指令: sudo chown -R mysql:mysql   /opt/lampp/var/mysql/DB Folder 紅字 為變更 擁有人/群組 綠字 為需要變更的資料夾路徑,這樣指令就會以遞迴方式吧整個DBFolder裡面全部的DB通通改為mysql:mysql DBFolder->您的資料庫資料夾名稱 然後再去phpmyadmin中查看就能看到原本的資料表了。 另外還有其他用法 單一變更 擁有人/群組 非全體 sudo chown  mysql:mysql    /opt/lampp/var/mysql/DB Folder 參考資料來源: https://blog.gtwang.org/linux/linux-chown-command-tutorial/ 工作心得撰寫: 徐嘉裕 Neil hsu

JS->控制type='radio'切換checked的方法-教學撰寫:徐嘉裕Neil hsu

使用prop("checked",true)可以指定type='radio'元件的狀態為checked,如果我們想用某一個單選按鈕來控制另外一個單遠按鈕的checked狀態可以使用以下方法 例如要切換下方的-> 設置預約發文為【不設置】時 , 上方的是否啟用內容變為【啟用】 , 設置預約發文為【設置】時 , 上方的是否啟用內容變為【不啟用】 ,像下圖這樣: HTML結構 <div class='col-sm-12 col-sm-12Custom'> <label class='col-sm-6'> <span id='helpBlock' class='help-block'>是否啟用內容</span> </label> <div class='col-sm-6'> <label class='radio-inline'> <input class='' type='radio' id='' name='enable' value='0' >不啟用 </label><label class='radio-inline'> <input class='' type='radio' id='' name='enable' checked=checked value='1' >啟用 </label> </div> </div> JS-CODE $("body").on("change", "[name=prior]", function (){ if($(this).val()=='1'){ $("#priortimebox").slideToggle("fast"

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}> //中間上左區塊 &l

Xoops2.5.11布景引入Xoops內建Bootstrap4的方法!!-教學撰寫:徐嘉裕Neil hsu

Xoops2.5.11之後提供了一個讓佈景可以引入Xoops內建Bootstrap4的方法,而且很好用,不會跟佈景原本引入的Bootstrap3衝突,方法如下!! 在佈景的根目錄放置theme_autorun.php檔,內容貼上以下code <?php xoops_load('XoopsFormRendererBootstrap4'); XoopsFormRenderer::getInstance()->set(new XoopsFormRendererBootstrap4()); 來看看效果如何?還沒放置theme_autorun.php之前的profile模組->編輯帳號表單頁面是這樣,原生的Xoops表單樣式。 放置theme_autorun.php之後的profile模組->編輯帳號表單頁面是這樣 很明顯欄位都美化很多,而且不會跟Bootstrap3衝突,有需要的朋友參考看看! 工作心得撰寫: 徐嘉裕 Neil hsu

寫一個清除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

用CSS做一個物件連續旋轉的動畫方法-教學撰寫:徐嘉裕Neil hsu

 如果要做一個像下圖這樣的風車順時鐘一直重複選轉 可以用以下的CSS方法達成: HTML結構 <div id="bottompagerimg"> <div id='windmillbox01'></div> //旋轉風車圖片 <div id='windmillbox02'></div>  //底下支架 </div>   CSS結構 #bottompagerimg {  //物件父層BOX設定 position: absolute; width: 282px; height: 306px; right: 89px; top: -289px; z-index: 20; } #windmillbox01{  //風車設定 position: absolute; top: 0px; width: 276px; height: 276px; background: url(../../img/blocks/shiangan_46.png) no-repeat left top; animation-duration: 3.5s; /*執行時間*/ animation-fill-mode: forwards;    animation-name: windmillbox; animation-timing-function: linear;  /*相同的速度*/ animation-iteration-count: infinite;  /*動畫重複執行*/ z-index: 5; } @keyframes windmillbox {  //風車動畫 0% { transform:rotate(0deg); } 50% { transform:rotate(180deg); } 100% { transform:rotate(360deg); } } #windmillbox02{   //風車支架設定 position: absolute;  width: 20px; height: 120px; bottom: 0px; left: 125px; background: url(../../img/

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