[1012]PHP進階開發及TadTools工具應用

1. jQuery的用法

一、 講義直送您的電腦

  1. 講義:http://www.tad0616.net/modules/tad_book3/index.php?tbsn=26
  2. 請申請Dropbox(雲端磁碟機https://www.dropbox.com),一旦發布講義,您的電腦會馬上收到。(有帳號的可不用再申請)
  3. 您也可以直接連上Dropbox網站,只要有網路,都可直接下載教材。

二、 關於本課程

  1. 本課程是系列中的第五個學程,屬最高階部份,因此,有任何聽不懂的:拜託您問!
  2. 上課歡迎隨時起來走動,互相觀摩交流,盡量別保持安靜。飲食部份請至走廊食用。
  3. 上課時間為7:00~7:15,由於教室電腦是全部還原,故軟體需要每次都安裝一次,留15分鐘時間給各位裝軟體及發問。休息時間為8:10~8:30,課程於9:50結束。
  4. 上課要拍照、錄音、錄影都隨便您~~能和同學分享更好。
  5. 座位沒有強制性,但也不建議每次都換來換去,盡量於第三次上課後即固定座位。

三、 申請學生練習主機空間(http://163.26.52.243

  1. 學生練習主機為Linux主機,僅社大學員可以申請(FTP及MySQL帳號)。
  2. 若已經有了可不需再申請,當然要再申請一個新的也無妨。
  3. 使用期限為本學期,學期結束後,可能隨時會清除舊資料,故請自行備份。
  4. 申請後,您的網站網址為:「http://163.26.52.243/~帳號」
  5. 資料庫和FTP帳號、密碼是一樣的!

四、 務必學會FileZilla檔案傳輸軟體

  1. FTP用來把檔案傳到主機,FTP port為22(ssh加密通道)。
  2. 建議善用站台管理員,把常用的連線加入(此外,建議把樹狀目錄關閉)。


五、 開發工具:PSPad

  1. 可直接從163.26.52.243下載可攜版,裡面已經幫各位做好設定。
  2. 解壓縮後,直接執行pspad.exe即可。
  3. 請開啟「檢視→行號」。

六、 套用jquery

  1. 方法有二,一般法(離線意可用,但得自行更新版本):
    • (1)  先到 http://jquery.com/ 下載最新版檔案,如:jquery-1.8.1.min.js
    • (2)  然後再網頁或程式中引入該檔案即可:
    • <script type="text/javascript" src="jquery-1.8.1.min.js"></script>
  2. 直接連線法(需連線才能用,方便,可隨意切換版本):
    • (1) 直接遠端引用
    •  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
    • (2)  或是用Google的Loader:
    • <script type="text/javascript" src="https://www.google.com/jsapi"></script>
      <script type="text/javascript">
       google.load("jquery", "1.8.1");
       google.load("jqueryui", "1.7.2");
      </script>

七、 jquery基本用法

  1. 基本概念:什麼元件在什麼時候要做什麼事。
  2. <script type="text/javascript">
      $(document).ready(function(){
        //jquery語法
      });
    </script>
  3. $() 就是用來指定元件的挑選器(什麼元件), $(document) 或$()代表此網頁。
    • (1)  指定標籤:$("button")    →抓到的是→ <button>
    • (2)  指定id:$("#aa")→抓到的是→ id="aa"
    • (3)  指定class:$(".bb")→抓到的是→ class="bb"
  4. ready()是事件,事件中通常會執行某函數,因為函數大多只用一次,所以,通常直接在()中寫 function(){} 即可,不另外命名,稱之為匿名函數(或lambda函數)
  5. 完整事件或功能建議參考:http://www.css88.com/jqapi-1.7/

八、 jquery事件(event)用法

  1. 基本概念:什麼元件在什麼時候要做什麼事,底下以一些常用的事件為例。
    • (1)  click():點按時
    • (2)  change():值改變時

九、 jquery效果(Effects)

  1. 隱藏:$("#tbl").hide(); 顯示:$("#tbl").show();
  2. 滑下:$("#tbl").slideDown("slow"); 滑上:$("#tbl").slideUp("slow");
  3. 隱出:$("#tel").fadeOut("slow"); 隱入:$("#tel").fadeIn("slow");
  4. 加上CSS:$("#tbl").css("border","1px solid black");
  5. 套用class:$("body").addClass("girl");
  6. 移除class:$("body").removeClass();
  7. 加到裡面:$(".box").append("<b>嗨!</b>");
  8. 取值:$("input[name=my_name]").val();

十、 TadTools中呼叫jquery

  1. $jquery=get_jquery($ui=false,$mode="local",$theme='base');
  2. $ui:是否引入jquery ui
  3. $mode:引入方式,其值有:none(不引入jquery)、google(使用Google的jquery)、local(引入TadTools中的jquery)
  4. $theme:ui使用的佈景,有base和ui-lightness兩種。

 

[1012]PHP進階開發及TadTools工具應用

1-1 上課範例:index.html

<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>jquery測試</title>
  
  <script type="text/javascript" src="jquery-1.8.1.min.js"></script>
  
  <script type="text/javascript">
  $(document).ready(function(){
    $('#tbl').hide();

    $('.box').click(function(){
      $('#tbl').fadeIn('slow');
      $('.box').css("color","blue").css("font-size","2em");
    });

    $('button').click(function(){
      $('#tbl').fadeOut('slow');
      $('.box').css("color","red").css("font-size","1em");
    });

    $('#my_name').change(function(){
      $('.box').append("嗨!" + $('#my_name').val());
    });
    
  });
  </script>
  </head>
  <body>

  <div class='box'>
  點我填寫功能表
	</div>

  <table id='tbl'>
	<tr>
		<th>姓名</th>
		<td><input type="text" name="my_name" id="my_name"></td>
	</tr>

	<tr>
		<th>性別</th>
		<td>
			<input type="radio" name="sex" value="男" id="sex_b">男
			<input type="radio" name="sex" value="女" id="sex_g">女
		</td>
	</tr>

	<tr id="tel">
		<th>電話</th>
		<td><input type="text" name="my_tel" value="留個電話吧~"></td>
	</tr>

	<tr>
		<td colspan=2><button>關閉</button></td>
	</tr>
	</table>

  </body>
</html>

[1012]PHP進階開發及TadTools工具應用

2. 連動選單

一、 環境設定

  1. 使用jQuery中的.post()需要php,因此,需要在伺服器中運作。
  2. 請安裝XOOPS 2.5.5(http://120.115.2.90 Linux 基礎版程式包)
  3. 安裝contact通訊錄模組,本學期會以此模組為範例。

二、 引入TadTools工具
 

if(!file_exists(XOOPS_ROOT_PATH."/modules/tadtools/tad_function.php")){
 redirect_header("http://www.tad0616.net/modules/tad_uploader/index.php?of_cat_sn=50",3, "需要 tadtools 模組,可至<a href='http://www.tad0616.net/modules/tad_uploader/index.php?of_cat_sn=50' target='_blank'>Tad教材網</a>下載。");
}
include_once XOOPS_ROOT_PATH."/modules/tadtools/tad_function.php";


三、 TadTools中呼叫jquery

  1. $jquery=get_jquery($ui=false,$mode="local",$theme='base');
  2. $ui:是否引入jquery ui
  3. $mode:引入方式,其值有:none(不引入jquery)、google(使用Google的jquery)、local(引入TadTools中的jquery)
  4. $theme:ui使用的佈景,有base和ui-lightness兩種。

四、 何謂連動選單?

  1. 使用者選取A選單,B選單位根據A選單的值,自動產生相關選項。例如縣市選單,選擇「台南市」之後,第二個選單可能會出現「永康區、新營區...等」;若選擇「新北市」第二個選單則出現「淡水區、八里區...等」。
  2. 換言之,我們必須能知道選單A何時異動了→$("#A").change()
  3. 使用者選了A選單的什麼值→$("#A").val()
  4. 然後,將A選單的值送給程式去運算→$.post()
  5. 最後,把運算的結果,塞回選單B→$('#B').html(data);

五、 jQuery的.post()與.get()
 

  $(document).ready(function(){
    $.post('ajax.php',  {op: 'get_menu' , menu1: '台南市'} , function(data) {
      $('#menu2').html(data);
    });
  });

 

  1. ajax.php:背後運算的程式
  2. {op: 'get_menu' , menu1: '台南市'}:帶參數給ajax.php,ajax.php會接收到「$_POST['op']="get_menu"」及「$_POST['menu1']="台南市"」兩個值。
  3. 若是要傳送陣列:{ 'county[]': ["台南市", "新北市"] }
  4. function(data) {}:就是把menu.php的運算結果「data」套用到某些動作中。
  5. $('#menu2').html(data):把運算結果「data」放入id="menu2"的網頁元件中。

六、 jQuery的.change ()事件
 

$('#menu1').change(function(){
  //當id="menu1"的網頁元件有變動時,要做些什麼事
});


七、 jQuery的.val ()方法

  1. $('#menu1').val()可以取得id="menu1"的網頁元件的值。
  2. $('#menu1').val('xxx')可以設定id="menu1"的網頁元件的值。

[1012]PHP進階開發及TadTools工具應用

2-1 上課範例:admin/index.php

<?php
//  ------------------------------------------------------------------------ //
// 本模組由 tad 製作
// 製作日期:2012-09-12
// $Id:$
// ------------------------------------------------------------------------- //

/*-----------引入檔案區--------------*/
include_once "header_admin.php";

/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();

	$main="
	$jquery
	
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
  });
  </script>
	
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' ></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' ></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email' ></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' ></td></tr>

	<!--郵遞區號-->
	<tr><td class='title' nowrap>郵遞區號</td>
	<td class='col'><input type='text' name='zip' size='20' value='{$zip}' id='zip' ></td></tr>

	<!--縣市-->
	<tr><td class='title' nowrap>縣市</td>
	<td class='col'><input type='text' name='county' size='20' value='{$county}' id='county' ></td></tr>

	<!--鄉鎮市區-->
	<tr><td class='title' nowrap>鄉鎮市區</td>
	<td class='col'><input type='text' name='city' size='20' value='{$city}' id='city' ></td></tr>

	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'><input type='text' name='addr' size='20' value='{$addr}' id='addr' ></td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";


		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td>{$cate[$gsn]['title']}</td>
			<td>{$name}</td>
			<td>{$tel}</td>
			<td>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			$fun
		</tr>
		";
	}

	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

2-2 上課範例:admin/ajax.php

<?php
include_once "header_admin.php";

$parent_gsn=empty($_POST['parent_gsn'])?0:$_POST['parent_gsn'];

echo get_cate_options($parent_gsn);


function get_cate_options($parent_gsn){
	global $xoopsDB ;
	
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '$parent_gsn' order by `sort`";
	
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		$main.="<option value='$gsn'>{$title}</option>";
	}
	return $main;
}
?>

[1012]PHP進階開發及TadTools工具應用

3. 郵遞區號地址

一、 TWzipcode官網:http://app.essoduke.org/twzipcode

  1. 用途:可輸入郵遞區號,會自動生出縣市及鄉鎮市區,反之亦可。
  2. 最新版為1.4.1有自動偵測功能,本例為1.3.1(有修改成可結合表單驗證程式),javascript部份設定(需先引入jquery):
  3. <script language='javascript' src='class/twzipcode-1.3.1.js'></script>
    <script type='text/javascript'>
      $(document).ready(function() {
        $('#AddrForm').twzipcode({
          countyName: '縣市欄位的name',
          areaName: '鄉鎮市區欄位的name',
          zipName: '郵遞區號欄位的name',
          countySel: '$縣市預設值',
          areaSel: '$鄉鎮市區預設值',
          zipSel: '$郵遞區號預設值',
          zipReadonly: false
        });
      });
    </script>
  4. 表單部份:
  5. <div style='position:relative;'>
     <span id='AddrForm'></span>
     <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
    </div>

二、 用選單切換內容

  1. 利用下拉選單,選擇後,內容立即做出改變(不換頁)
  2. 先處理一下表格,在要呈現內容的地方改為<tbody id='contact_list'></tbody>
  3. 然後利用jquery的$.post()方法把相關內容給抓出來,並塞到contact_list中。
  4. $('#menu2').change(function(){
        $.post('ajax.php' , {op: contact_list , gsn: $('#menu2').val()} , function(data){
            $('#contact_list').html(data);
        });
    });
  5. ajax.php裡可以根據op去執行相關函數,以抓出表格通訊錄內容。
  6. $gsn=empty($_POST['gsn'])?0:$_POST['gsn'];
    $op=empty($_POST['op'])?'':$_POST['op'];
    
    switch($op){
        case "contact_list":
        echo contact_list($gsn);
        break;
    }
    
    function contact_list($gsn=''){
        //根據$gsn去資料庫撈出相關資料,基本上就是index.php的list_contact()函數內容
    }
  7. 一切換完選單就立即抓出資料:
  8. $('#menu1').change(function(){
        $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
            $('#menu2').html(data);
            $.post('ajax.php' , {op: 'contact_list' , gsn: $('#menu2').val()} , function(data){
                $('#contact_list').html(data);
            });
        });
    });

 

[1012]PHP進階開發及TadTools工具應用

3-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";

/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();

	$main="
	$jquery
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' ></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' ></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email' ></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' ></td></tr>


	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";


		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td>{$cate[$gsn]['title']}</td>
			<td>{$name}</td>
			<td>{$tel}</td>
			<td>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			$fun
		</tr>
		";
	}

	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

3-2 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}


		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td>{$cate[$gsn]['title']}</td>
			<td><a href='index.php?sn=$sn'>{$name}</a></td>
			<td>{$tel}</td>
			<td>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip} {$county}{$city}{$addr}</td>
		</tr>
		";
	}
	
	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	
	<script type='text/javascript'>
  $(document).ready(function(){
  
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });


  });
  </script>
  
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);

	$data="
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

3-3 上課範例:ajax.php

<?php
include_once "header.php";

$parent_gsn=empty($_POST['parent_gsn'])?0:$_POST['parent_gsn'];

echo get_cate_options($parent_gsn);


function get_cate_options($parent_gsn){
	global $xoopsDB ;

	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '$parent_gsn' order by `sort`";

	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		$main.="<option value='$gsn'>{$title}</option>";
	}
	return $main;
}
?>

[1012]PHP進階開發及TadTools工具應用

4. 點擊編輯

一、  jeditable:http://www.appelsiini.net/projects/jeditable

  1. 此外掛可用來做「點擊編輯」的功能,是相當直覺的修改工具。
  2. 支援「文字輸入框」、「大量文字框」、「下拉選單」等三種表單元件。

二、 基本用法

<div class="edit" id='div1'>文字輸入框</div>
<div class="edit_select" id='div2'>下拉選單</div>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.jeditable.js"></script>
<script type="text/javascript">
 $(document).ready(function() {
     $('.edit').editable('save.php');
     $('.edit_select').editable('save.php', {
         type      : 'select',
         cancel    : '取消',
         submit    : '儲存',
         indicator : '<img src="img/indicator.gif">'
     });
 });
</script>
  1. 將欲修改的元件設定一個class,id則是會送出給php當作變數名稱(類似name)
  2. 設定一個用來進行儲存的PHP檔,基本的寫法像這樣:
  3. 您也可以設定各種參數(均非必要)
    • type : 'text', //設定表單類型,可以是 text、textarea、select
    • indicator : 'Saving...', //儲存時呈現的文字或圖片
    • tooltip : '點此進行編輯...', //提示文字
    • loadurl : 'json.php', //預先載入的選項
    • cssclass : 'someclass', //套用CSS樣式(套用在form,而非輸入框)
    • style : 'display: inline', //直接套用樣式(套用在form,而非輸入框)
    • width: '100px', //表單元件寬度;height: '40px', //表單元件高度
    • cancel : '取消', //取消鈕;submit : '儲存', //送出鈕(沒設表示不用按鈕)
    • onblur:'submit', //離開表單元件時要進行的動作(還有cancel , ignore)
    • event: 'click', //進入編輯狀態的事件(如:dblclick,所有jquery事件均可)
    • submitdata : {op: 'save_area' , sn : '100'}, //額外參數
    • data : {'boy':'男生' , 'girl':'女生'}, //下拉選單選項,左為值,右為呈現選項
    • placeholder : '點選編輯', //預設呈現內容(當該元件內容為空時才呈現)
  4. save.php會接收到該元件的id值($_POST['id'])及輸入的值($_POST['value'] ),若有submitdata,則會順便送出submitdata裡面設定的參數及值。
  5. 此外,save.php所echo的值會出現在該元件中。

三、 TadTools中的用法

include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
$file="save.php";
$jeditable = new jeditable();
$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生' , 'selected':'girl'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
$jeditable_set=$jeditable->render();
  1. 先引入jeditable.php,再設定儲存檔$save_file
  2. 把$jeditable_set放到表單前(或主內容之前即可)

[1012]PHP進階開發及TadTools工具應用

4-1 上課範例:index.html

<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>jquery測試</title>

  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
  <script type="text/javascript" src="jquery.jeditable.js"></script>
  
	<script type="text/javascript">
   $(document).ready(function() {
       $('#div1').editable('save.php',{
          type:'text',
          width:'400px',
          submitdata : {op: 'save' , sn : '100'},
          onblur: 'submit'
       });
       
       $('#div2').editable('save.php',{
          type:'textarea',
          width:'400px',
          height:'350px',
          submit:'儲存'
       });
   });
	</script>

  </head>
  <body>
  
  <h1 id='div1'>工作專心好困難? 日研究:可愛事物助提高效率</h1>
  <div id='div2'>不少人工作時,手上事務還沒做完,新任務卻又不斷湧進,心中煩躁指數逼近爆表,有些人則是抵擋不住臉書(Facebook)、YouTube、Plurk等網站的誘惑,對於無法專心工作感到困擾,所幸日本一項最新研究指出,只要觀看「可愛動物照」就能提高注意力。

日本廣島大學研究小組找來130名大學生進行實驗,第一組負責以鑷子從小孔中取出零件,且過程中不能觸碰到小孔邊緣,第二組對象則必須在數列中找出指定的數字,此2項實驗分別測試2次。

研究人員將學生分成3組,在第一次和第二次測試間分別觀看「小貓小狗」、「大貓大狗」、「食物」的照片。實驗結果發現,觀看「小貓小狗」這組照片者除了準確度提高,取零件速度也增加44%,找數字的速度則提高16%。

研究人員稱,可能是人們感到「可愛」時,會希望接近對方並詳細了解,進而產生集中注意力的效果,因此日常生活或工作場所適當擺放可愛物體,或許能夠提高工作效率。</div>

  </body>
</html>

[1012]PHP進階開發及TadTools工具應用

4-2 上課範例:save.php

<?php
//var_dump($_POST);
//var_export($_POST);

//update到資料庫

echo $_POST['value'];
?>

[1012]PHP進階開發及TadTools工具應用

4-3 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";

/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();

	$main="
	$jquery
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' ></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' ></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email' ></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' ></td></tr>


	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

4-4 上課範例:admin/save.php

<?php
include_once "header_admin.php";

$sn=intval($_POST['sn']);

$sql="update `".$xoopsDB->prefix("contact")."` set `{$_POST['col']}` = '{$_POST['value']}' where sn = '$sn'";
$xoopsDB->queryF($sql) ;

echo $_POST['value'];
?>

 

[1012]PHP進階開發及TadTools工具應用

5. 表單驗證

一、 jQuery Validation Engine

  1. 官方網站:http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/
  2. 簡單、好用,功能強大的表單檢查外掛。

二、 基本套用方法
 

<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery.validationEngine-en.js" type="text/javascript"></script>
<script src="js/jquery.validationEngine.js" type="text/javascript"></script>
<link rel="stylesheet" href="css/validationEngine.jquery.css" type="text/css"/>
<script type="text/javascript">
 $(document).ready(function() {
     $('#myform').validationEngine();
 });
</script>
<form id="myform">
  <input type="text" name="xx" id="xx" class="validate[required]">
</form>


三、 TadTools套用方法

include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
$formValidator= new formValidator("#myForm",false);
$formValidator_code=$formValidator->render();
  1. 最後把$formValidator_code放到<form id="myform">之前即可。
  2. formValidator("#myForm",false) 第一個參數為表單的挑選器,第二個為是否引入jquery(若之前已有引入jquery則可填入false,預設為true)。

四、 常用參數

