文章

PhpSpreadsheet電子表格PHP匯出excel排版範例->Xoops-教學撰寫:徐嘉裕Neil hsu

圖片
在開發模組時如果要吧資料表內容匯出excel,最常用的套件因該就是PHPExcel,但是官網已經說明PHPExcel套件因升級不易只能支援到php5.6,該物件已於2017年正式棄用,並於2019年永久歸檔,換句話說PHPExcel套件對於日後新版的excel格式均不支援,為保持程式在最新狀態只好棄用PHPExcel改使用PhpSpreadsheet電子表格套件,該套件也是能匯出excel,還能匯出LibreOffice Calc,感覺還不錯!
唯一比較麻煩的是使用PhpSpreadsheet要先佈署composer,如果沒佈署composer是沒辦法使用的,還好官方有釋出已經設定好的phpoffice套件可以直接引入使用,省了很多麻煩,使用PhpSpreadsheet方法如下:

1、先下載PhpSpreadsheet套件,我已經幫大家吧phpoffice一起打包上傳https://drive.google.com/file/d/1jw73diWVjbcr1ycY-gtqM2cGfpLp1zS_/view?usp=sharing下載回來後解壓縮吧phpoffice跟PhpSpreadsheet丟到Xoops模組的class資料夾中,未來如需更新PhpSpreadsheet可到官網下載最新版覆蓋即可https://github.com/PHPOffice/PhpSpreadsheet2、然後建立一個excel.php放在模組根目錄中以下為編排excel表格常用的函數設定include_once "header.php";//先引入autoload.php檔include_once XOOPS_ROOT_PATH.'/modules/模組ID/class/phpoffice/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = new Spreadsheet(); //實體化Excel工作表

//設置電子表格元數據的操作:

$spreadsheet->getProperties()
->setCreator("Maarten Ballia…

解決/opt/lampp/bin/mysql.server: 264: kill: No such process-無法啟用mysql的方法(CentOS)-教學撰寫:徐嘉裕Neil hsu

圖片
今天客戶突然告知學校的網站無法連線,我去看了一下LAMPP是啟用的,但MYSQL無法啟動,會顯示 /opt/lampp/bin/mysql.server: 264: kill: No such process 客戶說前幾天有跳電伺服器沒正常關機,按照經驗法則大概又是err在作怪,先輸入指令查一下客戶伺服器容量
 df -l 

 結果如下圖可以看到root 容量已到100%,然後問題又是mysql無法啟用,那就來找一下mysql的log資料夾看問題出在哪?
/opt/lampp/var/mysql/xxxxx.err
如果有發現紅字的.err檔案就是導致系統容量100%及MYSQL無法初始化的元凶,吧.err刪除後重啟LAMPP就能恢復正常了(可以多刪除幾次到沒有.err為止)。

刪除err後再看一下容量,root 容量變為17%

重新啟動xampp,輸入指令:

/opt/lampp/xampp restart


這樣MYSQL就恢復正常運作了,有需要的朋友參考看看。


工作心的撰寫:徐嘉裕 Neil hsu

禁止返回上一頁JS程式(Firefox.IE.Chrome.Edge都兼容)-教學撰寫:徐嘉裕Neil hsu

圖片
在開發模組表單有時候會需要製作表單的填寫步驟,例如購物流程,問卷報名表之類的,每個流程都會儲存該流程的資料內容到程序完成,但如果USRE點了瀏覽器的返回上一頁可能會導致流程不完整或是程序出錯(例如金流串接等),所以必要時候選禁止瀏覽器返回上一頁是很重要的。G大神有很多JS禁止返回上一頁JS程式分享,但有的Firefox有效Chrome又無效,不然就是ie無效實在很頭痛,經過測試寫了一個能兼容4種瀏覽器的function分享給大家,程式說明如下。首先要使用JS的window.history.forward()來做操控瀏覽器歷史紀錄的功能!作用機制如下圖必須吧禁止返回上一頁JS程式放在A網頁,然後當表單送出進入B網頁時,B網頁就會產生禁止返回A網頁的效果(若吧程式放置在B網頁是無效果的)。//JS-CODE->放置在JS程式裡面//禁止返回上一頁function prohibitpreviouspage(){if(navigator.userAgent.indexOf('Firefox') != -1 && parseFloat(navigator.userAgent.substring(navigator.userAgent.indexOf('Firefox') + 8)) >= 3.6 ){//Firefox
setTimeout("fn_forward()",1);
window.history.go(1);
}else{ //IE.Chrome.Edge
window.history.forward();
}
}
function fn_forward() {
history.forward();
setTimeout("fn_forward()",1);
}然後再A網頁引入禁止返回上一頁JS程式<script type="text/javascript" src="js/customize.js"></script><script type="text/javascript">prohibitpreviouspage();</script>這樣透過A網頁進入B網頁會觸發…

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

