發表文章

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

圖片
通常下載檔案做個按鈕直接路徑指向檔案就能下載了,但現在瀏覽器越來越聰明,像是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("$temp"));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$zipname."");

//輸出下載的內容。
readfile($temp);
unlink($temp); //刪除…

分享一個好用的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["file"]["size"…

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.com/?hl=zh-TW&tab=TT

如果我們想知道繁體中文的代碼是多少…

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);                 }      }); });

這樣在upload.php中使用var_dump($_FILES['file']);觀看變數就會是陣列格式,後…

好用的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(img);
}
reader.readAsDataURL(inpu…

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,                 processData: false,                 data: form_data,     //…

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['3']=!empty($review) ? &…

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

之所謂關關難過關關過,遇到問題就要爆肝解決了阿?阿不然呢!!
講這麼多也是要抱怨一下,目前遇到一個問題就是客戶有4個資料表,分別是影片/相片/新聞/檔案,四個表都是獨立的,需要做一個總表吧4個表的內容按照建立時間排序顯示,之前一直卡在join的邏輯中解不出來,後來才想到join主要是做資料表欄位關連,而不是合併顯示,上網查了一下mysql操作手冊終於讓我找到一個可以解決問題方法,真是感動阿,用UNION ALL就可以解決了阿,方法如下。

//重點說明-很重要

使用UNION ALL查詢的多個資料表的欄位名稱都要相同才能抓地到數值,例如資料表table1中的name欄位那table2也必須要相同的name欄位名稱,欄位格式也都需相同,才能抓到兩個表的相同資料。

資料表 table1 
IDTITLETIMESNAME11影片標題012018-10-18AAA2影片標題022018-9-18BBBBB
資料表 table2
IDTITLETIMESNAME21相片標題012018-10-17AAA2相片標題022018-9-17BBBBB
資料表 table3
IDTITLETIMESNAME31新聞標題012018-10-16AAA2新聞標題022018-9-16BBBBB
資料表 table4
IDTITLETIMESNAME41檔案標題012018-10-15AAA2檔案標題022018-9-15BBBBB
我們只需要取得ID,TITLE跟TIMES這三個欄位數值即可,其他欄位不用顯在總表中!!

Xoops資料表語法

//先在function.php中加上以下的合併查詢功能

//合併資料表查詢

function mergetablewhile($table="",$tablenane="",$where="",$order="",$type=""){

global $xoopsDB;

foreach($table as $key=> $val){
$selectvar.="SELECT ".$tablenane." FROM ".$xoopsDB->prefix($val)." ".$where." …

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="true">&larr;</span>&…