<input type='text' name='num' id='num' class='validate[required,min[1],max[10]]'>
  1. equals[field.id]:等於某欄位
  2. min[float]:最小值、max[float]:最大值
  3. minSize[integer]:最小字數、maxSize[integer]:最大字數
  4. past[NOW or a date]:日期是否小於指定日期
  5. future[NOW or a date]:日期是否大於指定日期
  6. minCheckbox[integer]:至少要選幾個、maxCheckbox[integer]:最多選幾個

五、 格式驗證

<input type="text" name="mail" id="mail" class="validate[required ,custom[email]]">
  1. phone:電話
  2. url:網址
  3. email:Email
  4. date:日期 YYYY-MM-DD
  5. number:數字,如:-143.22 or .77 but also +234,23
  6. integer:整數,如:-635 +2201 738
  7. ipv4:IP,如:127.0.0.1
  8. onlyNumber:僅數字、onlyNumberSp:僅數字及空白
  9. onlyLetter:僅字元、onlyLetterSp:僅字元及空白
  10. onlyLetterNumber:僅字元和數字,無空白
  11. onChineseSp:只能用中文字及空白,不能用特殊符號、數字、英文
  12. onChinese:只能用中文字,不能用特殊符號、數字、英文及空白

 

[1012]PHP進階開發及TadTools工具應用

5-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";

/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' class='validate[required,custom[date],future[NOW]]'></td></tr>


	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

5-2 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	
	<script type='text/javascript'>
  $(document).ready(function(){
  
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });

    $('#menu2').change(function(){
      contact_list();
    });

  });
  
  //去抓該分類的通訊錄
  function contact_list(){
    $.post('ajax.php' , {gsn: $('#menu2').val()} , function(data){
      $('#contact_list').html(data);
    });
  }
  </script>
  
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody id='contact_list'>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);

	$data="
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

5-3 上課範例:ajax.php

<?php
include_once "header.php";

$parent_gsn=empty($_POST['parent_gsn'])?0:intval($_POST['parent_gsn']);
$gsn=empty($_POST['gsn'])?0:intval($_POST['gsn']);

if(!empty($gsn)){
  echo get_contact($gsn);
}else{
  echo get_cate_options($parent_gsn);
}

function get_cate_options($parent_gsn){
	global $xoopsDB ;

	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '$parent_gsn' order by `sort`";

	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		$main.="<option value='$gsn'>{$title}</option>";
	}
	return $main;
}

//取得該分類下的通訊錄資料
function get_contact($gsn){
	global $xoopsDB ;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where gsn='$gsn'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}


		$cate=get_contact_cate_all();

		$all_content.="
		<tr>
			<td>{$cate[$gsn]['title']}</td>
			<td><a href='index.php?sn=$sn'>{$name}</a></td>
			<td>{$tel}</td>
			<td>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip} {$county}{$city}{$addr}</td>
		</tr>
		";
	}
	return $all_content;
}
?>

[1012]PHP進階開發及TadTools工具應用

6. 表格拉動排序