圖片
之前寫過一個【Xoops做一個php下載檔案自動壓縮成ZIP格式方法】的工作心得,但那方法只能做單一檔案的ZIP下載打包,如果是多檔下載全部打包成一個ZIP檔,則需要修改一下程式才行,做成一個function方便使用,CODE如下。

//ZIP多檔打包下載
先做一個function丟到模組的function.php中方便重複使用
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); //刪除暫存檔 
}

在需要使用ZIP下載的PHP檔案做初步參數設置產生ZIP檔下載
//$_POST['download']為POST過來的下載檔名陣列 foreach($_POST['download'] as $key=> $val){ $url[$key]="&q…

用一層foreach解$_FILES['file']陣列(多檔上傳)存入資料表的方法->Xoops-教學撰寫:徐嘉裕Neil hsu

$_FILES['file']本身就是一個陣列,其底下包含了
$_FILES["file"]["name"]:上傳檔案的原始名稱。 $_FILES["file"]["type"]:上傳的檔案類型。 $_FILES["file"]["size"]:上傳的檔案原始大小。 $_FILES["file"]["tmp_name"]:上傳檔案後的暫存資料夾位置。 $_FILES["file"]["error"]:如果檔案上傳有錯誤,可以顯示錯誤代碼。
共有五個key值組成的,如果是單一檔案上傳用foreach可以解出陣列中的五個參數值,也就是上傳檔案的基本參數。
如果是多檔上傳,那$_FILES['file']就會是陣列格式,用一層foreach是解不出來的,因為第一層只會解出$_FILES['file']的五個屬性值但仍為陣列型態,還要再用第二層foreach去解每個屬性的參數值,不過有個更簡單的方法用一層foreach就能解出來了,方法如下:
//html <input type='file' class=' form-control' multiple name='file[]' id='file' >
//php //建立檔案 if(!empty($_FILES['file']['name'][0])){  foreach($_FILES['file']['name'] as $key=> $val){ //以$_FILES['file']['name']來開啟迴圈,如果上傳三個檔案就會迴圈三次
$_FILES["file"]["name"][$key]://可以得到上傳檔案的原始名稱迴圈值。 $_FILES["file"]["type"][$key]://可以得到上傳的檔案類型迴圈值。 $_FILES…

解決mouseenter及mouseleave執行物件動畫未完成又重複觸發的問題-教學撰寫:徐嘉裕Neil hsu

圖片
如果要用jQuery的mouseenter(滑鼠滑入)及mouseleave(滑鼠滑出)來執行物件動畫,會遇到一個問題,假使mouseenter時物件因該要跑到left:80px的位置才算動畫完成,mouseenter則回到left:0px的位置,但在動畫未執行完成user又快速的在執行區塊滑入滑出,就會變成動畫亂跳的情況!!
舉例來說,像下面這張圖三個物件是尚未mouseenter觸發前的狀態


滑鼠滑入其中一個按鈕會觸發mouseenter動畫事件,物件往左上移動


滑鼠滑出執行區會觸發mouseleave動畫事件,物件往右下移動,返回原本位置



js-code應該是這樣
//mouseenter $("body").on("mouseenter", "#indexblocksbox01", function (){
$(this).css("cursor", "pointer");
$(this).css({"animation-name":"indexbox1","animation-duration":"0.4s","left":"160px","top":"53px"});
$("#title01btn").css({"animation-name":"indexbox2","animation-duration":"0.4s","background-color":"#FFFFFF","color":"#E77C00"});
})

//mouseleave
$("body").on("mouseleave", " #indexblocksbox01", function (){
$(this).css("cursor", "auto"…

php遞迴刪除資料夾及資料夾內容function->Xoops-教學撰寫:徐嘉裕Neil hsu

如果用PHP函數刪除目錄若目錄中有檔案,則會刪除失敗,使用rmdir()也只能刪空目錄,有資料的目錄是無法刪除,所以必須要先用程式吧目錄內的檔案全部刪除,最後再刪除目錄,這裡分享一個好用的遞迴刪除目錄及目錄內容的function,另外還加上了若刪除失敗則更改目錄檔名的function,兩個一起使用就沒問題了,CODE如下:
1、吧以下兩個function貼到Xoops模組的function.php裡面
//變更資料夾檔名
function changedirectory($changedate) {
$date=date("Ymd");
if(!empty(rename($changedate, $changedate."_bak_{$date}"))) return true;
}

//刪除目錄包含內容物件
function fileunlink_r($from) {
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)) {
fileunlink_r($from . DIRECTORY_SEPARATOR . $file);
}
else {
unlink($from . DIRECTORY_SEPARATOR . $file);
}
}
if(!empty(rmdir($from))) $returnvar=true;
closedir($dir);
return $returnvar;
}