一、 關於jQuery UI

  1. sortable是jQuery UI(http://jqueryui.com)內建的功能之一,換言之,要使用之,必須引入jQuery UI才行。
  2. 此外,jQuery UI還有Draggable、Droppable、Resizable、Selectable等互動功能,並提供了許多佈景、效果(Effects)以及現成的小工具(Widgets)

二、 使用拉動排序的方法

  1. 利用$jquery=get_jquery(true);載入jQuery UI
  2. 在輸出畫面之前載入相關jQuery設定(http://api.jqueryui.com/sortable
    $jquery
    <script type='text/javascript'>
    $(document).ready(function(){
        $('#sort').sortable({ opacity: 0.6, cursor: 'move', update: function() {
            var order = $(this).sortable('serialize');
            $.post('save_sort.php', order, function(theResponse){
                $('#save_msg').html(theResponse);
            });
        }
        });
    });
    </script>
    • (1)  opacity:用來設定拉動時的透明度,其值從0.01 到 1。
    • (2)  cursor:拉動時,滑鼠游標形狀設定
  3. 把欲排序的表格範圍加上<tbody id='sort' >欲排序的表格</tbody>
  4. 將<tbody>中的每一個<tr>加上id,格式如:「名稱_編號」,例如:<tr id='tr_{$gsn}'>,如此,$(this).sortable('serialize') 就會將id拆解成變數名稱及值,亦即用$.post()送出後,php檔案會接收到$_POST['tr']的陣列,其值就是$gsn。
  5. 負責儲存排序的PHP檔(save_sort.php):
  6. <?php
    include_once "header_admin.php";
    $sort = 1;
    foreach ($_POST['tr'] as $gsn) {
      $sql="update ".$xoopsDB->prefix("contact_cate")." set `sort`='{$sort}' where `gsn`='{$gsn}'";
      $xoopsDB->queryF($sql) or die("更新失敗! (".date("Y-m-d H:i:s").")");
      $sort++;
    }
    
    echo "排序完成! (".date("Y-m-d H:i:s").")";
    ?>
  7. 加入<div id='save_msg'></div>到表格頁面,以呈現處理結果訊息。
  8. 必要時可以加入 圖檔以清楚告知選項可拉動。
  9. <img src='".XOOPS_URL."/modules/tadtools/treeTable/images/updown_s.png' style='cursor: s-resize;margin:0px 4px;' alt='拉動排序' title='拉動排序'>


 

[1012]PHP進階開發及TadTools工具應用

6-1 上課範例:admin/cate.php

<?php
/*-----------引入檔案區--------------*/
include_once "header_admin.php";

/*-----------function區--------------*/
//contact_cate編輯表單
function contact_cate_form($gsn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($gsn)){
		$DBV=get_contact_cate($gsn);
	}else{
		$DBV=array();
	}

	//預設值設定


	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?$gsn:$DBV['gsn'];

	//設定「title」欄位預設值
	$title=(!isset($DBV['title']))?null:$DBV['title'];

	//設定「parent_gsn」欄位預設值
	$parent_gsn=(!isset($DBV['parent_gsn']))?null:$DBV['parent_gsn'];

	//設定「sort」欄位預設值
	$sort=(!isset($DBV['sort']))?contact_cate_max_sort():$DBV['sort'];

	$op=(empty($gsn))?"insert_contact_cate":"update_contact_cate";


	$main="
	<form action='{$_SERVER['PHP_SELF']}' method='post'>
	<table class='form_tbl'>

	<!--群組名稱-->
	<tr><td class='title' nowrap>群組名稱</td>
	<td class='col'><input type='text' name='title' size='20' value='{$title}' id='title' ></td></tr>

	<!--父群組-->
	<tr><td class='title' nowrap>父群組</td>
	<td class='col'>
	<select name='parent_gsn' size=1 >
		<option value='' ".chk($parent_gsn,'','1','selected')."></option>
		".get_contact_cate_options('edit' , $gsn , $parent_gsn )."
	</select>
	</td></tr>

	<!--排序-->
	<tr><td class='title' nowrap>排序</td>
	<td class='col'><input type='text' name='sort' size='20' value='{$sort}' id='sort'></td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--群組編號-->
    	<input type='hidden' name='gsn' value='{$gsn}'>
			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("群組設定",$main,"raised");

	return $main;
}


//自動取得contact_cate的最新排序
function contact_cate_max_sort(){
	global $xoopsDB;
	$sql = "select max(`sort`) from `".$xoopsDB->prefix("contact_cate")."`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	list($sort)=$xoopsDB->fetchRow($result);
	return ++$sort;
}


//新增資料到contact_cate中
function insert_contact_cate(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();


	$sql = "insert into `".$xoopsDB->prefix("contact_cate")."`
	(`title` , `parent_gsn` , `sort`)
	values('{$_POST['title']}' , '{$_POST['parent_gsn']}' , '{$_POST['sort']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$gsn = $xoopsDB->getInsertId();
	return $gsn;
}

//更新contact_cate某一筆資料
function update_contact_cate($gsn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();


	$sql = "update `".$xoopsDB->prefix("contact_cate")."` set
	 `title` = '{$_POST['title']}' ,
	 `parent_gsn` = '{$_POST['parent_gsn']}' ,
	 `sort` = '{$_POST['sort']}'
	where `gsn` = '$gsn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	return $gsn;
}




//刪除contact_cate某筆資料資料
function delete_contact_cate($gsn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact_cate")."` where `gsn` = '{$gsn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}




//取得contact_cate無窮分類列表
function list_contact_cate_loop($show_function=1 , $parent_gsn=0 , $i=0){
	global $xoopsDB , $xoopsModule;

	$MDIR=$xoopsModule->getVar('dirname');

	$sql = "select * from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$parent_gsn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$function_title=($show_function)?"<th>功能</th>":"";
	$prefix=str_repeat("----",$i);
	$i++;

	$data="";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $gsn , $title , $parent_gsn , $sort
		foreach($all as $k=>$v){
			$$k=$v;
		}
		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_cate_form&gsn=$gsn'><img src='".XOOPS_URL."/modules/{$MDIR}/images/edit.gif' alt='編輯'></a>
		<a href=\"javascript:delete_contact_cate_func($gsn);\"><img src='".XOOPS_URL."/modules/{$MDIR}/images/del.gif' alt='刪除'></a>
		</td>":"";
		
		
		$data.="
		<tr id='tr_{$gsn}'>
		<td>{$prefix}<a href='{$_SERVER['PHP_SELF']}?gsn={$gsn}'>{$title}</a> <img src='".XOOPS_URL."/modules/tadtools/treeTable/images/updown_s.png' style='cursor: s-resize;margin:0px 4px;' alt='拉動排序' title='拉動排序'> ({$sort})</td>
		$fun
		</tr>";

		$data.=list_contact_cate_loop($show_function,$gsn,$i);
	}

	if($parent_gsn!='0'){
		return $data;
	}else{
	
		$jquery=get_jquery(true);
	
		$main="
		$jquery
    <script type='text/javascript'>
    $(document).ready(function(){
        $('#sort').sortable({ opacity: 0.6, cursor: 'move', update: function() {
            var order = $(this).sortable('serialize');
            $.post('save_sort.php', order, function(theResponse){
                $('#save_msg').html(theResponse);
            });
        }
        });
    });

		function delete_contact_cate_func(gsn){
			var sure = window.confirm('確定要刪除此資料?');
			if (!sure)	return;
			location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact_cate&gsn=\" + gsn;
		}
		</script>
		
    <div id='save_msg' style='margin:10px auto;'></div>

    <table summary='list_table' id='tbl' style='width:100%;'>
		<tr>
		<th nowrap>群組名稱</th>
		$function_title</tr>
		<tbody id='sort'>
		$data
		</tbody>
		<tr>
		<td colspan=6 class='bar'>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_cate_form'><img src='".XOOPS_URL."/modules/{$MDIR}/images/add.gif' alt='"._BP_ADD."' align='right'></a>
		{$bar}</td></tr>
		</table>";

		//raised,corners,inset
		$main=div_3d("",$main,"corners");

	}

	return $main;
}

//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

  //新增資料
  case "insert_contact_cate":
  $gsn=insert_contact_cate();
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //更新資料
  case "update_contact_cate":
  update_contact_cate($gsn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_cate_form":
  $main=contact_cate_form($gsn);
  break;

  //刪除資料
  case "delete_contact_cate":
  delete_contact_cate($gsn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact_cate_loop();
  break;

	
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,1);

?>

 

[1012]PHP進階開發及TadTools工具應用

6-2 上課範例:admin/save_sort.php

<?php
include_once "header_admin.php";

$sort = 1;
foreach($_POST['tr'] as $gsn) {
  $sql="update ".$xoopsDB->prefix("contact_cate")." set `sort`='{$sort}' where `gsn`='{$gsn}'";
  $xoopsDB->queryF($sql) or die("更新失敗! (".date("Y-m-d H:i:s").")");
  $sort++;
}

echo "排序完成! (".date("Y-m-d H:i:s").")";
?>

[1012]PHP進階開發及TadTools工具應用

7. 整合型上傳工具

一、 整合型上傳工具

  1. 這是由底下幾個工具所組成的一個PHP工具,可用在大部分需要檔案上傳的地方。

二、 使用方式

  1. 把 up_file.php 複製到模組下,並修改define("_MODDIR","contact");
  2. 建立資料表contact_files_center,xxx為模組名稱(重要!)
  3. 在用到上傳的檔案,加入此行:include_once "up_file.php";
  4. 在上傳的表單前加入底下引入相關檔案的語法:
  5. <script src='".TADTOOLS_URL."/jquery/jquery.js'></script>
    <script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
  6. 在上傳的表單加入屬性:enctype='multipart/form-data'
  7. 在上傳的表單加入上傳欄位:
    <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
    list_del_file($col_name,$col_sn)."
    • (1)  name和class請勿修改!!
    • (2)  maxlength就是指最多可以上傳幾個檔,不設代表無限制。
    • (3)  accept用來指定上傳的附檔名,用「|」隔開,不設代表無限制。
    • (4)  list_del_file() 函數用來取出該資料已上傳的檔案,以供使用者刪除
    • (5)  $col_name:用來判斷此檔案要依附在什麼資料上,一般是流水號的名稱
    • (6)  $col_sn:該資料對應的直,一般是流水號的直
    • (7)  以通訊錄來說,若是希望可以上傳通訊錄上使用者的相片,$col_name可設為「contact_sn」,接著就看該使用者的$contact_sn是多少指定給$col_sn即可。
  8. 在儲存或更新的函數中加入上傳函數($width 為主圖大小,$thumb_width為縮圖寬度,若有$files_sn表示是要更新,而非新增,$name預設為「upfile」,若有第二組上傳框,可自訂別的 name):
  9. upload_file($col_name , $col_sn , $width , $name , $sort ,$thumb_width , $files_sn);
  10. 顯示某資料下的所有檔案(前兩個參數為必填)
    //欄位 , 編號 , 是否縮圖 , 顯示模式 (空、filename、num) ,顯示描述,顯示下載次數
    show_files($col_name , $col_sn , true , ”” , false , false);
    • (1)  顯示模式預設為空,即以圖示方式來呈現
    • (2)  顯示模式為 filename 時,會條列出檔名
    • (3)  顯示模式為 num 時,會列出有多少附檔(數字)
  11. 秀出檔一個檔案或圖檔:($showkind為呈現模式預設是主圖,thumb為縮圖)
  12. get_pic_file($col_name , $col_sn , $sort , $showkind)
  13. 刪除資料時,在刪除資料的函數中,加入刪除檔案函數(僅$files_sn即可,或同時用$col_name , $col_sn也行):
  14. del_files($files_sn , $col_name , $col_sn);
  15. 檔案數量:
    get_file_amount($col_name , $col_sn);
     

 

[1012]PHP進階開發及TadTools工具應用

7-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

7-2 上課範例:up_file.php

<?php
//version 1.0
//2012-10-18
//設定模組目錄名稱
define("_MODDIR","contact");


/*
include_once("up_file.php");

表單: enctype='multipart/form-data'

<script src='" . TADTOOLS_URL . "/jquery/jquery.js'></script>
<script src='" . TADTOOLS_URL . "/multiple-file-upload/jquery.MultiFile.js'></script>
<input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".list_del_file("news_sn", $news_sn)."

儲存:upload_file($col_name, $col_sn, $width);

顯示:show_files($col_name, $col_sn,true,false,false,false);  //是否縮圖 , 顯示模式 filename、num , 顯示描述 , 顯示下載次數

單一相片:get_pic_file($col_name="", $col_sn="", $name="" , $sort="", $showkind="images")


刪除:del_files($files_sn, $col_name, $col_sn);

檔案數量:get_file_amount($col_name="", $col_sn="");


種類:img,file
資料表:
CREATE TABLE `files_center` (
  `files_sn` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '檔案流水號',
  `col_name` varchar(255) NOT NULL COMMENT '欄位名稱',
  `col_sn` smallint(5) unsigned NOT NULL COMMENT '欄位編號',
  `sort` smallint(5) unsigned NOT NULL COMMENT '排序',
  `kind` enum('img' , 'file') NOT NULL COMMENT '檔案種類',
  `file_name` varchar(255) NOT NULL COMMENT '檔案名稱',
  `file_type` varchar(255) NOT NULL COMMENT '檔案類型',
  `file_size` int(10) unsigned NOT NULL COMMENT '檔案大小',
  `description` text NOT NULL COMMENT '檔案說明',
  `counter` mediumint(8) unsigned NOT NULL COMMENT '下載人次',
  PRIMARY KEY (`files_sn`)
) ENGINE=MyISAM COMMENT='檔案資料表';
*/


//檔案中心實體位置
define("_FILES_CENTER_DIR",XOOPS_ROOT_PATH."/uploads/"._MODDIR . "/file");
define("_FILES_CENTER_URL",XOOPS_URL."/uploads/"._MODDIR . "/file");
//檔案中心圖片實體位置
define("_FILES_CENTER_IMAGE_DIR",XOOPS_ROOT_PATH."/uploads/"._MODDIR . "/image");
define("_FILES_CENTER_IMAGE_URL",XOOPS_URL."/uploads/"._MODDIR . "/image");
//檔案中心縮圖實體位置
define("_FILES_CENTER_THUMB_DIR",XOOPS_ROOT_PATH."/uploads/"._MODDIR . "/image/.thumbs");
define("_FILES_CENTER_THUMB_URL",XOOPS_URL."/uploads/"._MODDIR . "/image/.thumbs");

//上傳圖檔,$col_name=對應欄位名稱, $col_sn=對應欄位編號, $種類:img,file, $sort=圖片排序, $files_sn="更新編號"
function upload_file($col_name="", $col_sn="", $main_width="",$upfile='upfile', $sort="", $thumb_width="90", $files_sn=""){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  //引入上傳物件
  include_once TADTOOLS_PATH."/upload/class.upload.php";

  //取消上傳時間限制
  set_time_limit(0);
  //設置上傳大小
  ini_set('memory_limit', '80M');


  //刪除勾選檔案
  if(!empty($_POST['del_file'])){
  foreach($_POST['del_file'] as $del_files_sn){
      del_files($del_files_sn);
    }
  }

  $files = array();
  foreach ($_FILES[$upfile] as $k => $l) {
    foreach ($l as $i => $v) {
      if (!array_key_exists($i, $files)){
      $files[$i] = array();
        }
      $files[$i][$k] = $v;
    }
  }

  foreach ($files as $file) {
    //先刪除舊檔
    if(!empty($files_sn)){
      del_files($files_sn);
    }

    //自動排序
    if(empty($sort)){
      $sort=auto_sort($col_name, $col_sn);
    }

    //取得檔案
    $file_handle = new upload($file,"zh_TW");

    if ($file_handle->uploaded) {
      //取得副檔名
      $ext=strtolower($file_handle->file_src_name_ext);
      //判斷檔案種類
      if($ext=="jpg" or $ext=="jpeg" or $ext=="png" or $ext=="gif"){
        $kind="img";
      }else{
        $kind="file";
      }

      $file_handle->file_safe_name = false;
      $file_handle->file_overwrite = true;
      $file_handle->file_new_name_body   = "{$col_name}_{$col_sn}_{$sort}";
      //若是圖片才縮圖
      if($kind=="img"){
        if($file_handle->image_src_x > $main_width){
          $file_handle->image_resize     = true;
          $file_handle->image_x        = $main_width;
          $file_handle->image_ratio_y     = true;
        }
      }
      $path=($kind=="img")?_FILES_CENTER_IMAGE_DIR:_FILES_CENTER_DIR;
      $file_handle->process($path);
      $file_handle->auto_create_dir = true;


      //若是圖片才製作小縮圖
      if($kind=="img"){
        $file_handle->file_safe_name = false;
        $file_handle->file_overwrite = true;
        $file_handle->file_new_name_body   = "{$col_name}_{$col_sn}_{$sort}";
        if($file_handle->image_src_x > $thumb_width){
          $file_handle->image_resize     = true;
          $file_handle->image_x        = $thumb_width;
          $file_handle->image_ratio_y     = true;
        }
        $file_handle->process(_FILES_CENTER_THUMB_DIR);
        $file_handle->auto_create_dir = true;
      }


      //上傳檔案
      if ($file_handle->processed) {
        $file_handle->clean();
        $file_name="{$col_name}_{$col_sn}_{$sort}.{$ext}";

        if(empty($files_sn)){
          $sql = "insert into ".$xoopsDB->prefix(_MODDIR . "_files_center")." (`col_name` , `col_sn` , `sort` , `kind` , `file_name` , `file_type` , `file_size` , `description`) values('$col_name' , '$col_sn' , '$sort' , '{$kind}' , '{$file_name}' , '{$file['type']}' , '{$file['size']}' , '{$file['name']}')";
          $xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
        }else{
          $sql = "replace into ".$xoopsDB->prefix(_MODDIR . "_files_center")." (`files_sn` , `col_name` , `col_sn` , `sort` , `kind` , `file_name` , `file_type` , `file_size` , `description`) values('{$files_sn}' , '$col_name' , '$col_sn' , '$sort' , '{$kind}' , '{$file_name}' , '{$file['type']}' , '{$file['size']}' , '{$file['name']}')";
          $xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
        }
      } else {
        redirect_header($_SERVER['PHP_SELF'],3, "Error:".$file_handle->error);
      }
    }
    $sort="";
  }
}


//刪除實體檔案
function del_files($files_sn="", $col_name="", $col_sn="", $sort=""){
  global $xoopsDB, $xoopsUser;

  if(!empty($files_sn)){
    $del_what="`files_sn`='{$files_sn}'";
  }elseif(!empty($col_name) and !empty($col_sn)){
    $and_sort=(empty($sort))?"":"and `sort`='{$sort}'";
    $del_what="`col_name`='{$col_name}' and `col_sn`='{$col_sn}' $and_sort";
  }

  $sql = "select * from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where $del_what";
  $result=$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error()."<br>".$sql);

  while(list($files_sn, $col_name, $col_sn, $sort, $kind, $file_name, $file_type, $file_size, $description)=$xoopsDB->fetchRow($result)){
    $del_sql = "delete  from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where files_sn='{$files_sn}'";
    $xoopsDB->queryF($del_sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

    if($kind=="img"){
      unlink(_FILES_CENTER_IMAGE_DIR . "/$file_name");
      unlink(_FILES_CENTER_THUMB_DIR . "/$file_name");
    }else{
      unlink(_FILES_CENTER_DIR . "/$file_name");
    }
  }
}


//取得檔案 $kind=images(大圖),thumb(小圖),$mode=link(完整連結)or array(路徑陣列)
function get_file($col_name="", $col_sn="", $sort=""){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  $and_sort=(!empty($sort))?" and `sort`='{$sort}'":"";

  $sql = "select * from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `col_name`='{$col_name}' and `col_sn`='{$col_sn}' $and_sort order by sort";

  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  while($all=$xoopsDB->fetchArray($result)){
    //以下會產生這些變數: $files_sn, $col_name, $col_sn, $sort, $kind, $file_name, $file_type, $file_size, $description
    foreach($all as $k=>$v){
      $$k=$v;
    }

    $files[$files_sn]['kind']=$kind;
    $files[$files_sn]['sort']=$sort;
    $files[$files_sn]['file_name']=$file_name;
    $files[$files_sn]['file_type']=$file_type;
    $files[$files_sn]['file_size']=$file_size;
    $files[$files_sn]['counter']=$counter;
    $files[$files_sn]['description']=$description;

    if($kind=="img"){
      $pic_name=(file_exists(_FILES_CENTER_IMAGE_DIR . "/{$file_name}"))?_FILES_CENTER_IMAGE_URL."/{$file_name}":TADTOOLS_URL."/multiple-file-upload/no_thumb.gif";
      $thumb_pic=(file_exists(_FILES_CENTER_THUMB_DIR . "/{$file_name}"))?_FILES_CENTER_THUMB_URL."/{$file_name}":TADTOOLS_URL."/multiple-file-upload/no_thumb.gif";
      $files[$files_sn]['link']="<a href='{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn' title='{$description}' rel='lytebox'><img src='{$pic_name}' alt='{$description}' title='{$description}' rel='lytebox'></a>";
      $files[$files_sn]['path']=$pic_name;
      $files[$files_sn]['url']="<a href='{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn' title='{$description}' target='_blank'>{$description}</a>";
      $files[$files_sn]['tb_link']="<a href='{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn' title='{$description}' rel='lytebox'><img src='$thumb_pic' alt='{$description}' title='{$description}'></a>";
      $files[$files_sn]['tb_path']=$thumb_pic;
      $files[$files_sn]['tb_url']="<a href='{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn' title='{$description}' rel='lytebox'>{$description}</a>";
    }else{
      $files[$files_sn]['link']="<a href='{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn'>{$description}</a>";
      $files[$files_sn]['path']="{$_SERVER['PHP_SELF']}?fop=dl&files_sn=$files_sn";
    }
  }
  return $files;
}


//取得單一圖片 $kind=images(大圖),thumb(小圖)
function get_pic_file($col_name="", $col_sn="", $sort="", $showkind="images"){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  $and_sort=(!empty($sort))?" and `sort`='{$sort}'":"";

  $sql = "select * from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `col_name`='{$col_name}' and `col_sn`='{$col_sn}' $and_sort order by sort limit 0,1";

  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  while($all=$xoopsDB->fetchArray($result)){
    //以下會產生這些變數: $files_sn, $col_name, $col_sn, $sort, $kind, $file_name, $file_type, $file_size, $description
    foreach($all as $k=>$v){
      $$k=$v;
    }

    if($showkind=="thumb"){
      $files=(file_exists(_FILES_CENTER_THUMB_DIR . "/{$file_name}"))?_FILES_CENTER_THUMB_URL."/{$file_name}":"";
    }else{
      $files=(file_exists(_FILES_CENTER_IMAGE_DIR . "/{$file_name}"))?_FILES_CENTER_IMAGE_URL."/{$file_name}":"";
    }
  }
  return $files;
}


//取得檔案數
function get_file_amount($col_name="", $col_sn=""){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  $sql = "select count(*) from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `col_name`='{$col_name}' and `col_sn`='{$col_sn}'";

  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  list($amount)=$xoopsDB->fetchRow($result);
  return $amount;
}


//列出可刪除檔案
function list_del_file($col_name="", $col_sn=""){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  $all_file="";
  $sql = "select * from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `col_name`='{$col_name}' and `col_sn`='{$col_sn}' order by sort";

  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  while($all=$xoopsDB->fetchArray($result)){
    //以下會產生這些變數: $files_sn, $col_name, $col_sn, $sort, $kind, $file_name, $file_type, $file_size, $description
    foreach($all as $k=>$v){
      $$k=$v;
    }
    $all_file.="<input type='checkbox' name='del_file[]' value='{$files_sn}'> $description<br>";
  }

  if(empty($all_file))return;

  $files.="<div>選取欲刪除檔案<br>$all_file</div>";
  return $files;
}


//取得附檔或附圖 $show_mode=filename、num
function show_files($col_name="" , $col_sn="" , $thumb=true , $show_mode="" , $show_description=false , $show_dl=false){
  if($show_mode==""){
    $all_files="<script type='text/javascript' language='javascript' src='" . TADTOOLS_URL . "/lytebox/lytebox.js'></script>
    <link rel='stylesheet' href='" . TADTOOLS_URL . "/lytebox/lytebox.css' type='text/css' media='screen' />";
  }else{
    $all_files="";
  }
  $file_arr="";
  $file_arr=get_file($col_name, $col_sn);
  if(empty($file_arr))return;

  if($file_arr){
    $i=1;
    foreach($file_arr as $files_sn => $file_info){
      if($show_mode=="filename"){
        if($file_info['kind']=="file"){
          $all_files.="<div>({$i}) {$file_info['link']}</div>";
        }else{
          $all_files.="<div>({$i}) {$file_info['url']}</div>";
        }
      }else{
        if($file_info['kind']=="file"){
          $linkto=$file_info['path'];
          $description=$file_info['description'];
          $thumb_pic=TADTOOLS_URL."/multiple-file-upload/downloads.png";
          $rel="";
        }else{
          $linkto=$file_info['path'];
          $description=$file_info['description'];
          $thumb_pic=($thumb)?$file_info['tb_path']:$file_info['path'];
          $rel="rel='lyteshow[{$col_name}_{$course_sn}]' title='{$description}'";
        }

        //描述顯示
        $show_description_txt=($show_description)?"<div style='height:40px;font-size:9pt;font-weight:normal;overflow:hidden;text-align:center;'><a href='{$linkto}' $rel style='font-size:9pt;font-weight:normal;'>{$description}</a></div>":"";

        //下載次數顯示
        $show_dl_txt=($show_dl)?"<img src='" . TADTOOLS_URL . "/multiple-file-upload/dl_times.gif' alt='download counter' title='download counter' align='absmiddle' hspace=4>: {$file_info['counter']}":"";

        $width=($thumb)?110:400;
        $pic_height=($thumb)?90:300;
        $height=($thumb)?100:320;
        $height+=($show_description)?30:0;

        $all_files.="
        <div style='border:0px solid gray;width:{$width}px;height:{$height}px;float:left;display:inline;margin:2px;'>
          <a href='{$linkto}' $rel>
          <div align='center' style=\"border:1px solid #CFCFCF;width:{$width}px;height:{$pic_height}px;overflow:hidden;margin:2px auto;background-image:url('{$thumb_pic}');background-repeat: no-repeat;background-position: center center;cursor:pointer;\">
          $show_dl_txt
          </div>
        </a>
        $show_description_txt
        </div>";
      }

    $i++;
    }
  }else{
    $all_files="";
  }
  $all_files.="<div style='clear:both;'></div>";
  return $all_files;
}


//取得單一檔案資料
function get_one_file($files_sn=""){
  global $xoopsDB, $xoopsUser, $xoopsModule;

  $sql = "select * from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `files_sn`='{$files_sn}'";
  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  $all=$xoopsDB->fetchArray($result);
  return $all;
}


//自動編號
function auto_sort($col_name="", $col_sn=""){
  global $xoopsDB, $xoopsUser;

  $sql = "select max(sort) from ".$xoopsDB->prefix(_MODDIR . "_files_center")." where `col_name`='{$col_name}' and `col_sn`='{$col_sn}'";
  $result=$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  list($max)=$xoopsDB->fetchRow($result);
  return ++$max;
}


//下載並新增計數器
function add_file_counter($files_sn=""){
  global $xoopsDB;

  $file=get_one_file($files_sn);
  $sql = "update ".$xoopsDB->prefix(_MODDIR . "_files_center")." set `counter`=`counter`+1 where `files_sn`='{$files_sn}'";
  $xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  if($file['kind']=="img"){
    header("location:"._FILES_CENTER_IMAGE_URL."/{$file['file_name']}");
  }else{
    header("location:"._FILES_CENTER_URL."/{$file['file_name']}");
  }
}


if($_GET['fop']=="dl"){
  add_file_counter($_GET['files_sn']);
}
?>

[1012]PHP進階開發及TadTools工具應用

7-3 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	
	<script type='text/javascript'>
  $(document).ready(function(){
  
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });

    $('#menu2').change(function(){
      contact_list();
    });

  });
  
  //去抓該分類的通訊錄
  function contact_list(){
    $.post('ajax.php' , {gsn: $('#menu2').val()} , function(data){
      $('#contact_list').html(data);
    });
  }
  </script>
  
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody id='contact_list'>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);
	
	//欄位 , 編號 , 是否縮圖 , 顯示模式 (空、filename、num) ,顯示描述,顯示下載次數
  //$photo_file=show_files('photo' , $sn);
  $photo_file=get_pic_file('photo' , $sn , 2 );
  $all_file=show_files('files' , $sn , ture , '' , true , true);
  
	$data="
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
	<tr><th nowrap>相片</th><td><img src='{$photo_file}'></td></tr>
	<tr><th nowrap>相關檔案</th><td>{$all_file}</td></tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

8. 頁籤與小月曆之應用

一、 My97 DatePicker (http://www.my97.net)

  1. 這是一個左岸的作品,是目前最完善的月曆功能,想要的功能應有盡有。用法:
    <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  2. 在日期的input欄位中加入以下語法:
    onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})\"
    • (1)  佈景:skin:'whyGreen'
    • (2)  民國年:dateFmt:'民國yyy年MM月dd日'
    • (3)  含時間:dateFmt:'yyyy-MM-dd HH:mm:ss'
    • (4)  起始日期:startDate:'1980-05-01' 或 %y-%M-%d %H:%m:%s
    • (5)  星期一維第一天:firstDayOfWeek:1
    • (6)  最小日期:minDate:'2012-10-24' 或 %y-%M-{%d+2}  %H:%m:%s
    • (7)  最大日期:maxDate:'2012-10-25'
    • (8)  週休禁止:disabledDays:[0,6]
    • (9)  顯示週數:isShowWeek:true
    • (10)日期框唯讀:readOnly: true
    • (11)取消週末高亮度:highLineWeekDay: false
    • (12)顯示清空按鈕:isShowClear: false
    • (13)雙月曆:doubleCalendar:true
  3. 在input中加上 class='Wdate' 可以加上一個小月曆圖示
  4. 更完整參數:http://www.my97.net/dp/demo/index.htm

二、 jQuery UI 之頁籤

  1. 範例頁面:http://jqueryui.com/tabs/
  2. 詳細API頁面:http://api.jqueryui.com/tabs/
  3. 基本頁籤:有使用jquery cookie 套件,以避免重新整理畫面時老是回到第一個頁籤。
    $jquery_path=get_jquery(true);  //TadTools引入jquery ui
    $now=time();  //用時間來替頁籤命名,以避免id重複
    $jquery_ui="$jquery_path
    <script type='text/javascript' src='".XOOPS_URL."/modules/tadtools/jqueryCookie/jquery.cookie.js'></script>
    <script type='text/javascript'>
    $(document).ready(function() {
      var $tabs = $('#jquery-tabs".$now."').tabs({ cookie: { expires: 30 } , collapsible: true});
    });
    </script>
    • (1)  collapsible: true 允許點兩下開關該頁籤
    • (2)  event: "mouseover" 滑鼠移過去就自動切換
  4. 需要呈現頁籤的地方:
    <div id='jquery-tabs{$now}'>
      <ul>
        <li><a href='#tabs-1'>頁籤名稱1</a></li>
        <li><a href='ajax.php'>頁籤名稱2</a></li>
      </ul>
      <div id='tabs-1'>
        頁籤內容
      </div>
    </div>
  5. 上例的頁籤2其內容是由ajax.php的此檔案所產生。
  6. 若想將頁籤改至下方,重設CSS即可,頁籤的div需加上「 class='tabs-bottom'」:
    $('.tabs-bottom .ui-tabs-nav, .tabs-bottom .ui-tabs-nav > *')
       .removeClass('ui-corner-all ui-corner-top')
       .addClass('ui-corner-bottom');
    $('.tabs-bottom .ui-tabs-nav').appendTo('.tabs-bottom');
     

 

[1012]PHP進階開發及TadTools工具應用

8-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

[1012]PHP進階開發及TadTools工具應用

8-2 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });

    $('#menu2').change(function(){
      contact_list();
    });

  });
  
  //去抓該分類的通訊錄
  function contact_list(){
    $.post('ajax.php' , {gsn: $('#menu2').val()} , function(data){
      $('#contact_list').html(data);
    });
  }
  </script>
  
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	
	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody id='contact_list'>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);
	
	
  
  $jquery_path=get_jquery(true);  //TadTools引入jquery ui

	$data="
	$jquery_path
	<script type='text/javascript' src='".XOOPS_URL."/modules/tadtools/jqueryCookie/jquery.cookie.js'></script>
	<script type='text/javascript'>
  $(document).ready(function() {
    var \$tabs = $('#jquery-tabs').tabs({ cookie: { expires: 30 } , collapsible: true});
    $('.tabs-bottom .ui-tabs-nav, .tabs-bottom .ui-tabs-nav > *')
     .removeClass('ui-corner-all ui-corner-top')
     .addClass('ui-corner-bottom');
    $('.tabs-bottom .ui-tabs-nav').appendTo('.tabs-bottom');
  });
  </script>
  
  <div id='jquery-tabs' class='tabs-bottom'>
    <ul>
      <li><a href='#tabs-1'>基本資料</a></li>
      <li><a href='ajax2.php?op=photo&sn=$sn'>相關相片</a></li>
      <li><a href='ajax2.php?op=file&sn=$sn'>相關檔案</a></li>
    </ul>
    
    
    <div id='tabs-1'>
      <table summary='list_table' id='tbl' style='width:100%;'>
    	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
    	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
    	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
    	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>

    	</table>
    </div>
    
  </div>
  
";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

8-3 上課範例:ajax2.php

<?php
include_once "header.php";
include_once "up_file.php";

$op=isset($_GET['op'])?$_GET['op']:"";
$sn=isset($_GET['sn'])?$_GET['sn']:"";

switch($op){

  case "photo":
  $main=get_photo($sn);
  break;
  
  case "file":
  $main=get_files($sn);
  break;
}

echo $main;



function get_photo($sn=""){
  $photo_file=get_pic_file('photo' , $sn , 2 );
  $photo="<img src='{$photo_file}'>";
  return $photo;
}


function get_files($sn=""){
  $file=show_files('files' , $sn , ture , '' , true , true);
  return $file;
}

?>

[1012]PHP進階開發及TadTools工具應用

9. fullcalendar月曆應用

一、 fullcalendar全月曆

  1. 官網:http://arshaw.com/fullcalendar (請將fullcalendar目錄傳至class)
  2. 需搭配jquery,若有用到拖拉或調整大小功能時,則需引入jquery ui
  3. 一般只要引入fullcalendar.css及fullcalendar.js檔即可,gcal.js則是要結合Google行事曆才需要用的。
  4. 基本用法:
  5. <script src='class/fullcalendar/fullcalendar.js' type='text/javascript'></script>
    <link rel='stylesheet' type='text/css' href='class/fullcalendar/fullcalendar.css'>
    <script src='class/fullcalendar/gcal.js' type='text/javascript'></script>
    <script type='text/javascript'>
    $(function() {
        $('#calendar').fullCalendar({
          //相關參數
        })
    });
    </script>
    <div id='calendar'></div>

二、 相關參數:

  1. 起始年月日:year: 1973, month: 6, date: 16
  2. 呈現模式:defaultView:'month' (單月=month , 單周=basicWeek , 單日=basicDay , 單周議程=agendaWeek , 單日議程=agendaDay)
  3. 標題呈現:header: { left:'title', center:'', right:'today prev,next' } (選項有:today,title,prev,next,prevYear,nextYear )
  4. 按鈕文字:buttonText:{today:'今天',prev:'上個月',next:'下個月'}
  5. 高度比例設定:aspectRatio: 1.35(比例越大,高度越小)
  6. 周顯示模式:weekMode:'fixed'(固定秀六週=fixed,顯示實際週數=liquid,顯示實際週數=variable)
  7. 顯示all day欄位:allDaySlot: true(僅在agendaWeek或agendaDay有效)
  8. 定義all day文字:allDayText: '整日'
  9. 起始小時:firstHour: 8
  10. 時間間隔:slotMinutes: 30
  11. 標題格式:titleFormat: {  month: 'yyyy年MMM'  }
  12. 月份全名:monthNames: ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'],
  13. 月份簡寫:monthNamesShort: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
  14. 星期全名:dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
  15. 星期簡寫:dayNamesShort: ['日','一','二','三','四','五','六'],
  16. 直接加入google行事曆事件:events: 'https://www.google.com/calendar/feeds/taiwan__zh_tw%40holiday.calendar.google.com/public/basic'

三、 事件格式:

  1. 可用如下PHP陣列格式,再用json_encode($myEvents) 來轉為json格式:
    $myEvents[$i]['id']=$sn;
    $myEvents[$i]['title']=$event;
    $myEvents[$i]['start']=strtotime($date);
    • (1)  id: 事件辨識名稱,值為整數或字串。
    • (2)  title: 事件名稱
    • (3)  allDay: 是否為全日事件(非必須)
    • (4)  date: 事件開始日期(同start),支援IETF格式(如:Wed, 18 Oct 2009 13:00:00 EST)、ISO8601格式(如:2009-11-05T13:15:30Z)、或者時間戳記。
    • (5)  start: 事件開始日期(同date)
    • (6)  end: 事件結束日期(非必須)
    • (7)  url: 點選連結網址(非必須)
    • (8)  className: Class樣式名稱(非必須)
    • (9)  editable: 是否可移動或改變大小(非必須)
    • (10)  source: 資料來源(非必須)

 

[1012]PHP進階開發及TadTools工具應用

9-1 上課範例:birthday.php

<?php
/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";
/*-----------function區--------------*/

$jquery=get_jquery(true);

$main="
$jquery
<script src='class/fullcalendar/fullcalendar.js' type='text/javascript'></script>
<link rel='stylesheet' type='text/css' href='class/fullcalendar/fullcalendar.css'>
<script src='class/fullcalendar/gcal.js' type='text/javascript'></script>
<script type='text/javascript'>
$(function() {
    $('#calendar').fullCalendar({
      header: { left:'today', center:'title', right:' prev,next' } ,
      buttonText:{today:'今天',prev:'上個月',next:'下個月'},
      defaultView:'month',
      titleFormat: {
    		month: 'yyyy年MMM'
	    },
    	monthNames: ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'],
    	monthNamesShort: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
    	dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    	dayNamesShort: ['日','一','二','三','四','五','六'],
    	//events: 'https://www.google.com/calendar/feeds/taiwan__zh_tw%40holiday.calendar.google.com/public/basic',
      events: 'get_events.php'
    })
});
</script>
<div id='calendar'></div>
";




/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

9-2 上課範例:header.php

<?php
include_once "common/tool.php";
include_once "function.php";

//判斷是否對該模組有管理權限
$isAdmin=isAdmin();

$interface_menu[_MD_CONTAC_SMNAME1]="index.php";
$interface_menu['生日一覽']="birthday.php";


if($isAdmin){
  $interface_menu[_TO_ADMIN_PAGE]="admin/index.php";
}


//給獨立模組用的登出按鈕
$interface_menu=logout_button($interface_menu);

//模組前台選單
$module_menu=toolbar($interface_menu);

//引入CSS樣式表檔案
$module_css="<link rel='stylesheet' type='text/css' media='screen' href='module.css' />";

?>

[1012]PHP進階開發及TadTools工具應用

9-3 上課範例:get_events.php

<?php
include_once "header.php";

$sql = "select  `sn` , `name` , `birthday` from `".$xoopsDB->prefix("contact")."`";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$all_content="";
$i=0;
while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}
  $myEvents[$i]['id']=$sn;
  $myEvents[$i]['title']=$name;
  $myEvents[$i]['start']=strtotime($birthday);
  $i++;
}

echo json_encode($myEvents);
?>

[1012]PHP進階開發及TadTools工具應用

10. QR Code應用

一、 手持裝置偵測

  1. 官網:http://detectmobilebrowsers.mobi/
  2. 可以偵測目前使用者上網所使用的裝置,以便給予對應的頁面,該程式允許非商業用途免費使用。
  3. 直接套用TadTools工具
  4. if(file_exists(XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php")){
      include_once XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php";
      mobile_device_detect(true, false, true, true, true, true, true, 'pda.php', false);
    }
  5. mobile_device_detect($iphone=true, $ipad=true, $android=true, $opera=true, $blackberry=true, $palm=true, $windows=true, $mobileredirect=false, $desktopredirect=false),其中true表示要將該裝置視為行動裝置,false視為電腦裝置,亦可直接指定網址,或替「$mobileredirect」指定網址以便告知行動裝置要統一轉至哪一個網址。

二、 QR Code應用

  1. QR Code是二維條碼的一種,1994年由日本DENSO WAVE公司發明。QR是「Quick Response」的縮寫,即發明者希望QR Code可讓其內容快速被解碼。QR Code比普通條碼可儲存更多資料,亦無需像普通條碼般在掃描時需直線對準掃描器。
  2. 我們利用QR Code讓使用者透過行動裝置掃描,可以很快的連到網站頁面,而無須輸入網址。
  3. 建議更新至TadTools1.11,QR Code的作法會更好!相容性更高。
  4. 我們可以做一個區塊來放置QR Code,首先,先加入xoops_version.php的設定:
  5. $modversion['blocks'][0]['file'] = "contact_qrcode.php";
    $modversion['blocks'][0]['name'] = 'QR Code ';
    $modversion['blocks'][0]['description'] = '產生連到手持裝置頁面的QR Code條碼';
    $modversion['blocks'][0]['show_func'] = "contact_qrcode_show";
    $modversion['blocks'][0]['template'] = "contact_qrcode.html";
  6. 區塊語法(blocks/contact_qrcode.php):
  7. <?php
    function contact_qrcode_show($options){
      if(preg_match("/contact\/index.php\?sn=/i", $_SERVER['REQUEST_URI'])){
        $url=str_replace("index.php","pda.php",$_SERVER['REQUEST_URI']);
      }elseif(preg_match("/contact\/$/i", $_SERVER['REQUEST_URI'])){
        $url=$_SERVER['REQUEST_URI']."pda.php";
      }else{
        return ;
      }
    
      $block="";
      if(file_exists(TADTOOLS_PATH."/qrcode.php")){
        include_once TADTOOLS_PATH."/qrcode.php";
        $qrcode= new qrcode();
        $block=$qrcode->render($url);
      }
      return $block;
    }
    ?>
  8. 上半段主要是將目前偵測到的網址,改為行動裝置用的網址。
  9. 下半段則是產生QR Code的圖片
  10. 建立templates/blocks/contact_qrcode.html,內容為<{$block}>
  11. 最後,您得做一個pda.php的檔案,以給行動裝置使用。
  12. 請更新模組,並安裝區塊試試吧~
  13. QR Code 線上解碼網站:http://blog.qr4.nl/Online-QR-Code_Decoder.aspx
  14. Android:QuickMark QR Code 行動二維條碼掃瞄器

 

[1012]PHP進階開發及TadTools工具應用

10-1 上課範例:xoops_version.php

<?php
$modversion = array();

//---模組基本資訊---//
$modversion['name'] = _MI_CONTAC_NAME;
$modversion['version']	= '1.0';
$modversion['description'] = _MI_CONTAC_DESC;
$modversion['author'] = _MI_CONTAC_AUTHOR;
$modversion['credits']	= _MI_CONTAC_CREDITS;
$modversion['help'] = 'page=help';
$modversion['license']		= 'GPL see LICENSE';
$modversion['image']		= "images/logo.png";
$modversion['dirname'] = basename(dirname(__FILE__));


//---模組狀態資訊---//
$modversion['status_version'] = '1.0';
$modversion['release_date'] = '2012-09-19';
$modversion['module_website_url'] = 'http://tad0616.net';
$modversion['module_website_name'] = _MI_CONTAC_AUTHOR_WEB;
$modversion['module_status'] = 'release';
$modversion['author_website_url'] = 'http://tad0616.net';
$modversion['author_website_name'] = _MI_CONTAC_AUTHOR_WEB;
$modversion['min_php']= 5.2;
$modversion['min_xoops']='2.5';


//---啟動後台管理界面選單---//
$modversion['system_menu'] = 1;//---資料表架構---//
$modversion['sqlfile']['mysql'] = "sql/mysql.sql";
$modversion['tables'][1] = "contact";
$modversion['tables'][2] = "contact_cate";
$modversion['tables'][3] = "contact_files_center";

//---管理介面設定---//
$modversion['hasAdmin'] = 1;
$modversion['adminindex'] = "admin/index.php";
$modversion['adminmenu'] = "admin/menu.php";

//---使用者主選單設定---//
$modversion['hasMain'] = 1;


//---樣板設定---//

$modversion['templates'][1]['file'] = 'contact_index_tpl.html';
$modversion['templates'][1]['description'] = _MI_CONTAC_TEMPLATE_DESC1;

//---區塊設定---//
$modversion['blocks'][0]['file'] = "contact_qrcode.php";
$modversion['blocks'][0]['name'] = 'QR Code ';
$modversion['blocks'][0]['description'] = '產生連到手持裝置頁面的QR Code條碼';
$modversion['blocks'][0]['show_func'] = "contact_qrcode_show";
$modversion['blocks'][0]['template'] = "contact_qrcode.html";
?>

[1012]PHP進階開發及TadTools工具應用

10-2 上課範例:blocks/contact_qrcode.php

<?php
function contact_qrcode_show($options){
  if(preg_match("/contact\/index.php\?sn=/i", $_SERVER['REQUEST_URI'])){
    $url=str_replace("index.php","pda.php",$_SERVER['REQUEST_URI']);
  }elseif(preg_match("/contact\/$/i", $_SERVER['REQUEST_URI'])){
    $url=$_SERVER['REQUEST_URI']."pda.php";
  }else{
    return ;
  }

  $block="";
  if(file_exists(TADTOOLS_PATH."/qrcode.php")){
    include_once TADTOOLS_PATH."/qrcode.php";
    $qrcode= new qrcode();
    $block=$qrcode->render($url);
  }
  return $block;
}
?>

[1012]PHP進階開發及TadTools工具應用

10-3 上課範例:templates/blocks/contact_qrcode.html

<{$block}>

 

[1012]PHP進階開發及TadTools工具應用

10-4 上課範例:pda.php

<?php
/*-----------引入檔案區--------------*/
include_once "header.php";
/*-----------function區--------------*/

$main="這是手機頁面,讀取的是編號 {$_GET['sn']}";

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title></title>
  </head>
  <body>
  <?php echo $main;?>
  </body>
</html>

[1012]PHP進階開發及TadTools工具應用

10-5 上課範例:blocks/contact_qrcode.php(不替換網址)

<?php
function contact_qrcode_show($options){
/*
  if(preg_match("/contact\/index.php\?sn=/i", $_SERVER['REQUEST_URI'])){
    $url=str_replace("index.php","pda.php",$_SERVER['REQUEST_URI']);
  }elseif(preg_match("/contact\/$/i", $_SERVER['REQUEST_URI'])){
    $url=$_SERVER['REQUEST_URI']."pda.php";
  }else{
    return ;
  }
*/

  $url=$_SERVER['REQUEST_URI'];

  $block="";
  if(file_exists(TADTOOLS_PATH."/qrcode.php")){
    include_once TADTOOLS_PATH."/qrcode.php";
    $qrcode= new qrcode();
    $block=$qrcode->render($url);
  }
  return $block;
}
?>

[1012]PHP進階開發及TadTools工具應用

10-6 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";

//手持裝置判斷
if(file_exists(XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php")){
  include_once XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php";
  mobile_device_detect(true, false, true, true, true, true, true, "pda.php?sn={$_GET['sn']}", false);
}
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });

    $('#menu2').change(function(){
      contact_list();
    });

  });

  //去抓該分類的通訊錄
  function contact_list(){
    $.post('ajax.php' , {gsn: $('#menu2').val()} , function(data){
      $('#contact_list').html(data);
    });
  }
  </script>

	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody id='contact_list'>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);

  $jquery_path=get_jquery(true);  //TadTools引入jquery ui

	$data="
	$jquery_path
	<script type='text/javascript' src='".XOOPS_URL."/modules/tadtools/jqueryCookie/jquery.cookie.js'></script>
	<script type='text/javascript'>
  $(document).ready(function() {
    $('#jquery-tabs').tabs({ cookie: { expires: 30 }});
  });
  </script>

  <div id='jquery-tabs'>
    <ul>
      <li><a href='#tabs-1'>基本資料</a></li>
      <li><a href='ajax2.php?op=photo&sn=$sn'>相關相片</a></li>
      <li><a href='ajax2.php?op=file&sn=$sn'>相關檔案</a></li>
    </ul>


    <div id='tabs-1'>
      <table summary='list_table' id='tbl' style='width:100%;'>
    	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
    	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
    	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
    	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
    	</table>
    </div>

  </div>
";

  include_once XOOPS_ROOT_PATH."/modules/tadtools/qrcode/qrcode.php";
  $a = new QR("Email:{$email}");
  file_put_contents(XOOPS_ROOT_PATH."/uploads/qrcode/{$sn}.gif",$a->image(2));
  $data.="<img src='".XOOPS_URL."/uploads/qrcode/{$sn}.gif'>";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

[1012]PHP進階開發及TadTools工具應用

11. Jquery Mobile

一、 jQuery Mobile(JQM)的特性

  1. JQM幾乎支援所有的行動裝置: http://jquerymobile.com/gbs/
  2. JQM以部分更新取代整頁更新,省掉CSS、JavaScript剖析的時間。也會用Cache加速瀏覽。
  3. 完整API:http://jquerymobile.com/demos/1.2.0/
  4. 中文版:http://www.jqmapi.com/

二、 jQuery Mobile的頁面結構

  1. 宣告 HTML5 documnt,引入JQM的css及js檔
  2. 一個JQM的網頁主要以page為單位,每個page可分成header、content與footer三個區域。
  3. 在一個HTML檔案中可以放多個pages,不過每次只會顯示一個page。
  4. <!DOCTYPE html>
    <html>
     <head>
     <title>通訊錄</title>
     <meta name='viewport' content='width=device-width, initial-scale=1'>
     <link rel='stylesheet' href='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.css' />
     <script src='".XOOPS_URL."/modules/tadtools/jquery/jquery.js'></script>
     <script src='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.js'></script>
    </head>
    <body>
    <div data-role='page'>
      <div data-role='header'>
        <a data-icon='arrow-l' data-rel='back'>回上頁</a>
        <h1>通訊錄</h1>
        <a href='#' data-icon='home'>回首頁</a>
        <div data-role='navbar' >
          <ul>
            <li><a href='#' data-icon='star' data-iconpos='top' data-theme='b'>基本資料</a></li>
            <li><a href='#' data-icon='search' data-iconpos='top' data-theme='b'>相關相片</a></li>
            <li><a href='#' data-icon='check' data-iconpos='top' data-theme='b'>相關檔案</a></li>
          </ul>
        </div>
      </div>
      <div data-role='content'>
        <ul data-role='listview' data-inset='false'>
          <li data-role='list-divider'>所有通訊錄列表</li>
          <li><a href='#page2'><img src='images/pic.png' /><h3>姓名</h3><p>文字描述</p></a>
          <span class='ui-li-count'>2</span></li>
        </ul>
      </div>
      <div data-role='footer'>共 N 筆資料</div>
    </div>
    <div data-role='page' id='page2'><div data-role='content'>第二頁</div></div>
    </body>
    </html>
  5. 通過設置viewport屬性為,會使寬度會被設定為設備的屏幕寬度。
  6. 將鏈結<a>加以美化,只要將<ul> 指定data-role的屬性為listview就可以了。
  7. data-inset='true' 指定若此listview現在文中間,會自動幫你在上下加上圓弧邊。
  8. 用 data-role='list-divider'可做成列表的標題。
  9. 在每個<li>的一開始加上一個 <img> , JQM就會自動把它放在最左邊當做縮圖
  10. 在<li>裡面加上一個 <span class='ui-li-count'>,JQM會把內容包在圓框中並放在最右邊

三、 jQuery Mobile的瀏覽列

  1. 瀏覽列最多一行可以有五個
  2. 圖示列表:http://jquerymobile.com/demos/1.2.0/docs/buttons/buttons-icons.html

四、 jQuery Mobile的表單

  1. JQM會自動將很多表單的元素轉換為觸控較好操作的形式,並多了如Slider、Flip等表單元件。
  2. 表單形式:http://jquerymobile.com/demos/1.2.0/docs/forms/forms-all.html
  3. 利用<div data-role='fieldcontain'>表單</div>會針對不同的螢幕寬度做不同的布局。

五、 模擬手機瀏覽器

  1. Mobilizer:http://www.springbox.com/mobilizer/ 需搭配Adobe AIR。
  2. Opera Mobile Emulator:http://www.opera.com/developer/tools/mobile/

[1012]PHP進階開發及TadTools工具應用

11-1 上課範例:blocks/contact_qrcode.php

<?php
function contact_qrcode_show($options){

  if(preg_match("/contact\/index.php\?sn=/i" , $_SERVER['REQUEST_URI'])){
    $url=str_replace("index.php","pda.php" , $_SERVER['REQUEST_URI']);
  }elseif(preg_match("/contact\/$/i" , $_SERVER['REQUEST_URI'])){
    $url=$_SERVER['REQUEST_URI']."pda.php";
  }else{
    return ;
  }


  //$url=$_SERVER['REQUEST_URI'];

  $block="";
  if(file_exists(TADTOOLS_PATH."/qrcode.php")){
    include_once TADTOOLS_PATH."/qrcode.php";
    $qrcode= new qrcode();
    $block=$qrcode->render($url);
  }
  return $block;
}
?>

[1012]PHP進階開發及TadTools工具應用

11-2 上課範例:pda.php

<?php
/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
/*-----------function區--------------*/

//抓所有分類
$cate=get_contact_cate_all();

$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
$content="<li data-role='list-divider'>所有通訊錄列表</li>";
while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}
	
	$photo_file = get_pic_file('photo' , $sn , 1 , 'thumb');
  $photo=empty($photo_file)?"" : "<img src='{$photo_file}'>";
	
	$content.="
  <li>
  <a href='data.php?sn=$sn'>{$photo}<h3>{$name}</h3><p>電話:{$tel} 信箱:{$email}</p></a>
  <span class='ui-li-count'>{$cate[$gsn]['title']}</span>
  </li>
  ";
	
}


echo "<!DOCTYPE html>
<html>
  <head>
   <title></title>
   <meta charset='utf-8'>
   <meta name='viewport' content='width=device-width, initial-scale=1'>
   <link rel='stylesheet' href='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.css' />
   <script src='".XOOPS_URL."/modules/tadtools/jquery/jquery.js'></script>
   <script src='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.js'></script>

  </head>
  <body>
  
  <div data-role='page' id='p1'>
    <div data-role='header'>
      <a data-icon='arrow-l' data-rel='back'>回上頁</a>
      <h1>所有通訊錄列表</h1>
      <a href='pda.php' data-icon='home'>回首頁</a>
    </div>
    <div data-role='content'>

      <ul data-role='listview' data-inset='false'>
        $content
      </ul>

    </div>
    <div data-role='footer'></div>
  </div>

  </body>
</html>
";
?>

[1012]PHP進階開發及TadTools工具應用

11-3 上課範例:data.php

<?php
/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
/*-----------function區--------------*/

echo "<!DOCTYPE html>
<html>
  <head>
   <title></title>
   <meta charset='utf-8'>
   <meta name='viewport' content='width=device-width, initial-scale=1'>
   <link rel='stylesheet' href='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.css' />
   <script src='".XOOPS_URL."/modules/tadtools/jquery/jquery.js'></script>
   <script src='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.js'></script>

  </head>
  <body>

  <div data-role='page' id='p1'>
    <div data-role='header'>
      <a data-icon='arrow-l' data-rel='back'>回上頁</a>
      <h1>詳細資料</h1>
      <a href='pda.php' data-icon='home'>回首頁</a>
      <div data-role='navbar' >
      <ul>
        <li><a href='#' data-icon='star' data-iconpos='top' data-theme='a'>基本資料</a></li>
        <li><a href='#' data-icon='search' data-iconpos='top' data-theme='a'>相關相片</a></li>
        <li><a href='#' data-icon='check' data-iconpos='top' data-theme='a'>相關檔案</a></li>
      </ul>
    </div>
    </div>
    <div data-role='content'>

    {$_GET['sn']}

    </div>
    <div data-role='footer'></div>
  </div>


  </body>
</html>
";
?>

[1012]PHP進階開發及TadTools工具應用

12. java上傳及影片播放

一、 select選單切換

  1. 先製作選項
    $sql = "select `sn`,`name` from `".$xoopsDB->prefix("contact")."` ";
    $result = $xoopsDB->query($sql);
    $option="";
    while(list($sn,$name)=$xoopsDB->fetchRow($result)){
    	$selected=($sn==$_GET['sn'])?"selected":"";
    	$option.="<option value='$sn' $selected>$name</option>";
    }

     

  2. 然後加入切換選單
    <select onChange=\"location.href='data.php?op={$_GET['op']}&sn='+this.value\">$option
    </select>

     

二、 JAVA上傳(http://jupload.sourceforge.net/

  1. 新增jupload.php頁面,獨立一個頁面比較不會出問題。
    <?php
    include_once "header.php";
    include_once XOOPS_ROOT_PATH."/modules/tadtools/jupload/jupload.php";
    if(!$xoopsUser)  die('無上傳權限');
    if($_GET['op']=='import'){
      if ($dh = opendir(XOOPS_ROOT_PATH."/uploads/contact/video")) {
        while (($file = readdir($dh)) !== false) {
          if(strlen($file)<=2)continue;
          $f=explode(".",$file);
          $ext=strtolower($f[1]);
          rename(XOOPS_ROOT_PATH."/uploads/contact/video/{$file}",XOOPS_ROOT_PATH."/uploads/contact/{$_GET['sn']}.{$ext}");
          die("請點擊「影片」以觀看之");
        }
      }
    }else{
      $appletParameters = array(
        'maxFileSize' => '2G',
        'postURL' => XOOPS_URL.'/modules/contact/jupload.php',
        'archive' => XOOPS_URL.'/modules/tadtools/jupload/wjhk.jupload.jar',
        'afterUploadURL' => XOOPS_URL."/modules/contact/index.php?sn={$_GET['sn']}&op=import",
        'allowedFileExtensions' => 'flv/mp4',
        'sendMD5Sum' => 'true',
        'showLogWindow' => 'false',
        'debugLevel' => 99
      );
      $classParameters = array(
        'demo_mode' => false,
        'allow_subdirs' => true,
        'destdir' => XOOPS_ROOT_PATH."/uploads/contact/video"
      );
      $juploadPhpSupportClass = new JUpload($appletParameters, $classParameters);
      echo "<!--JUPLOAD_APPLET-->";
    }
    ?>

     

三、 影片播放(http://www.longtailvideo.com/jw-player/about/

  1. 新增play.php頁面,檔名部份一律規範為「編號.mp4」格式(比較簡易)。
    <?php
    include_once "header.php";
    include_once XOOPS_ROOT_PATH."/modules/tadtools/jwplayer.php";
    $jw=new JwPlayer("play" , XOOPS_URL."/uploads/contact/{$_GET['sn']}.mp4" , $image  , $width , $height , $skin , $mode , $display , $backcolor , $frontcolor , $lightcolor , $screencolor);
    $player=$jw->render();
    echo $player;
    ?>

     

四、 影片下載(https://addons.mozilla.org/zh-tw/firefox/addon/video-downloadhelper/

  1. 請安裝firefox,接著安裝附加元件「DownloadHelper」即可下載各式影片檔。

[1012]PHP進階開發及TadTools工具應用

12-1 上課範例:data.php

<?php
/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
/*-----------function區--------------*/

$op=isset($_GET['op'])?$_GET['op']:"";
$sn=isset($_GET['sn'])?$_GET['sn']:"";

switch($op){

  case "photo":
  $main=get_photo($sn);
  break;

  case "file":
  $main=get_files($sn);
  break;
  
  default:
  	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
  	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
  	$all=$xoopsDB->fetchArray($result);

  	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
  	foreach($all as $k=>$v){
  		$$k=$v;
  	}
  	
  	$main="
    <table summary='list_table' id='tbl' style='width:100%;'>
    	<tr><th nowrap>姓名</th><td>{$name}</td></tr>
    	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
    	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
    	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
    	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
    	</table>";
  break;
}



$sql = "select sn,name from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql);
while(list($sn,$name)=$xoopsDB->fetchRow($result)){
  $selected=($sn==$_GET['sn'])?"selected":"";
  $option.="<option value='$sn' $selected>$name</option>";
}



echo "<!DOCTYPE html>
<html>
  <head>
   <title></title>
   <meta charset='utf-8'>
   <meta name='viewport' content='width=device-width, initial-scale=1'>
   <link rel='stylesheet' href='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.css' />
   <script src='".XOOPS_URL."/modules/tadtools/jquery/jquery.js'></script>
   <script src='".XOOPS_URL."/modules/tadtools/jquery.mobile/jquery.mobile.js'></script>

  </head>
  <body>

  <div data-role='page' id='p1'>
    <div data-role='header'>
      <a data-icon='arrow-l' data-rel='back'>回上頁</a>
      <h3><select onChange=\"location.href='data.php?op=$op&sn=' + this.value\">$option</select></h3>
      <a href='pda.php' data-icon='home'>回首頁</a>
      <div data-role='navbar' >
      <ul>
        <li><a href='data.php?op=base&sn={$_GET['sn']}' data-icon='star' data-iconpos='top' data-theme='a'>基本資料</a></li>
        <li><a href='data.php?op=photo&sn={$_GET['sn']}' data-icon='search' data-iconpos='top' data-theme='a'>相關相片</a></li>
        <li><a href='data.php?op=file&sn={$_GET['sn']}' data-icon='check' data-iconpos='top' data-theme='a'>相關檔案</a></li>
      </ul>
    </div>
    </div>
    <div data-role='content'>

    {$main}

    </div>
    <div data-role='footer'></div>
  </div>


  </body>
</html>
";


function get_photo($sn=""){
  $photo_file=get_pic_file('photo' , $sn , 1 );
  $photo="<img src='{$photo_file}'>";
  return $photo;
}


function get_files($sn=""){
  $file=show_files('files' , $sn );
  return $file;
}

?>

 

[1012]PHP進階開發及TadTools工具應用

12-2 上課範例:index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header.php";
include_once "up_file.php";
$xoopsOption['template_main'] = "contact_index_tpl.html";

//手持裝置判斷
if(file_exists(XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php")){
  include_once XOOPS_ROOT_PATH."/modules/tadtools/mobile_device_detect.php";
  mobile_device_detect(true, false, true, true, true, true, true, "pda.php?sn={$_GET['sn']}", false);
}
/*-----------function區--------------*/


//列出所有contact資料
function list_contact(){
	global $xoopsDB , $xoopsModule , $isAdmin;

	$jquery=get_jquery();

	//刪除確認的JS
	$main="
	$jquery
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });


    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
        contact_list();
      });
    });

    $('#menu2').change(function(){
      contact_list();
    });

  });

  //去抓該分類的通訊錄
  function contact_list(){
    $.post('ajax.php' , {gsn: $('#menu2').val()} , function(data){
      $('#contact_list').html(data);
    });
  }
  </script>

	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>地址</th>
	</tr>

	<tbody id='contact_list'>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>

		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}

//以流水號秀出某筆contact資料內容
function show_one_contact($sn=""){
	global $xoopsDB , $xoopsModule , $isAdmin;

	if(empty($sn)){
		return;
	}else{
		$sn=intval($sn);
	}

	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}' ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$all=$xoopsDB->fetchArray($result);

	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}


	$cate=get_contact_cate($gsn);

  $jquery_path=get_jquery(true);  //TadTools引入jquery ui

	$data="
	$jquery_path
	<script type='text/javascript' src='".XOOPS_URL."/modules/tadtools/jqueryCookie/jquery.cookie.js'></script>
	<script type='text/javascript'>
  $(document).ready(function() {
    $('#jquery-tabs').tabs({ cookie: { expires: 30 }});
  });
  </script>

  <div id='jquery-tabs'>
    <ul>
      <li><a href='#tabs-1'>基本資料</a></li>
      <li><a href='ajax2.php?op=photo&sn=$sn'>相關相片</a></li>
      <li><a href='ajax2.php?op=file&sn=$sn'>相關檔案</a></li>
      <li><a href='jupload.php?sn=$sn'>上傳影片</a></li>
      <li><a href='play.php?sn=$sn'>播放</a></li>
    </ul>


    <div id='tabs-1'>
      <table summary='list_table' id='tbl' style='width:100%;'>
    	<tr><th nowrap>電話</th><td>{$tel}</td></tr>
    	<tr><th nowrap>信箱</th><td>{$email}</td></tr>
    	<tr><th nowrap>生日</th><td>{$birthday}</td></tr>
    	<tr><th nowrap>地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
    	</table>
    </div>

  </div>
";

  include_once XOOPS_ROOT_PATH."/modules/tadtools/qrcode/qrcode.php";
  $a = new QR("Email:{$email}");
  file_put_contents(XOOPS_ROOT_PATH."/uploads/qrcode/{$sn}.gif",$a->image(2));
  $data.="<img src='".XOOPS_URL."/uploads/qrcode/{$sn}.gif'>";

	//raised,corners,inset
	$main=div_3d("{$cate['title']} / {$name}",$data,"corners");

	return $main;
}
/*-----------執行動作判斷區----------*/
$op=empty($_REQUEST['op'])?"":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"" : intval($_REQUEST['files_sn']);


switch($op){

	default:
  if(empty($sn)){
  	$main=list_contact();
  }else{
  	$main=show_one_contact($sn);
  }
	break;
}

/*-----------秀出結果區--------------*/
module_footer($main);
?>

 

[1012]PHP進階開發及TadTools工具應用

12-3 上課範例:jupload.php

<?php
include_once "header.php";
include_once XOOPS_ROOT_PATH."/modules/tadtools/jupload/jupload.php";
if(!$xoopsUser)  die('無上傳權限');

if($_GET['op']=='import'){
  if ($dh = opendir(XOOPS_ROOT_PATH."/uploads/contact/video")) {
    while (($file = readdir($dh)) !== false) {
      if(strlen($file)<=2)continue;
      $f=explode(".",$file);
      $ext=strtolower($f[1]);
      rename(XOOPS_ROOT_PATH."/uploads/contact/video/{$file}",XOOPS_ROOT_PATH."/uploads/contact/{$_GET['sn']}.{$ext}");
      die("請點擊「影片」以觀看之");
    }
  }
}else{
  $appletParameters = array(
    'maxFileSize' => '2G',
    'postURL' => XOOPS_URL.'/modules/contact/jupload.php',
    'archive' => XOOPS_URL.'/modules/tadtools/jupload/wjhk.jupload.jar',
    'afterUploadURL' => XOOPS_URL."/modules/contact/index.php?sn={$_GET['sn']}&op=import",
    'allowedFileExtensions' => 'flv/mp4',
    'sendMD5Sum' => 'true',
    'showLogWindow' => 'false',
    'debugLevel' => 99
  );
  $classParameters = array(
    'demo_mode' => false,
    'allow_subdirs' => true,
    'destdir' => XOOPS_ROOT_PATH."/uploads/contact/video"
  );
  $juploadPhpSupportClass = new JUpload($appletParameters, $classParameters);
  echo "<!--JUPLOAD_APPLET-->";
}
?>

 

[1012]PHP進階開發及TadTools工具應用

12-4 上課範例:play.php

<?php
include_once "header.php";

include_once XOOPS_ROOT_PATH."/modules/tadtools/jwplayer.php";
$jw=new JwPlayer("play" , XOOPS_URL."/uploads/contact/video/ttt.flv");
$player=$jw->render();
echo $player;
?>

 

[1012]PHP進階開發及TadTools工具應用

13. CSV的匯出與匯入

一、 匯入文字檔上傳介面:

<form action='index.php' method='post' enctype='multipart/form-data'>
<INPUT type='file' name='userfile'>
<INPUT type='hidden' name='op' value='import'>
<INPUT type='submit' value='匯入'>
</form>


二、 匯入文字檔:

  1. 先建立一個csv檔,格式欄位依序為「gsn , name , tel , email , birthday , zip , county , city , addr」
    $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");
    while (($data = fgetcsv($handle, 1000)) !== FALSE) {
      $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
      $xoopsDB->queryF($sql);
    }
    fclose($handle);
  2. 控制符=fopen(檔名,模式):打開檔案,布林值=fclose(檔案控制符):關閉檔案
  3. 陣列=fgetcsv(檔案控制符,[最長讀取長度],[分格符號],[文字引號]):讀取CSV檔

三、 文字檔轉碼:

  1. 由於Excel僅能編輯Big5的中文編碼,故若是您希望會出的檔案可以讓Excel開啟,匯出時,記得將編碼轉為Big5。
    • (1)  iconv("舊編碼" , "新編碼" , "原文");
    • (2)  mb_convert_encoding("原文" , "新編碼" , "舊編碼");

四、 匯出文字檔

  1. 匯出文字檔的作法其實很簡單,您只要在程式裡加入以下的程式碼就行了:
    header("Content-type: text/x-csv");
    header("Content-Disposition: attachment; filename=檔名");
    echo 主要內容;
    exit;
  2. 利用mime-type即可將文件偽裝成各種檔案:
    CSV檔:text/x-csv
    word檔:application/msword
    excel檔:application/vnd.ms-excel

五、 TadTools內建函數

  1. 首頁的連結工具:
    • (1)  $interface_menu[工具列名稱]="網址";
    • (2)  $interface_logo[工具列名稱]="圖檔名稱";(圖檔一律放到模組的images下)
    • (3)  toolbar($interface_menu=array(),$interface_logo=array());
  2. 推文工具:push_url($css="");
  3. facebook留言工具:facebook_comments();
  4. 單選回復原始資料函數:chk($DBV="",$NEED_V="",$defaul="",$return="checked");
  5. 複選回復原始資料函數:chk2($defaul_array="",$NEED_V="",$defaul=1);
  6. 細部權限判斷:power_chk($perm_name="",$psn="");
  7. 建立目錄:mk_dir($dir);
  8. 刪除目錄樹:rrmdir($dir="");
  9. 自動轉連結:autolink($text, $target='_blank', $nofollow=true);

[1012]PHP進階開發及TadTools工具應用

13-1 上課範例:通訊錄.csv

gsn,name,tel,email,birthday,zip,county,city,addr
1,首羿國際股份有限公司,04-23231455,[email protected],1960/1/1,700,臺南市,中西區,五妃街1號
1,慶銘資訊有限公司,04-22516589,[email protected],1960/1/2,700,臺南市,中西區,五妃街2號
1,國眾電腦股份有限公司台中分公司,04-23291455,[email protected],1960/1/3,700,臺南市,中西區,五妃街3號
1,鼎新電腦股份有限公司台中分公司,04-27060626,[email protected],1960/1/4,700,臺南市,中西區,五妃街4號
3,置新科技股份有限公司,04-26331613,[email protected],1960/1/5,700,臺南市,中西區,五妃街5號
3,東盈科技有限公司,02-23119986,[email protected],1960/1/6,700,臺南市,中西區,五妃街6號
3,飛資得股份有限公司,04-22084278,[email protected],1960/1/7,700,臺南市,中西區,五妃街7號
3,敦陽科技有限公司,04-23804986,[email protected],1960/1/8,700,臺南市,中西區,五妃街8號
3,統一元氣資產管理股份有限公司,04-23105459,[email protected],1960/1/9,700,臺南市,中西區,五妃街9號
4,祥懋資訊有限公司,02-2395-6966#2552,[email protected],1960/1/10,700,臺南市,中西區,五妃街10號
4,言瑞開發科技股份有限,04-23807366,[email protected],1960/1/11,700,臺南市,中西區,五妃街11號
4,三商電腦股份有限公司,02-27170900,[email protected],1960/1/12,700,臺南市,中西區,五妃街12號
4,豪勉科技股份有限公司,02-27004288,[email protected],1960/1/13,700,臺南市,中西區,五妃街13號
4,亞芬資訊有限公司,04-22085688,[email protected],1960/1/14,700,臺南市,中西區,五妃街14號
7,晶茂資訊科技有限公司,04-23100231,[email protected],1960/1/15,700,臺南市,中西區,五妃街15號
7,禾宇精密科技股份有限公司,02-22130778,[email protected],1960/1/16,700,臺南市,中西區,五妃街16號
7,僑高科技有限公司,04-22066100,[email protected],1960/1/17,700,臺南市,中西區,五妃街17號
7,力梭資訊股份有限公司,02-27889300,[email protected],1960/1/18,700,臺南市,中西區,五妃街18號
7,泰鋒電腦股份有限公司,04-23019505#208,[email protected],1960/1/19,700,臺南市,中西區,五妃街19號
7,士欣資訊管理股份有限公司,04-7740519,[email protected],1960/1/20,700,臺南市,中西區,五妃街20號
8,皮托科技股份有限公司,02-27912917,[email protected],1960/1/21,700,臺南市,中西區,五妃街21號
8,方鼎資訊股份有限公司,04-26237585,[email protected],1960/1/22,700,臺南市,中西區,五妃街22號
8,以柔資訊股份有限公司,04-23289212,[email protected],1960/1/23,700,臺南市,中西區,五妃街23號
8,安潤科技股份有限公司,05-6330599,[email protected],1960/1/24,700,臺南市,中西區,五妃街24號
8,伸峰科技股份有限公司,03-6588899#126,[email protected],1960/1/25,700,臺南市,中西區,五妃街25號
9,東杰宏實業有限公司,04-22372123#15,[email protected],1960/1/26,700,臺南市,中西區,五妃街26號
9,欣峰資訊股份有限公司,04-26867733,[email protected],1960/1/27,700,臺南市,中西區,五妃街27號
9,采奕資訊股份有限公司,04-22447586,[email protected],1960/1/28,700,臺南市,中西區,五妃街28號
9,長高科技股份有限公司,02-82315565,[email protected],1960/1/29,700,臺南市,中西區,五妃街29號
9,信昌科技股份有限公司,02-2627-1899#317,[email protected],1960/1/30,700,臺南市,中西區,五妃街30號
10,星耀資訊有限公司,02-29637781,[email protected],1960/1/31,700,臺南市,中西區,五妃街31號
10,活力點子數位資訊有限公司,04-24610791,[email protected],1960/2/1,700,臺南市,中西區,五妃街32號
10,智域資訊股份有限公司,04-22731469,[email protected],1960/2/2,700,臺南市,中西區,五妃街33號
10,采威國際資訊股份有限公司,04-23262107,[email protected],1960/2/3,700,臺南市,中西區,五妃街34號
10,精誠資訊股份有限公司,04-22018008#211,[email protected],1960/2/4,700,臺南市,中西區,五妃街35號
10,御廚皇事業股份有限公司,04-24617550,[email protected],1960/2/5,700,臺南市,中西區,五妃街36號
10,朝陽系統整合有限公司,04-22938299,[email protected],1960/2/6,700,臺南市,中西區,五妃街37號
11,冠捷數位科技有限公司,04-23015593#251,[email protected],1960/2/7,700,臺南市,中西區,五妃街38號
11,廣力電腦股份有限公司,04-22270525,[email protected],1960/2/8,700,臺南市,中西區,五妃街39號
11,大鐸資訊股份有限公司,02-27362009,[email protected],1960/2/9,700,臺南市,中西區,五妃街40號
11,正茂科技有限公司,04-22413880,[email protected],1960/2/10,700,臺南市,中西區,五妃街41號
11,志盛科技股份有限公司,02-23770217,[email protected],1960/2/11,700,臺南市,中西區,五妃街42號
11,精智科技有限公司,04-23803525,[email protected],1960/2/12,700,臺南市,中西區,五妃街43號
11,大鳴電訊股份有限公司,04-24614567,[email protected],1960/2/13,700,臺南市,中西區,五妃街44號
11,隆業興科技有限公司,04-24261451,[email protected],1960/2/14,700,臺南市,中西區,五妃街45號
11,時訊電腦股份有限公司,04-23726496,[email protected],1960/2/15,700,臺南市,中西區,五妃街46號
1,禾康資訊有限公司,02-23770217,[email protected],1960/2/16,700,臺南市,中西區,五妃街47號
11,德瑞數位科技股份有限公司,04-23803525,[email protected],1960/2/17,700,臺南市,中西區,五妃街48號
3,捷合科技股份有限公司,04-22761854,[email protected],1960/2/18,700,臺南市,中西區,五妃街49號
4,禾鑫資訊有限公司,02-25148395,[email protected],1960/2/19,700,臺南市,中西區,五妃街50號
1,網奕資訊科技股份有限公司,04-22938299,[email protected],1960/2/20,700,臺南市,中西區,五妃街51號
3,亞美加企業有限公司,07-6103769,[email protected],1960/2/21,700,臺南市,中西區,五妃街52號
7,雋展科技股份有限公司,04-22358831,[email protected],1960/2/22,700,臺南市,中西區,五妃街53號
8,台灣易立歐科技股份有限公司,049-2201163,[email protected],1960/2/23,700,臺南市,中西區,五妃街54號
9,見誠科技有限公司,02-77015804,[email protected],1960/2/24,700,臺南市,中西區,五妃街55號
10,京衍企業股份有限公司,04-26333168,[email protected],1960/2/25,700,臺南市,中西區,五妃街56號

 

[1012]PHP進階開發及TadTools工具應用

13-2 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入'>
  <INPUT type='button' value='匯出' onClick=\"location.href='index.php?op=export'\">
  <a href='index.php?op=export'>匯出</a>
  </form>


	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

13-3 上課範例:__fgetcsv()


function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

 

[1012]PHP進階開發及TadTools工具應用

14. 產生Excel報表

一、 PHPExcel(http://phpexcel.codeplex.com)

  1. 可讀取、產生Excel 97~2007的檔案,甚至可輸出PDF、CSV、HTML檔。
  2. 安裝需求:PHP 5.2.0 以上、需開啟php_zip、php_xml函式庫。

二、 基本架構

<?php
include_once "header.php";
require_once 'class/PHPExcel.php';    //引入 PHPExcel 物件庫
require_once 'class/PHPExcel/IOFactory.php';    //引入 PHPExcel_IOFactory 物件庫
$objPHPExcel = new PHPExcel();  //實體化Excel
//----------內容-----------//
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename=通訊錄.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->setPreCalculateFormulas(false);
$objWriter->save('php://output');
exit;
?>

三、 建立工作表並指定名稱

$objPHPExcel->setActiveSheetIndex(0);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

四、 指定儲存格內容

  1. 有以下類型可設定:TYPE_BOOL、TYPE_ERROR、TYPE_FORMULA、TYPE_INLINE、TYPE_NULL、TYPE_NUMERIC、TYPE_STRING
$objActSheet->setCellValue("A1", '姓名')->setCellValue("B1", '電話');
$objActSheet->setCellValueExplicit("C2", '0987654321',PHPExcel_Cell_DataType:: TYPE_STRING);

五、 調整儲存格欄寬

$objActSheet->getColumnDimension('A')->setWidth(8);  //固定寬度8
$objActSheet->getColumnDimension('B')->setAutoSize(true);  //自動寬度

六、 設定文字、儲存格樣式及對齊方向

$objPHPExcel->getDefaultStyle()->getFont()->setName('標楷體');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(16);
$objActSheet->getStyle('A1:E1')->getFill()->setFillType(PHPExcel_Style_Fill:: FILL_SOLID)->getStartColor()->setARGB('FFFFCC99');

七、 合併儲存格

$objActSheet->mergeCells("A10:D10")->setCellValue("A10", '資料數共計');

八、 插入公式

$n=$i-1;
$objActSheet->setCellValue("E{$i}", "=COUNTA(E2:E{$n})");

九、 保護儲存格

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->protectCells("E{$i}", 'password');


 

[1012]PHP進階開發及TadTools工具應用

14-1 上課範例:admin/excel.php

<?php
include_once "header_admin.php";
require_once '../class/PHPExcel.php';    //引入 PHPExcel 物件庫
require_once '../class/PHPExcel/IOFactory.php';    //引入 PHPExcel_IOFactory 物件庫
$objPHPExcel = new PHPExcel();  //實體化Excel
//----------內容-----------//

$objPHPExcel->setActiveSheetIndex(0);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

$objActSheet->getColumnDimension('A')->setWidth(8);
$objActSheet->getColumnDimension('B')->setWidth(40);
$objActSheet->getColumnDimension('C')->setWidth(15);
$objActSheet->getColumnDimension('D')->setWidth(25);
$objActSheet->getColumnDimension('E')->setWidth(10);
$objActSheet->getColumnDimension('F')->setWidth(8);
$objActSheet->getColumnDimension('G')->setWidth(8);
$objActSheet->getColumnDimension('H')->setWidth(8);
$objActSheet->getColumnDimension('I')->setWidth(18);
/*
$objPHPExcel->getDefaultStyle()->getFont()->setName('標楷體');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(16);
*/

$objActSheet-> getStyle('A1:I1')-> getFont()-> setName('SimHei')-> setSize('14');
$objActSheet-> getStyle('A1:I1')-> getFill()-> setFillType(PHPExcel_Style_Fill:: FILL_SOLID)-> getStartColor()-> setARGB('FFC9E3F3');


$objActSheet->setCellValue("A1", '群組')
            ->setCellValue("B1", '姓名')
            ->setCellValue("C1", '電話')
            ->setCellValue("D1", '信箱')
            ->setCellValue("E1", '生日')
            ->setCellValue("F1", '郵遞區號')
            ->setCellValue("G1", '縣市')
            ->setCellValue("H1", '鄉鎮市區')
            ->setCellValue("I1", '地址');


$cate=get_contact_cate_all();
	
$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$i=2;
while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}

  $objActSheet->setCellValue("A{$i}", $cate[$gsn]['title'])
              ->setCellValue("B{$i}", $name)
              //->setCellValue("C{$i}", $tel)
              ->setCellValueExplicit("C{$i}", $tel , PHPExcel_Cell_DataType:: TYPE_STRING)
              ->setCellValue("D{$i}", $email)
              ->setCellValue("E{$i}", $birthday)
              ->setCellValue("F{$i}", $zip)
              ->setCellValue("G{$i}", $county)
              ->setCellValue("H{$i}", $city)
              ->setCellValue("I{$i}", $addr);
  $i++;
}


$objActSheet->mergeCells("A{$i}:H{$i}")->setCellValue("A{$i}", '通訊錄資料數共計');
$n=$i-1;
$objActSheet->setCellValue("I{$i}", "=COUNTA(B2:B{$n})");

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->protectCells("I{$i}", '12345');

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.iconv('UTF-8','Big5','通訊錄').'.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->setPreCalculateFormulas(false);
$objWriter->save('php://output');
exit;
?>

 

[1012]PHP進階開發及TadTools工具應用

14-2 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入'>
  <INPUT type='button' value='匯出 CSV' onClick=\"location.href='index.php?op=export'\">
  <INPUT type='button' value='匯出 Excel' onClick=\"location.href='excel.php'\">

  </form>


	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

14-3 上課範例:admin/excel.php(多表)

<?php
include_once "header_admin.php";
require_once '../class/PHPExcel.php';    //引入 PHPExcel 物件庫
require_once '../class/PHPExcel/IOFactory.php';    //引入 PHPExcel_IOFactory 物件庫
$objPHPExcel = new PHPExcel();  //實體化Excel
//----------內容-----------//

$objPHPExcel->setActiveSheetIndex(0);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

$objPHPExcel->setActiveSheetIndex(1);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄2");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

$objPHPExcel->setActiveSheetIndex(2);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄3");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

$objPHPExcel->setActiveSheetIndex(3);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄4");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改


$objPHPExcel->setActiveSheetIndex(0);  //設定預設顯示的工作表

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.iconv('UTF-8','Big5','通訊錄').'.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->setPreCalculateFormulas(false);
$objWriter->save('php://output');
exit;
?>

 

[1012]PHP進階開發及TadTools工具應用

15. 匯入Excel檔

一、 匯入Excel的表單

<form action='index.php' method='post' enctype='multipart/form-data'>
<INPUT type='file' name='importfile'>
<INPUT type='hidden' name='op' value='import_excel'>
<INPUT type='submit' value='匯入'>
</form>

二、 匯入Excel的方法

include_once '../class/PHPExcel/IOFactory.php';
$reader = PHPExcel_IOFactory::createReader('Excel5');
$PHPExcel = $reader->load( $_FILES['importfile']['tmp_name'] ); // 檔案名稱
$sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
$highestRow = $sheet->getHighestRow(); // 取得總列數
// 一次讀取一列
for ($row = 1; $row <= $highestRow; $row++) {
  $v="";
  //讀取一列中的每一格
  for ($col = 0; $col <= 8; $col++) {
    //格式檢查
    if( PHPExcel_Shared_Date::isDateTime( $sheet->getCellByColumnAndRow($col , $row ) )){
      $val = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCellByColumnAndRow( $col , $row )->getValue())->format('Y-m-d');
    }else{
      $val =  $sheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
    }
    if(!get_magic_quotes_runtime()) {
      $v[$col]=addSlashes($val);
    }
  }
  $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$v[0]}' , '{$v[1]}' , '{$v[2]}' , '{$v[3]}' , '{$v[4]}' , '{$v[5]}' , '{$v[6]}' , '{$v[7]}' , '{$v[8]}')";
  $xoopsDB->queryF($sql);
}

三、 Excel的對齊方向

$objActSheet->getStyle('A1:I1')->getAlignment()
->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
->setWrapText(true);

對齊的值有以下這些: HORIZONTAL_CENTER、 HORIZONTAL_CENTER_CONTINUOUS、 HORIZONTAL_GENERAL、 HORIZONTAL_JUSTIFY、 HORIZONTAL_LEFT、 HORIZONTAL_RIGHT、 VERTICAL_BOTTOM、 VERTICAL_CENTER、 VERTICAL_JUSTIFY、 VERTICAL_TOP

四、 Excel的邊框設定

$objBorder=$objActSheet->getDefaultStyle()->getBorders();
$objBorder->getBottom()
          ->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN)
          ->getColor()->setRGB('000000');
  1. getLeft()、getRight()、getBottom() 一樣比照辦理
  2. 邊框的值有:BORDER_DASHDOT、 BORDER_DASHDOTDOT、 BORDER_DASHED、 BORDER_DOTTED、 BORDER_DOUBLE、 BORDER_HAIR、 BORDER_MEDIUM、 BORDER_MEDIUMDASHDOT、 BORDER_MEDIUMDASHDOTDOT、 BORDER_MEDIUMDASHED、 BORDER_NONE、 BORDER_SLANTDASHDOT、 BORDER_THICK、 BORDER_THIN

五、 把數字轉換為A、B、C欄位的方法:

function num2alpha($n){
    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n%26 + 0x41) . $r;
    return $r;
}

六、 利用欄、列位置順序寫入內容:

$objActSheet->setCellValueByColumnAndRow($第N欄, $第N列 ,$內容);


 

[1012]PHP進階開發及TadTools工具應用

15-1 上課範例:admin/excel.php

<?php
include_once "header_admin.php";
require_once '../class/PHPExcel.php';    //引入 PHPExcel 物件庫
require_once '../class/PHPExcel/IOFactory.php';    //引入 PHPExcel_IOFactory 物件庫
$objPHPExcel = new PHPExcel();  //實體化Excel
//----------內容-----------//

$objPHPExcel->setActiveSheetIndex(0);  //設定預設顯示的工作表
$objActSheet = $objPHPExcel->getActiveSheet(); //指定預設工作表為 $objActSheet
$objActSheet->setTitle("通訊錄");  //設定標題
$objPHPExcel->createSheet(); //建立新的工作表,上面那三行再來一次,編號要改

$objActSheet->getColumnDimension('A')->setWidth(8);
$objActSheet->getColumnDimension('B')->setWidth(40);
$objActSheet->getColumnDimension('C')->setWidth(15);
$objActSheet->getColumnDimension('D')->setWidth(25);
$objActSheet->getColumnDimension('E')->setWidth(10);
$objActSheet->getColumnDimension('F')->setWidth(8);
$objActSheet->getColumnDimension('G')->setWidth(8);
$objActSheet->getColumnDimension('H')->setWidth(8);
$objActSheet->getColumnDimension('I')->setWidth(18);

//設定字型
$objActSheet->getStyle('A1:I1')->getFont()
            ->setName('SimHei')
            ->setSize('14');

//設定底色
$objActSheet->getStyle('A1:I1')->getFill()
            ->setFillType(PHPExcel_Style_Fill:: FILL_SOLID)
            ->getStartColor()
            ->setARGB('FFC9E3F3');

//設定對齊
$objActSheet->getStyle('A1:I1')->getAlignment()
            ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
            ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
            ->setWrapText(true);
            
//設定框線
$objBorder=$objActSheet->getDefaultStyle()->getBorders();
$objBorder->getBottom()
          ->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN)
          ->getColor()->setRGB('000000');
$objBorder->getRight()
          ->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN)
          ->getColor()->setRGB('000000');


$objActSheet->setCellValue("A1", '群組')
            ->setCellValue("B1", '姓名')
            ->setCellValue("C1", '電話')
            ->setCellValue("D1", '信箱')
            ->setCellValue("E1", '生日')
            ->setCellValue("F1", '郵遞區號')
            ->setCellValue("G1", '縣市')
            ->setCellValue("H1", '鄉鎮市區')
            ->setCellValue("I1", '地址');


$cate=get_contact_cate_all();

$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$i=2;
while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}

  $objActSheet->setCellValue("A{$i}", $gsn)
              ->setCellValue("B{$i}", $name)
              //->setCellValue("C{$i}", $tel)
              ->setCellValueExplicit("C{$i}", $tel , PHPExcel_Cell_DataType:: TYPE_STRING)
              ->setCellValue("D{$i}", $email)
              ->setCellValue("E{$i}", $birthday)
              ->setCellValue("F{$i}", $zip)
              ->setCellValue("G{$i}", $county)
              ->setCellValue("H{$i}", $city)
              ->setCellValue("I{$i}", $addr);
  $i++;
}


$objActSheet->mergeCells("A{$i}:H{$i}")->setCellValue("A{$i}", '通訊錄資料數共計');
$n=$i-1;
$objActSheet->setCellValue("I{$i}", "=COUNTA(B2:B{$n})");

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->protectCells("I{$i}", '12345');

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.iconv('UTF-8','Big5','通訊錄').'.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->setPreCalculateFormulas(false);
$objWriter->save('php://output');
exit;
?>

 

[1012]PHP進階開發及TadTools工具應用

15-2 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入 CSV'>
  <INPUT type='button' value='匯出 CSV' onClick=\"location.href='index.php?op=export'\">

  </form>


  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='importfile'>
  <INPUT type='hidden' name='op' value='import_excel'>
  <INPUT type='submit' value='匯入 Excel'>
  <INPUT type='button' value='匯出 Excel' onClick=\"location.href='excel.php'\">
  </form>


	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

//匯入Excel
function import_excel(){
  global $xoopsDB;

  include_once '../class/PHPExcel/IOFactory.php';
  $reader = PHPExcel_IOFactory::createReader('Excel5');
  $PHPExcel = $reader->load( $_FILES['importfile']['tmp_name'] ); // 檔案名稱
  $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
  $highestRow = $sheet->getHighestRow(); // 取得總列數
  // 一次讀取一列
  for($row = 1; $row <= $highestRow; $row++) {
    $v="";
    //讀取一列中的每一格
    for ($col = 0; $col <= 8; $col++) {
    
      //格式檢查
      if( PHPExcel_Shared_Date::isDateTime( $sheet->getCellByColumnAndRow($col , $row ) )){
        $val = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCellByColumnAndRow( $col , $row )->getValue())->format('Y-m-d');
      }else{
        $val =  $sheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
      }
      
      
      if(!get_magic_quotes_runtime()) {
        $v[$col]=addSlashes($val);
      }
      
    }
    
    if(!is_numeric($v[0]) or empty($v[0]))continue;
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$v[0]}' , '{$v[1]}' , '{$v[2]}' , '{$v[3]}' , '{$v[4]}' , '{$v[5]}' , '{$v[6]}' , '{$v[7]}' , '{$v[8]}')";
    $xoopsDB->queryF($sql);
  }
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  
  //匯入Excel
  case "import_excel":
  import_excel();
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

16. 用TCPDF產生PDF(上)

一、 安裝設定TCPDF

  1. 將tcpdf解壓放至模組的class下。
  2. 開啟config/tcpdf_config.php將PDF_FONT_NAME_MAIN及PDF_FONT_NAME_DATA的值helvetica改為msungstdlight,以正確使用中文。
  3. msungstdlight需有安裝Adobe Reader才能看到的中文字型。
  4. 可將Droid Sans Fallback字型解壓傳至fonts底下,即有droidsansfallback中黑體可用。
  5. 完整手冊:http://www.tcpdf.org/doc/code/classTCPDF.html

二、 建立PDF檔案

include_once "header.php";
require_once('class/tcpdf/config/lang/zho.php');
require_once('class/tcpdf/tcpdf.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  1. 「$orientation」頁面方向,預設為P(直式),橫向為L,空值則自動判斷
  2. 「$unit」度量單位,pt、mm(預設)、cm、in
  3. 「$format」紙張大小,預設為A4
  4. 「$unicode」是否使用unicode,預設為true
  5. 「$encoding」文件編碼,預設為UTF-8
  6. 「$diskcache」使用磁碟快取,true會減少記憶體用量,但效能會變差,預設為false
  7. 「$pdfa」使用PDF/A模式(長期保存的電子文件格式),預設為false。

三、 常用語法

$pdf->setPrintHeader(false); //不要頁首
$pdf->setPrintFooter(false); //不要頁尾
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);  //設定自動分頁
$pdf->setLanguageArray($l); //設定語言相關字串
$pdf->setFontSubsetting(true); //產生字型子集(有用到的字才放到文件中)
$pdf->SetFont('droidsansfallback', '', 12, '', true); //設定字型
$pdf->AddPage(); //新增頁面
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));//文字陰影
$pdf->writeHTML($html, $ln=1, $fill=0, $reseth=true, $cell =true, $align='');
$pdf->Output('contact.pdf', 'D');
  1. SetFont 的參數:
    1. 「$family」字型名稱
    2. 「$style」樣式:B粗、I斜、U底線、D刪除線、O上方線
    3. 「$size」字型大小(預設為12pt)
    4. 「$fontfile」字型檔
    5. 「$subset」使用文字子集
  2. writeHTML的參數如下(有支援的網頁標籤:a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul):
    1. 「$html」內容(屬性一定要用雙引號)
    2. 「$ln」下一個元件的位置:「0(預設)右邊;1下行最左邊;2目前元件下方」
    3. 「$fill」是否填色:「true為不透明;false透明」
    4. 「$reseth」若true會重設最後一格的高度
    5. 「$cell」自動增加內距
    6. 「$align」對齊方向:「L;C;R」。
  3. Output的參數如下:
    1. 「$name」檔名
    2. 「$dest」輸出模式:「I: 在瀏覽器中呈現 (預設);D: 強制下載(無法用中文檔名);F: 存在主機空間裡;S: 以文字方式傳回文件;FI: 等同F+I :FD: 等同F+D;E: 以郵件附件方式傳回文件。

四、 插入文字的方法

Cell($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign);
MultiCell($w, $h, $txt, $border, $align, $fill, $ln, $x, $y, $reseth, $stretch, $ishtml, $autopadding, $maxh, $valign, $fitcell);
writeHTMLCell($w, $h, $x, $y, $html, $border, $ln, $fill, $reseth, $align, autopadding);

各種參數:

  1. 「$w」寬
  2. 「$h」最小高度
  3. 「$border」框線:「0,1,T,R,B,L」
  4. 「$ln」下一個元件的位置:「0(預設)右邊;1下行最左邊;2目前元件下方」
  5. 「$align」對齊方向:「L,C,R,J」
  6. 「$fill」是否填色:「true為不透明;false透明」
  7. 「$link」加入連結
  8. 「$stretch」延伸:0不延伸;1字大於格寬才縮放文字;2一律縮放文字到格寬;3字大於格寬才縮放字距;4一律縮放字距到格寬、「$ignore_min_height」自動忽略最小高度
  9. 「$calign」格內對齊:「T格上,C格中,B格下,A字上,L字底,D字下」
  10. 「$valign」垂直對齊:「T,C,B」
  11. 「$reseth」若true會重設最後一格的高度
  12. 「$autopadding」自動調整內距
  13. 「$x、$y」左上角起始位置
  14. 「$ishtml」請設為false
  15. 「$maxh」高度上限(需>$h)
  16. 「$fitcell」自動縮放字大小到格內
  17. 「$html」內容(屬性一定要用雙引號)

[1012]PHP進階開發及TadTools工具應用

16-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入 CSV'>
  <INPUT type='button' value='匯出 CSV' onClick=\"location.href='index.php?op=export'\">

  </form>


  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='importfile'>
  <INPUT type='hidden' name='op' value='import_excel'>
  <INPUT type='submit' value='匯入 Excel'>
  <INPUT type='button' value='匯出 Excel' onClick=\"location.href='excel.php'\">
  </form>

  <INPUT type='button' value='匯出 PDF' onClick=\"location.href='pdf.php'\">

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

//匯入Excel
function import_excel(){
  global $xoopsDB;

  include_once '../class/PHPExcel/IOFactory.php';
  $reader = PHPExcel_IOFactory::createReader('Excel5');
  $PHPExcel = $reader->load( $_FILES['importfile']['tmp_name'] ); // 檔案名稱
  $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
  $highestRow = $sheet->getHighestRow(); // 取得總列數
  // 一次讀取一列
  for($row = 1; $row <= $highestRow; $row++) {
    $v="";
    //讀取一列中的每一格
    for ($col = 0; $col <= 8; $col++) {
    
      //格式檢查
      if( PHPExcel_Shared_Date::isDateTime( $sheet->getCellByColumnAndRow($col , $row ) )){
        $val = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCellByColumnAndRow( $col , $row )->getValue())->format('Y-m-d');
      }else{
        $val =  $sheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
      }
      
      
      if(!get_magic_quotes_runtime()) {
        $v[$col]=addSlashes($val);
      }
      
    }
    
    if(!is_numeric($v[0]) or empty($v[0]))continue;
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$v[0]}' , '{$v[1]}' , '{$v[2]}' , '{$v[3]}' , '{$v[4]}' , '{$v[5]}' , '{$v[6]}' , '{$v[7]}' , '{$v[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  
  
  //匯入Excel
  case "import_excel":
  import_excel();
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

16-2 上課範例:admin/pdf.php

<?php
include_once "header_admin.php";
require_once('../class/tcpdf/config/lang/zho.php');
require_once('../class/tcpdf/tcpdf.php');

//實體化PDF物件
$pdf = new TCPDF("L", PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->setPrintHeader(false); //不要頁首
$pdf->setPrintFooter(false); //不要頁尾

$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);  //設定自動分頁

$pdf->setLanguageArray($l); //設定語言相關字串

$pdf->setFontSubsetting(true); //產生字型子集(有用到的字才放到文件中)

$pdf->SetFont('droidsansfallback', '', 12, '', true); //設定字型

$pdf->AddPage(); //新增頁面

$pdf->setTextShadow(array('enabled'=>false, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));//文字陰影



$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$all_content="";
$cate=get_contact_cate_all();

while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}

	$all_content.="
	<tr>
		<td>{$cate[$gsn]['title']}</td>
		<td>{$name}</td>
		<td>{$tel}</td>
		<td>{$email}</td>
		<td>{$birthday}</td>
		<td>{$zip} {$county}{$city}{$addr}</td>
	</tr>
	";
}


$html="<h1>通訊錄</h1>
<table border=\"1\" cellpadding=\"4\">
	<tr bgcolor=\"#FFFF66\" align=\"center\">
		<th width=\"40\">群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th width=\"200\">地址</th>
	</tr>
	$all_content
</table>";

$pdf->writeHTML($html);

$pdf->Output('contact.pdf', 'I');

?>

 

[1012]PHP進階開發及TadTools工具應用

17. 用TCPDF產生PDF(下)

一、 設定頁首頁尾邊界

  1. SetMargins($left, $top, $right=-1, $keepmargins=false)
    • (1)  設定頁面邊界,預設$right的值會等於$left,$ keepmargins為true會覆蓋頁面預設邊界
  2. setHeaderMargin($hm=10):頁首上方與頁面頂端的距離
  3. setFooterMargin($fm=10):頁尾上方與頁面尾端的距離

二、 設定頁首頁尾

  1. 設定頁首:setHeaderData($ln='', $lw=0, $ht='', $hs='', $tc=array(0, 0, 0), $lc=array(0, 0, 0))、設定頁尾:setFooterData($tc=array(0, 0, 0), $lc=array(0, 0, 0))
    • (1)  $ln:頁首圖片檔名(圖片目錄預設在tcpdf/images,可修改tcpdf_config.php的K_PATH_IMAGES設定重設圖片目錄)
    • (2)  $lw:頁首圖片寬度,單位mm
    • (3)  $ht:頁首標題
    • (4)  $hs:頁首小字說明
    • (5)  $tc:文字顏色,RGB以陣列呈現,如:array(0,64,255)
    • (6)  $lc:頁首橫線顏色
  2. 頁首字型:setHeaderFont($font)、頁尾字型:setFooterFont($font)
    • (1)  $font為一個陣列,如:array('字型名稱','字型樣式','字型大小')

三、 複雜型表格

  1. A4=210 x 297mm = 595 X 842 px (72 dpi),1mm=2.83px,1px=0.35mm
  2. 左右合併 colspan=3,上下合併rowspan=4

四、 插入圖片(網頁方式)

  1. <img src="../images/logo_example.png" border="0" height="41" width="41" align="top" />
  2. 路徑不支援http://網址的方式,需改用相對路徑。似乎只是不支援「http://localhost/圖檔」,但有支援「http://網址/圖檔」的方式。

五、 插入圖片(物件方式)

  1. Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false, $alt=false, $altimgs=array())
    • (1)  $file:檔名或圖檔路徑
    • (2)  $x、$y:以左上角為起點的x,y座標位置
    • (3)  $w、$h:寬度、高度,若設0會自動偵測
    • (4)  $type:圖檔格式(大小寫不拘),支援GIF, JPEG, PNG, BMP, XBM, XPM等格式
    • (5)  $link:連結網址,或用AddLink()來新增連結
    • (6)  $align:對齊方向,T(上)、M(中)、B(下)、N(下一行)
    • (7)  $resize:若為true,會縮放原圖到$w 及 $h 指定的大小。
    • (8)  $dpi:縮放時用的解析度
    • (9)  $palign:水平對齊方向,L(左)、C(中)、R(右)
    • (10)  $ismask:若為true,則視該圖為遮罩
    • (11)  $imgmask:由此函數傳回圖片物件,或設為 false
    • (12)  $border:0(無邊框,預設)、1(加框)、L(左)、T(上)、R(右)、B(下),亦可用陣列來設定樣式,如:array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
    • (13)  $fitbox:若不為false,則縮放圖片至外層容器中,亦可用字元來指定縮放方式,如水平方向縮放 (L = 左, C = 中, R = 右) 或上下縮放(T =上, M =中, B =下)
    • (14)  $hidden:若為true,則不顯示圖片。
    • (15)  $fitonpage:如果為true,圖片大小調整為不超過頁面尺寸。
    • (16)  $alt:若為true,圖片將不會直接秀出,而是傳回圖片的ID。
    • (17)  $altimgs:交替顯示圖像的ID的數組。每個的替代圖像必須是一個數組,它有兩個值:一個整數,表示圖像ID(對圖像的方法的返回值)和一個布爾值,表示如果圖像是默認的打印。

[1012]PHP進階開發及TadTools工具應用

17-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'></script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='".TADTOOLS_URL."/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'></td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'></td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'></td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		<a href='pdf2.php?sn=$sn' class='link_button'>PDF</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入 CSV'>
  <INPUT type='button' value='匯出 CSV' onClick=\"location.href='index.php?op=export'\">

  </form>


  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='importfile'>
  <INPUT type='hidden' name='op' value='import_excel'>
  <INPUT type='submit' value='匯入 Excel'>
  <INPUT type='button' value='匯出 Excel' onClick=\"location.href='excel.php'\">
  </form>

  <INPUT type='button' value='匯出 PDF' onClick=\"location.href='pdf.php'\">
  <INPUT type='button' value='匯出所有單張 PDF' onClick=\"location.href='pdf_all.php'\">

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected":"";
			$selected.=(in_array($level , $unselect))?"disabled=disabled":"";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

//匯入Excel
function import_excel(){
  global $xoopsDB;

  include_once '../class/PHPExcel/IOFactory.php';
  $reader = PHPExcel_IOFactory::createReader('Excel5');
  $PHPExcel = $reader->load( $_FILES['importfile']['tmp_name'] ); // 檔案名稱
  $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
  $highestRow = $sheet->getHighestRow(); // 取得總列數
  // 一次讀取一列
  for($row = 1; $row <= $highestRow; $row++) {
    $v="";
    //讀取一列中的每一格
    for ($col = 0; $col <= 8; $col++) {
    
      //格式檢查
      if( PHPExcel_Shared_Date::isDateTime( $sheet->getCellByColumnAndRow($col , $row ) )){
        $val = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCellByColumnAndRow( $col , $row )->getValue())->format('Y-m-d');
      }else{
        $val =  $sheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
      }
      
      
      if(!get_magic_quotes_runtime()) {
        $v[$col]=addSlashes($val);
      }
      
    }
    
    if(!is_numeric($v[0]) or empty($v[0]))continue;
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$v[0]}' , '{$v[1]}' , '{$v[2]}' , '{$v[3]}' , '{$v[4]}' , '{$v[5]}' , '{$v[6]}' , '{$v[7]}' , '{$v[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  
  
  //匯入Excel
  case "import_excel":
  import_excel();
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

17-2 上課範例:admin/pdf2.php

<?php
include_once "header_admin.php";
include_once "../up_file.php";
require_once('../class/tcpdf/config/lang/zho.php');
require_once('../class/tcpdf/tcpdf.php');

$sn=empty($_REQUEST['sn'])?"0":intval($_REQUEST['sn']);

//實體化PDF物件
$pdf = new TCPDF("P", PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
//$pdf->setPrintHeader(false); //不要頁首
//$pdf->setPrintFooter(false); //不要頁尾

$pdf->SetMargins(25, 25);
$pdf->setHeaderMargin(5);
$pdf->setFooterMargin(10);

$pdf->setHeaderData('ck2.jpg', 40, '我的通訊錄', 'http://163.26.52.243/~tad0616/modules/contact', array(27,49,0), array(71,71,70));
$pdf->setFooterData(array(27,49,0), array(71,71,70));
$pdf->setHeaderFont(array('droidsansfallback','B','14'));
$pdf->setFooterFont(array('droidsansfallback','I','16'));

$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);  //設定自動分頁

$pdf->setLanguageArray($l); //設定語言相關字串

$pdf->setFontSubsetting(true); //產生字型子集(有用到的字才放到文件中)

$pdf->SetFont('droidsansfallback', '', 12, '', true); //設定字型

$pdf->AddPage(); //新增頁面

$pdf->setTextShadow(array('enabled'=>false, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));//文字陰影


$sql = "select * from `".$xoopsDB->prefix("contact")."` where sn='$sn'";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$all_content="";
$cate=get_contact_cate_all();

$all=$xoopsDB->fetchArray($result);
//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
foreach($all as $k=>$v){
	$$k=$v;
}

$photo_file=get_pic_file('photo' , $sn , 1);
$photo="<img src=\"{$photo_file}\">";

$html="<h1>「{$name}」通訊錄</h1>
<table border=\"1\" cellpadding=\"4\">
<tr><th width=\"50\" align=\"center\" bgcolor=\"#CCFF66\">電話</th><td width=\"200\">{$tel}</td>
<td width=\"200\" rowspan=\"4\">$photo</td></tr>
<tr><th align=\"center\" bgcolor=\"#CCFF66\">信箱</th><td>{$email}</td></tr>
<tr><th align=\"center\" bgcolor=\"#CCFF66\">生日</th><td>{$birthday}</td></tr>
<tr><th align=\"center\" bgcolor=\"#CCFF66\">地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
</table>";

$pdf->writeHTML($html);

include_once XOOPS_ROOT_PATH."/modules/tadtools/qrcode/qrcode.php";
$a = new QR("Email:{$email}");
file_put_contents(XOOPS_ROOT_PATH."/uploads/qrcode/{$sn}.gif",$a->image(2));

  
$pdf->Image(XOOPS_URL."/uploads/qrcode/{$sn}.gif", 150, 22 , 15, 15, 'gif');


$pdf->Output('contact.pdf', 'I');



?>

 

[1012]PHP進階開發及TadTools工具應用

17-3 上課範例:admin/pdf_all.php

<?php
include_once "header_admin.php";
include_once "../up_file.php";
require_once('../class/tcpdf/config/lang/zho.php');
require_once('../class/tcpdf/tcpdf.php');

$sn=empty($_REQUEST['sn'])?"0":intval($_REQUEST['sn']);

//實體化PDF物件
$pdf = new TCPDF("L", PDF_UNIT, "A5", true, 'UTF-8', false);
//$pdf->setPrintHeader(false); //不要頁首
//$pdf->setPrintFooter(false); //不要頁尾

$pdf->SetMargins(25, 25);
$pdf->setHeaderMargin(5);
$pdf->setFooterMargin(10);

$pdf->setHeaderData('ck2.jpg', 40, '我的通訊錄', 'http://163.26.52.243/~tad0616/modules/contact', array(27,49,0), array(71,71,70));
$pdf->setFooterData(array(27,49,0), array(71,71,70));
$pdf->setHeaderFont(array('droidsansfallback','B','14'));
$pdf->setFooterFont(array('droidsansfallback','I','16'));

$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);  //設定自動分頁

$pdf->setLanguageArray($l); //設定語言相關字串

$pdf->setFontSubsetting(true); //產生字型子集(有用到的字才放到文件中)

$pdf->SetFont('droidsansfallback', '', 12, '', true); //設定字型



$sql = "select * from `".$xoopsDB->prefix("contact")."`";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$all_content="";
$cate=get_contact_cate_all();

while($all=$xoopsDB->fetchArray($result)){
  //以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
  foreach($all as $k=>$v){
  	$$k=$v;
  }

  $pdf->AddPage(); //新增頁面

  $pdf->setTextShadow(array('enabled'=>false, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));//文字陰影


  $photo_file=get_pic_file('photo' , $sn , 1);
  $photo=empty($photo_file)?"":"<img src=\"{$photo_file}\">";

  $html="<h1>「{$name}」通訊錄</h1>
  <table border=\"1\" cellpadding=\"4\">
  <tr><th width=\"50\" align=\"center\" bgcolor=\"#CCFF66\">電話</th><td width=\"200\">{$tel}</td>
  <td width=\"200\" rowspan=\"4\">$photo</td></tr>
  <tr><th align=\"center\" bgcolor=\"#CCFF66\">信箱</th><td>{$email}</td></tr>
  <tr><th align=\"center\" bgcolor=\"#CCFF66\">生日</th><td>{$birthday}</td></tr>
  <tr><th align=\"center\" bgcolor=\"#CCFF66\">地址</th><td>{$zip} {$county}{$city}{$addr}</td></tr>
  </table>";

  $pdf->writeHTML($html);

  include_once XOOPS_ROOT_PATH."/modules/tadtools/qrcode/qrcode.php";
  $a = new QR("Email:{$email}");
  file_put_contents(XOOPS_ROOT_PATH."/uploads/qrcode/{$sn}.gif",$a->image(2));


  $pdf->Image(XOOPS_URL."/uploads/qrcode/{$sn}.gif", 170, 22 , 15, 15, 'gif');

}
$pdf->Output('contact.pdf', 'I');



?>

 

[1012]PHP進階開發及TadTools工具應用

18. 產出真實word檔

一、 關於phpWord(http://phpword.codeplex.com)

  1. PHPWord和PHPExcel是同一個單位所寫出的PHP物件,可用來產生docx檔。
  2. 需要的環境如下:PHP 5.2.x 以上、ZipArchive、xmllib等PHP衍生函式庫
  3. 若是您的Office是2007以下,那麼可能需要Microsoft Office Compatibility Packhttp://www.microsoft.com/zh-tw/download/details.aspx?id=3)才能開啟之(共37.2MB)。PHPWord無法產生2003的doc檔(因為非公開格式)。

二、 讓phpWord支援中文

  1.  打開打開子目錄phpword/Writer/Word2007/Base.php,在310行之後多加一行:
    if($font != 'Arial') {
      $objWriter->writeAttribute('w:eastAsia', $font);
      $objWriter->startElement('w:rFonts');
  2. 搜尋utf8_encode,將之註解或刪除。(此法僅適用於網站為UTF-8者)。Big5請用$text = iconv('big5','utf-8',$text); 方法處理之。

三、 基本結構

<?php
require_once '../class/PHPWord.php';
$PHPWord = new PHPWord();
$section = $PHPWord->createSection();
$section->addText('通訊錄');
header('Content-Type: application/vnd.ms-word');
header('Content-Disposition: attachment;filename=通訊錄.docx');
header('Cache-Control: max-age=0');
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('php://output');
?>


四、 常用功能

$PHPWord->setDefaultFontName('標楷體'); //設定預設字型
$PHPWord->setDefaultFontSize(12);     //設定預設字型大小

$sectionStyle = array('orientation' => null,  'marginLeft' => 900); //頁面設定(orientation 的值可以是橫向landscape或直向portrait。設定項目有:orientation、marginTop、marginLeft、marginRight、marginBottom、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor)
$section = $PHPWord->createSection([$sectionStyle]); //建立一個頁面

$fontStyle = array('color'=>'006699', 'size'=>18, 'bold'=>true); //文字樣式設定(可用的文字設定:size、name、bold、italic、superScript、subScript、underline、Color、fgColor)
$paragraphStyle=array('align' => 'both', 'spaceAfter'=>300);  //段落設定(可用設定:align、spaceBefore、spaceAfter、spacing)
$section->addText('內容', [$fontStyle], [$paragraphStyle] );  //新增文字段落

$section->addTextBreak(2); //換行,可指定換幾行
$section->addPageBreak();  //換頁

$listStyle = array('listType' => PHPWord_Style_ListItem::TYPE_NUMBER); //設定有序(TYPE_NUMBER)或無序(TYPE_BULLET_FILLED)清單
$section->addListItem( $text, [$depth], [$fontStyle], [$listStyle], [$paragraphStyle] ); //新增清單項目,$depth為階層,從0開始。

$section->addLink( $linkSrc, [$linkName], [$fontStyle], [$paragraphStyle]); //加入超連結
$section->addImage( $src, [$style] ); //插入圖片(可用設定:width、height、align,單位為px)

$PHPWord->addTitleStyle( $titleCount, [$fontStyle] ); //設定標題樣式 $titleCount 是指標題幾
$section->addTitle( $text, [$depth] ); //新增標題($depth會對應$titleCount)

$styleTable = array('borderColor'=>'006699', 'borderSize'=>6, 'cellMargin'=>50); //表格樣式(可用設定:cellMarginTop、cellMarginLeft、cellMarginRight、cellMarginBottom、cellMargin、bgColor、 borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor、borderInsideHSize、borderInsideHColor、borderInsideVSize、borderInsideVColor、borderSize、borderColor)
$styleFirstRow = array('bgColor'=>'66BBFF'); //首行樣式
$PHPWord->addTableStyle('myTable', $styleTable, $styleFirstRow); //建立表格樣式
$table = $section->addTable('myTable');//建立表格

$table->addRow(); //新增一列

$cellStyle =array('textDirection'=>PHPWord_Style_Cell::TEXT_DIR_BTLR, 'bgColor'=>'C0C0C0'); //儲存格樣式(設定項:valign、textDirection、bgColor、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor)
$table->addCell(2000, [$cellStyle])->addText('內容'); //新增一格


 

[1012]PHP進階開發及TadTools工具應用

18-1 上課範例:admin/index.php

<?php

/*-----------引入檔案區--------------*/
include_once "header_admin.php";
include_once "../up_file.php";
/*-----------function區--------------*/
//contact編輯表單
function contact_form($sn=""){
	global $xoopsDB,$xoopsUser;

	//抓取預設值
	if(!empty($sn)){
		$DBV=get_contact($sn);
	}else{
		$DBV=array();
	}

	//預設值設定

	//設定「tel」欄位預設值
	$tel=(!isset($DBV['tel']))?"":$DBV['tel'];

	//設定「email」欄位預設值
	$email=(!isset($DBV['email']))?"":$DBV['email'];

	//設定「name」欄位預設值
	$name=(!isset($DBV['name']))?"":$DBV['name'];

	//設定「gsn」欄位預設值
	$gsn=(!isset($DBV['gsn']))?null:$DBV['gsn'];

	//設定「sn」欄位預設值
	$sn=(!isset($DBV['sn']))?$sn:$DBV['sn'];

	//設定「birthday」欄位預設值
	$birthday=(!isset($DBV['birthday']))?"":$DBV['birthday'];

	//設定「zip」欄位預設值
	$zip=(!isset($DBV['zip']))?"":$DBV['zip'];

	//設定「county」欄位預設值
	$county=(!isset($DBV['county']))?"":$DBV['county'];

	//設定「city」欄位預設值
	$city=(!isset($DBV['city']))?"":$DBV['city'];

	//設定「addr」欄位預設值
	$addr=(!isset($DBV['addr']))?"":$DBV['addr'];

	$op=(empty($sn))?"insert_contact":"update_contact";


  $jquery=get_jquery();
  
  include_once XOOPS_ROOT_PATH."/modules/tadtools/formValidator.php";
  $formValidator= new formValidator("#myForm",false);
  $formValidator_code=$formValidator->render();

	$main="
	$jquery
	$formValidator_code
  <script type='text/javascript' src='".TADTOOLS_URL."/My97DatePicker/WdatePicker.js'></script>
  <script language='javascript' src='../class/twzipcode-1.3.1.js'> </script>
	<script type='text/javascript'>
  $(document).ready(function(){
    $.post('ajax.php' , function(data){
      $('#menu1').html(data);
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#menu1').change(function(){
      $.post('ajax.php' , {parent_gsn: $('#menu1').val()} , function(data){
        $('#menu2').html(data);
      });
    });
    
    $('#AddrForm').twzipcode({
      countyName: 'county',
      areaName: 'city',
      zipName: 'zip',
      countySel: '$county',
      areaSel: '$city',
      zipSel: '$zip',
      zipReadonly: false
    });
  });
  </script>
	<script src='" .TADTOOLS_URL. "/multiple-file-upload/jquery.MultiFile.js'></script>
	<form action='{$_SERVER['PHP_SELF']}' method='post' id='myForm' enctype='multipart/form-data'>
	
	<table class='form_tbl'>

	<!--群組-->
	<tr><td class='title' nowrap>群組</td>
	<td class='col'>
	<select id='menu1'></select>
	<select name='gsn' id='menu2'></select>
	</td></tr>

	<!--姓名-->
	<tr><td class='title' nowrap>姓名</td>
	<td class='col'><input type='text' name='name' size='20' value='{$name}' id='name' class='validate[required,minSize[2],maxSize[10]]'> </td></tr>


	<!--電話-->
	<tr><td class='title' nowrap>電話</td>
	<td class='col'><input type='text' name='tel' size='20' value='{$tel}' id='tel' class='validate[required,custom[phone]]'> </td></tr>

	<!--信箱-->
	<tr><td class='title' nowrap>信箱</td>
	<td class='col'><input type='text' name='email' size='20' value='{$email}' id='email'  class='validate[required,custom[email]]'> </td></tr>
	
	
	<!--生日-->
	<tr><td class='title' nowrap>生日</td>
	<td class='col'><input type='text' name='birthday' size='20' value='{$birthday}' id='birthday' onClick=\"WdatePicker({dateFmt:'yyyy-MM-dd' , isShowWeek:true , skin:'whyGreen' , maxDate:'%y-%M-%d' , readOnly: true , isShowClear: false , firstDayOfWeek:1})\" class='Wdate'></td></tr>

	<!--上傳-->
	<tr><td class='title' nowrap>上傳圖片</td>
	<td class='col'>
  <input type='file' name='upfile[]' class='multi' maxlength='1' accept='gif|jpg|png|GIF|JPG|PNG'>".
list_del_file('photo',$sn)."
  </td></tr>


	<!--上傳-->
	<tr><td class='title' nowrap>上傳相關檔案</td>
	<td class='col'>
  <input type='file' name='docs[]' class='multi' >".
list_del_file('files',$sn)."
  </td></tr>



	<!--地址-->
	<tr><td class='title' nowrap>地址</td>
	<td class='col'>
	<div style='position:relative;'>
   <span id='AddrForm'></span>
   <input type='text' name='addr' size='30' value='{$addr}' id='addr'>
  </div>
  </td></tr>

	<tr>
		<td class='bar' colspan='2'>

    	<!--編號-->
    	<input type='hidden' name='sn' value='{$sn}'>

			<input type='hidden' name='op' value='{$op}'>
			<input type='submit' value='儲存'>
		</td>
	</tr>
	</table>
	</form>";

	//raised,corners,inset
	$main=div_3d("通訊錄管理",$main,"raised");

	return $main;
}



//新增資料到contact中
function insert_contact(){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "insert into `".$xoopsDB->prefix("contact")."`
	(`tel` , `email` , `name` , `gsn` , `birthday` , `zip` , `county` , `city` , `addr`)
	values('{$_POST['tel']}' , '{$_POST['email']}' , '{$_POST['name']}' , '{$_POST['gsn']}' , '{$_POST['birthday']}' , '{$_POST['zip']}' , '{$_POST['county']}' , '{$_POST['city']}' , '{$_POST['addr']}')";
	$xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	//取得最後新增資料的流水編號
	$sn = $xoopsDB->getInsertId();
	
	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//更新contact某一筆資料
function update_contact($sn=""){
	global $xoopsDB,$xoopsUser;


	$myts =& MyTextSanitizer::getInstance();
	$_POST['tel']=$myts->addSlashes($_POST['tel']);
	$_POST['email']=$myts->addSlashes($_POST['email']);
	$_POST['name']=$myts->addSlashes($_POST['name']);
	$_POST['birthday']=$myts->addSlashes($_POST['birthday']);
	$_POST['zip']=$myts->addSlashes($_POST['zip']);
	$_POST['county']=$myts->addSlashes($_POST['county']);
	$_POST['city']=$myts->addSlashes($_POST['city']);
	$_POST['addr']=$myts->addSlashes($_POST['addr']);


	$sql = "update `".$xoopsDB->prefix("contact")."` set
	 `tel` = '{$_POST['tel']}' ,
	 `email` = '{$_POST['email']}' ,
	 `name` = '{$_POST['name']}' ,
	 `gsn` = '{$_POST['gsn']}' ,
	 `birthday` = '{$_POST['birthday']}' ,
	 `zip` = '{$_POST['zip']}' ,
	 `county` = '{$_POST['county']}' ,
	 `city` = '{$_POST['city']}' ,
	 `addr` = '{$_POST['addr']}'
	where `sn` = '$sn'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	

	upload_file('photo' , $sn , '400');
	upload_file('files' , $sn , '400' , 'docs');
	return $sn;
}

//列出所有contact資料
function list_contact($show_function=1){
	global $xoopsDB , $xoopsModule , $isAdmin;
	
  //製作選項
	$sql = "select gsn,title from `".$xoopsDB->prefix("contact_cate")."` where parent_gsn!='0' order by sort";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	while(list($gsn,$title)=$xoopsDB->fetchRow($result)){
    $cate_arr[]="'$gsn':'$title'";
  }
	$cate_option=implode(" , ",$cate_arr);

	
	include_once XOOPS_ROOT_PATH."/modules/tadtools/jeditable.php";
  $file="save.php";
  $jeditable = new jeditable();
  //$jeditable->setTextCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setTextAreaCol("#id",$file,'140px','12px',"{'sn':$sn,'op' : 'save'}","點擊編輯");
  //$jeditable->setSelectCol("#id",$file,"{'boy':'男生' , 'girl':'女生'}","{'sn' : $sn , 'op' : 'save'}","點擊編輯");
  
	

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

	$function_title=($show_function)?"<th>功能</th>":"";

	$all_content="";

	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

		$fun=($show_function)?"
		<td>
		<a href='{$_SERVER['PHP_SELF']}?op=contact_form&sn=$sn' class='link_button'>編輯</a>
		<a href=\"javascript:delete_contact_func($sn);\" class='link_button'>刪除</a>
		<a href='pdf2.php?sn=$sn' class='link_button'>PDF</a>
		</td>":"";

    $jeditable->setSelectCol("#gsn_{$sn}",$file,"{{$cate_option}}","{'sn' : $sn , 'col' : 'gsn'}");
    $jeditable->setTextCol("#name_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'name'}");
    $jeditable->setTextCol("#email_{$sn}",$file,'100px','12px',"{'sn':$sn , 'col' : 'email'}");

		$cate=get_contact_cate_all();

    $file_counter1=get_file_amount('photo' , $sn);
    $file_counter2=get_file_amount('files' , $sn);
    
		$all_content.="
		<tr>
			<td id='gsn_{$sn}'>{$cate[$gsn]['title']}</td>
			<td id='name_{$sn}'>{$name}</td>
			<td>{$tel}</td>
			<td id='email_{$sn}'>{$email}</td>
			<td>{$birthday}</td>
			<td>{$zip}</td>
			<td>{$county}</td>
			<td>{$city}</td>
			<td>{$addr}</td>
			<td>{$file_counter1}</td>
			<td>{$file_counter2}</td>
			$fun
		</tr>
		";
	}

  $jeditable_set=$jeditable->render();
  
	//if(empty($all_content))return "";

	$add_button=($show_function)?"<a href='{$_SERVER['PHP_SELF']}?op=contact_form' class='link_button_r'>新增</a>":"";

	//刪除確認的JS
	$main="
	$jeditable_set
	
	<script>
	function delete_contact_func(sn){
		var sure = window.confirm('確定刪除此資料?');
		if (!sure)	return;
		location.href=\"{$_SERVER['PHP_SELF']}?op=delete_contact&sn=\" + sn;
	}
	</script>
	
	
  批次匯入:
  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='userfile'>
  <INPUT type='hidden' name='op' value='import'>
  <INPUT type='submit' value='匯入 CSV'>
  <INPUT type='button' value='匯出 CSV' onClick=\"location.href='index.php?op=export'\">

  </form>


  <form action='index.php' method='post' enctype='multipart/form-data'>
  <INPUT type='file' name='importfile'>
  <INPUT type='hidden' name='op' value='import_excel'>
  <INPUT type='submit' value='匯入 Excel'>
  <INPUT type='button' value='匯出 Excel' onClick=\"location.href='excel.php'\">
  </form>

  <INPUT type='button' value='匯出 PDF' onClick = \"location.href='pdf.php'\">
  <INPUT type='button' value='匯出所有單張 PDF' onClick = \"location.href='pdf_all.php'\">
  <INPUT type='button' value='匯出 docx' onClick = \"location.href='docx.php'\">

	<table summary='list_table' id='tbl' style='width:100%;'>
	<tr>
		<th>群組</th>
		<th>姓名</th>
		<th>電話</th>
		<th>信箱</th>
		<th>生日</th>
		<th>郵遞區號</th>
		<th>縣市</th>
		<th>鄉鎮市區</th>
		<th>地址</th>
		<th>相片</th>
		<th>檔案數</th>
		$function_title
	</tr>

	<tbody>
	$all_content
	</tbody>

	<tr>
		<td colspan=11 class='bar'>
		{$add_button}
		</td>
	</tr>
	</table>";

	//raised,corners,inset
	$main=div_3d("",$main,"corners");

	return $main;
}


//以流水號取得某筆contact資料
function get_contact($sn=""){
	global $xoopsDB;
	if(empty($sn))return;
	$sql = "select * from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	$data=$xoopsDB->fetchArray($result);
	return $data;
}

//刪除contact某筆資料資料
function delete_contact($sn=""){
	global $xoopsDB , $isAdmin;
	$sql = "delete from `".$xoopsDB->prefix("contact")."` where `sn` = '{$sn}'";
	$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
	
	del_files('' , 'photo' , $sn);
	del_files('' , 'files' , $sn);
}


//取得所有contact_cate分類選單的選項(模式 = edit[編輯用] or show[顯示用],目前分類編號,目前分類的所屬編號)
function get_contact_cate_options($mode='show' , $default_gsn="0" , $default_parent_gsn="0" , $unselect_level="" , $start_search_sn="0" , $level=0){
	global $xoopsDB , $xoopsModule;
	$sql = "select `gsn` , `title` from `".$xoopsDB->prefix("contact_cate")."` where `parent_gsn` = '{$start_search_sn}' order by `sort`";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'] , 3, mysql_error());

	$prefix=str_repeat("&nbsp;&nbsp;" , $level);
	$level++;

	$unselect=explode("," , $unselect_level);

	$main="";
	while(list($gsn , $title)=$xoopsDB->fetchRow($result)){
		if($mode=="edit"){
			$selected=($gsn==$default_parent_gsn)?"selected=selected":"";
			$selected.=($gsn==$default_gsn)?"disabled=disabled" : "";
			$selected.=(in_array($level , $unselect))?"disabled=disabled" : "";
		}else{
			$selected=($gsn==$default_gsn)?"selected=selected" : "";
			$selected.=(in_array($level , $unselect))?"disabled=disabled" : "";
		}
		$main.="<option value=$gsn $selected>{$prefix}{$title}</option>";
		$main.=get_contact_cate_options($mode , $default_gsn , $default_parent_gsn , $unselect_level , $gsn , $level);

	}
	return $main;
}


//匯入
function import(){
  global $xoopsDB;
  
  //$main="<table>";
  $handle = fopen($_FILES['userfile']['tmp_name'], "r") or die("無法開啟");

  while (($data = __fgetcsv($handle, 1000)) !== FALSE) {

    //判斷格式
    if(!is_numeric($data[0])){
      continue;
    }
    
    $data[1]=mb_convert_encoding($data[1], "UTF-8" , "Big5");
    $data[6]=iconv("Big5" , "UTF-8" , $data[6]);
    $data[7]=iconv("Big5" , "UTF-8" , $data[7]);
    $data[8]=iconv("Big5" , "UTF-8" , $data[8]);
    
    /*
    $main.="
    <tr>
    <td>{$data[0]}</td>
    <td>{$data[1]}</td>
    <td>{$data[2]}</td>
    <td>{$data[3]}</td>
    <td>{$data[4]}</td>
    <td>{$data[5]}</td>
    <td>{$data[6]}</td>
    <td>{$data[7]}</td>
    <td>{$data[8]}</td>
    </tr>
    ";
    */
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$data[0]}' , '{$data[1]}' , '{$data[2]}' , '{$data[3]}' , '{$data[4]}' , '{$data[5]}' , '{$data[6]}' , '{$data[7]}' , '{$data[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
  fclose($handle);
  //$main.="</table>";
  
  return $main;
}

function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = "";
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

//匯出函數
function export(){
  global $xoopsDB;

	$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
	$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

  $main="gsn,name,tel,email,birthday,zip,county,city,addr\n";
	while($all=$xoopsDB->fetchArray($result)){
		//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
		foreach($all as $k=>$v){
			$$k=$v;
		}

    $name=iconv("UTF-8" , "Big5" , $name);
    $county=iconv("UTF-8" , "Big5" , $county);
    $city=iconv("UTF-8" , "Big5" , $city);
    $addr=iconv("UTF-8" , "Big5" , $addr);
		
		$main.="$gsn,$name,$tel,$email,$birthday,$zip,$county,$city,$addr\n";
  }
  
  header("Content-type: text/x-csv");
  header("Content-Disposition: attachment; filename=contact.csv");
  echo $main;
  exit;
}

//匯入Excel
function import_excel(){
  global $xoopsDB;

  include_once '../class/PHPExcel/IOFactory.php';
  $reader = PHPExcel_IOFactory::createReader('Excel5');
  $PHPExcel = $reader->load( $_FILES['importfile']['tmp_name'] ); // 檔案名稱
  $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
  $highestRow = $sheet->getHighestRow(); // 取得總列數
  // 一次讀取一列
  for($row = 1; $row <= $highestRow; $row++) {
    $v="";
    //讀取一列中的每一格
    for ($col = 0; $col <= 8; $col++) {
    
      //格式檢查
      if( PHPExcel_Shared_Date::isDateTime( $sheet->getCellByColumnAndRow($col , $row ) )){
        $val = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCellByColumnAndRow( $col , $row )->getValue())->format('Y-m-d');
      }else{
        $val =  $sheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
      }
      
      
      if(!get_magic_quotes_runtime()) {
        $v[$col]=addSlashes($val);
      }
      
    }
    
    if(!is_numeric($v[0]) or empty($v[0]))continue;
    
    $sql = "insert into `".$xoopsDB->prefix("contact")."` (`gsn` , `name` , `tel` , `email` , `birthday` , `zip` , `county` , `city` , `addr`) values('{$v[0]}' , '{$v[1]}' , '{$v[2]}' , '{$v[3]}' , '{$v[4]}' , '{$v[5]}' , '{$v[6]}' , '{$v[7]}' , '{$v[8]}')";
    $xoopsDB->queryF($sql) or die($sql);
  }
}

/*-----------執行動作判斷區----------*/
$op = empty($_REQUEST['op'])? "":$_REQUEST['op'];
$sn=empty($_REQUEST['sn'])?"":intval($_REQUEST['sn']);
$gsn=empty($_REQUEST['gsn'])?"":intval($_REQUEST['gsn']);
$files_sn=empty($_REQUEST['files_sn'])?"":intval($_REQUEST['files_sn']);


switch($op){
	/*---判斷動作請貼在下方---*/

  //新增資料
  case "insert_contact":
  $sn=insert_contact();
  header("location: {$_SERVER['PHP_SELF']}?sn=$sn");
  break;

  //更新資料
  case "update_contact":
  update_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //輸入表格
  case "contact_form":
  $main=contact_form($sn);
  break;

  //刪除資料
  case "delete_contact":
  delete_contact($sn);
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯入
  case "import":
  import();
  header("location: {$_SERVER['PHP_SELF']}");
  break;
  
  //匯出
  case "export":
  export();
  break;
  
  
  //匯入Excel
  case "import_excel":
  import_excel();
  header("location: {$_SERVER['PHP_SELF']}");
  break;

  //預設動作
  default:
  $main=list_contact();
  break;

	
	/*---判斷動作請貼在上方---*/
}

/*-----------秀出結果區--------------*/
module_admin_footer($main,0);

?>

 

[1012]PHP進階開發及TadTools工具應用

18-2 上課範例:admin/docx.php

<?php
include_once "header_admin.php";
require_once '../class/PHPWord.php';
$PHPWord = new PHPWord();
//$PHPWord->setDefaultFontName('標楷體'); //設定預設字型
$PHPWord->setDefaultFontSize(12);     //設定預設字型大小

//頁面設定(orientation 的值可以是橫向 landscape 或直向portrait。設定項目有:orientation、marginTop、marginLeft、marginRight、marginBottom、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor)
$sectionStyle = array('orientation' => 'landscape');
$section = $PHPWord->createSection($sectionStyle);

$fontStyle = array('color'=>'660000', 'size'=>20, 'bold'=>true);
//文字樣式設定(可用的文字設定:size、name、bold、italic、superScript、subScript、underline、Color、fgColor)

$PHPWord->addTitleStyle( 1, $fontStyle ); //設定標題樣式 $titleCount 是指標題幾
$section->addTitle( "我的通訊錄列表", 1); //新增標題($depth會對應$titleCount)


$styleTable = array('borderColor'=>'000000', 'borderSize'=>6, 'cellMargin'=>50);
//表格樣式(可用設定:cellMarginTop、cellMarginLeft、cellMarginRight、cellMarginBottom、cellMargin、bgColor、 borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor、borderInsideHSize、borderInsideHColor、borderInsideVSize、borderInsideVColor、borderSize、borderColor)
$styleFirstRow = array('bgColor'=>'66BBFF'); //首行樣式
$PHPWord->addTableStyle('myTable', $styleTable, $styleFirstRow); //建立表格樣式
$table = $section->addTable('myTable');//建立表格

$table->addRow(); //新增一列

//$cellStyle =array('bgColor'=>'C0C0C0');
$cellStyle='';
//儲存格樣式(設定項:valign、textDirection、bgColor、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor)
$table->addCell(1000, $cellStyle)->addText('群組');
$table->addCell(5000, $cellStyle)->addText('姓名');
$table->addCell(2000, $cellStyle)->addText('電話');
$table->addCell(2000, $cellStyle)->addText('信箱');
$table->addCell(3000, $cellStyle)->addText('生日');
$table->addCell(9000, $cellStyle)->addText('地址');



$sql = "select * from `".$xoopsDB->prefix("contact")."` ";
$result = $xoopsDB->query($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());

$cate=get_contact_cate_all();

while($all=$xoopsDB->fetchArray($result)){
	//以下會產生這些變數: $tel , $email , $name , $gsn , $sn , $birthday , $zip , $county , $city , $addr
	foreach($all as $k=>$v){
		$$k=$v;
	}

  $table->addRow(); //新增一列
  $table->addCell(1000, $cellStyle)->addText($cate[$gsn]['title']);
  $table->addCell(5000, $cellStyle)->addText($name);
  $table->addCell(2000, $cellStyle)->addText($tel);
  $table->addCell(2000, $cellStyle)->addText($email);
  $table->addCell(3000, $cellStyle)->addText($birthday);
  $table->addCell(9000, $cellStyle)->addText("{$zip} {$county}{$city}{$addr}");

}

/*
$section->addText('款式新穎的牛仔褲、牛仔裙穿了幾年後,通常就會被遺忘拋棄在衣櫃的深處,或是進了舊衣回收桶中。但對於來自英國的藝術家伊恩‧貝瑞(Ian Berry)來說,這些丹寧布都是他從事創作最得力的工具,無論布料有多小都不願意丟棄。');

$section->addTextBreak(); //換行,可指定換幾行

$fontStyle = array('color'=>'006699', 'size'=>18, 'bold'=>true);
//文字樣式設定(可用的文字設定:size、name、bold、italic、superScript、subScript、underline、Color、fgColor)

$paragraphStyle=array('align' => 'both', 'spaceBefore'=>300, 'spacing'=>100);  //段落設定(可用設定:align、spaceBefore、spaceAfter、spacing)

$section->addText('根據英國《每日郵報》(Daily Mail)報導,原先為藝術總監、現年28歲的伊恩‧貝瑞,近來已成為藝術界鼎鼎大名的「丹寧布之神」。2006年,伊恩自大學返回老家,在房間中無意翻出許多老舊的牛仔布,靈機一動便將這些碎布拼湊成畫,開啟了伊恩的創作之門。' , $fontStyle , $paragraphStyle);
*/

header('Content-Type: application/vnd.ms-word');
$filename=iconv('utf-8','big5','通訊錄');
header("Content-Disposition: attachment;filename={$filename}.docx");
header('Cache-Control: max-age=0');
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('php://output');
?>