2、在執行刪除的php上引入這兩支php函式
//刪除資料夾及底下資料($from為刪除檔案目錄的實體路徑) $Filevar=fileunlink_r($from=XOOPS_ROOT_PATH.&#…

升級upload 0.34的方法class.upload.php-教學撰寫:徐嘉裕Neil hsu

圖片
class.upload.php是一套超好用的PHP上傳檔案套件程式,能上傳圖檔及檔案,也能多檔上傳,本次心得記錄主要以舊版的class.upload.php升級到class.upload.php0.34版的修改紀錄為主,若要查詢class.upload.php如何使用可以去Google一下有很多教學喔!
首先去verot官網下載class.upload.php套件回來,選擇最新的0.34版
網址:https://www.verot.net/home.htm

下載回來後解壓縮,吧class.upload.php-master\class.upload.php-master\src  <-資料夾裡面的
->class.upload.php ->lang
複製起來,貼到您網站或模組原本放置class.upload.php檔案的目錄位置覆蓋舊檔
然後在網站或模組找到引入class.upload.php程式上傳檔案function的地方(上傳參數設定那),裡面有一個類別為
$pic = new Upload($_FILES['upfile'], 'zh_TW');
全部替換為
$pic = new \Verot\Upload\Upload($_FILES['upfile']);
這樣就完成upload 0.34的升級了,經測試原本中文檔名會上傳失敗的問題在upload 0.34都排除了,而且支援php7.3,真的非常好用,有需要的朋友參考看看!

工作心得撰寫:徐嘉裕 Neil hsu

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

圖片
原本預計本次更新要翻新neilambilight佈景的前端介面,包括視差設計滾動設計等,但發現neothemesadmin模組仍有許多功能需要強化及升級,否則光改介面也沒什麼意義,所以本次發佈的neilambilight2.92仍以功能優化擴充與升級為主,包括表單防機器人AJAX機制做了強化處理(能100%阻絕機器人垃圾留言),PHP版本升級到PHP7.3.15,資料庫兼容升級到10.4.8-MariaDB嚴格模式,另外新增加了布景主選單及區塊選單的群組權限顯示功能(包含底層所有選單),以及對xlanguage多國語言模組兼容化工作,新增加一個關於我們圖文區塊,針對電腦版及手機版CSS及JS功能做優化調整處理,neilambilight2.92可以在最新版的Xoops2.5.10運行,也能兼容到Xoops2.5.8,包括tad最新釋出的模組全部都有做兼容測試,符合各種環境與不同版本的運行需求,歡迎下載安裝使用。
Xoops免費佈景-Neil佈景測試站 http://demoweb.neodw.com/themesdemo/



neilambilight2.92 更新內容
==============================
1、修正neothemesadmin佈景管理模組PHP常數重複問題。 2、修正neothemesadmin佈景管理模組跑馬燈左右移動無法正常顯示問題。 3、修正neillibrary函數庫模組XOOPS_LICENSE_KEY定義錯誤問題。 4、會員註冊表單增加【AJAX選擇時間驗證】防機器人功能,可阻斷100%的機器人表單註冊。 5、neillibrary函數庫模組新增加刪除IP紀錄及封鎖天數自動化功能。 6、聯絡我們表單增加【AJAX選擇時間驗證】防機器人功能,可阻斷100%的機器人表單註冊。 7、聯絡我們區塊表單增加【AJAX選擇時間驗證】防機器人功能,可阻斷100%的機器人表單註冊。 8、修改資料表語法兼容10.4.8-MariaDB嚴格模式。 9、PHP7.3.15兼容升級。 10、onUpdate.php新增資料表增加10.4.8-MariaDB嚴格模式。 11、區塊選單管理後臺套用網站選單的階層樣式跟開啟效果。 12、優化佈景管理模組->網站選單跟區塊選單UI介面。 13、修改隨機小語ICON貼入格式。 14、neothemesadmin佈景管理模組後台…

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;
輸出smarty $xoopsTpl->assign( "shopwcasepage" , $shopwc…