18 Mei, 2007

TEKNIK AJAX

Teknik AJAX sangat menarik untuk dipelajari, karena teknik ini bisa kita gunakan untuk menampilkan data hasil proses query tanpa harus merefresh page HTML yg sudah ada. Saya mulai menggunakan teknik ini saat membuat program keuangan. Disitu dibutuhkan tampilan data COA (code of account) saat kita ketikkan kodenya. Teknik AJAX merupakan kombinasi script PHP, Javascript dan XML.

Pada contoh script disini, saya gunakan teknik dasar AJAX, dengan harapan bisa lebih mudah dipahami, meskipun memang banyak sekali di internet kita temukan file-file class php yg menyediakan akses teknik AJAX.

Pada contoh dibawah, terdapat 2 event yg menggunakan teknik AJAX. Satu, event untuk menampilkan keterangan kode account setelah diisikan kode account (COA) nya - yg diambil langsung dari database MySQL, kedua, event untuk menampilkan titik ribuan saat dituliskan angka transaksi.

<TABLE width="66%">
<TR>
<TD><INPUT maxLength=16 size=12 type=text name="kode" onBlur="akun(this.value)"></TD>
<TD><INPUT maxLength=70 size=50 type=text name="note" id="note"> Rp.<INPUT maxLength=16 size=16 type=text name="nilai" id="isian" onChange="titik()" align=right></TD></TR>
</TABLE>

Input pertama pada kode HTML diatas terdapat event onBlur yg membangkitkan fungsi akun(nilai) yg digunakan untuk menampilkan keterangan kode account. Input kedua terdapat event onChange yg membangkitkan fungsi titik() yg digunakan untuk menampilkan titik ribuan pada angka.

var url1 = "search1.php?q=";
function akun(x) {
if (!done &&amp;amp;amp; http) {
var term = x;
http.open('GET', url1 + term, true);
http.onreadystatechange = handleHttpResponse1
http.send(null);
}
}

var url2 = "search2.php?q=";
function titik() {
if (!done && http) {
var term = document.getElementById('isian').value;
http.open('GET', url2 + term, true);
http.onreadystatechange = handleHttpResponse2
http.send(null);
}
}

pada kedua fungsi diatas, nilai dari setiap input event yg membangkitkannya, dikirimkan melalui http.open() ke url yg sesuai. Untuk fungsi akun() ke search1.php dan fungsi titik() ke search2.php, dimana pada kedua file tsb, diproses lagi yg hasilnya dikirimkan balik dengan format xML melalui fungsi handleHttpResponse milik getHTTPObject().

//isi file search1.php
<?php
if (isset($_GET['q']) === FALSE)
{
exit();
}
include('../incl/koneksi.php');
//list($isi,$urut)=split("-",$q);
$isi = $q;
$query = "select nama from akun where kode='".$isi."' and jenak=0";

$rResult = mysql_query($query);
if ($rResult === FALSE) {
print 'ada kesalahan!';
}
$aTmp = array();

if (mysql_num_rows($rResult) == 0) {
echo "KODE SALAH ATAU KODE TIDAK ADA !!!";
}
else {
while ($aTmp = mysql_fetch_assoc($rResult)) {
$nobuk = $aTmp['nama'];
echo $nobuk;
}
}
?>

// isi file search2.php
<?php
if (isset($q) === FALSE)
{
exit();
}

echo number_format($q,2,',','.');
?>

Dan akhirnya hasil dari proses ke 2 file tadi diterima fungsi handleHttpRespons() yg sesuai,

function handleHttpResponse1() {
if (http.readyState == 4 && http.status == 200) {
document.getElementById('note').value = http.responseText;
}
}
function handleHttpResponse2() {
if (http.readyState == 4 && http.status == 200) {
document.getElementById('isian').value = http.responseText;
}
}

anda bisa lihat, hasilnya dimasukkan melalui element input form dengan id yg sesuai, id 'note' untuk hasil fungsi akun() dan id 'isian' untuk hasil fungsi titik().

script lengkap untuk file ajax.php adalah sbb :

<?php
include ('../incl/koneksi.php');
?>
<html>
<head>
<title>Tambah Data</title>
<script language="javascript" type="text/javascript">
var done = false;
// fungsi akun : menampilkan keterangan account
var url1 = "search1.php?q=";
function akun(x) {
if (!done && http) {
var term = x;
http.open('GET', url1 + term, true);
http.onreadystatechange = handleHttpResponse1
http.send(null);
}
}
function handleHttpResponse1() {
if (http.readyState == 4 && http.status == 200) {
document.getElementById('note').value = http.responseText;
}
}
// fungsi titik : menampilkan titik untuk ribuan
var url2 = "search2.php?q=";
function titik() {
if (!done && http) {
var term = document.getElementById('isian').value;
http.open('GET', url2 + term, true);
http.onreadystatechange = handleHttpResponse2
http.send(null);
}
}
function handleHttpResponse2() {
if (http.readyState == 4 && http.status == 200) {
document.getElementById('isian').value = http.responseText;
}
}
// fungsi utama ajax
function getHTTPObject() {
var xmlhttp;
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try { xmlhttp = new XMLHttpRequest();
}
catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
var http = getHTTPObject();
</script>
</head>
<body><p><br>
<center>
<TABLE width="66%">
<TR>
<TD><INPUT maxLength=16 size=12 type=text name="kode" onBlur="akun(this.value)"></TD>
<TD><INPUT maxLength=70 size=50 type=text name="note" id="note"> Rp.<INPUT maxLength=16 size=16 type=text name="nilai" id="isian" onChange="titik()" align=right></TD></TR>
</TABLE></P>
</form></center>
</body>
</html>

MEMBUAT FILE PDF DENGAN FONT MANDARIN

catatan ini saya buat saat membuat program berbasis web yg membutuhkan laporan-laporan berformat PDF. Kita tahu bahwa format PDF sudah merupakan standar file untuk pengiriman file berbasis jaringan dan internet yg multi-language dan multi-OS. Dengan format PDF, kita tidak perlu khawatir terhadap perubahan tampilan dan style isi file saat kita kirimkan via internet.
Saya menggunakan file class FPDF untuk menghasilkan file berformat PDF ini, karena file class ini kecil tetapi mampu menghasilkan file PDF dengan font chinese (simplified dan traditional). Sebelumnya saya menggunakan library built-in PHP yakni pDFlib, yg selalu disertakan dalam setiap bundel instalasi PHP. Kekurangan memakai file library ini, selain tidak mampu menghasilkan format font chinese juga kita harus mengubah setting program saat kita jalankan dari Windows ke Linux atau sebaliknya.
Dalam catatan ini kita akan buat file untuk cetak form Biodata CTKI (disederhanakan) yg berformat PDF, dimana didalamnya kita tampilkan data-data CTKI menggunakan font chinese dan photo CTKI. Kita perlu mengambil file class fpdf.php dan file chinese.php di www.fpdf.org (atau bisa anda download di www.syamsul.org/download/pdf). Letakkan file class fpdf tsb di direktori root. Dan anda bisa mulai mencoba script dibawah ini.

<?php
require('chinese.php');
$pdf=new PDF_chinese();

// buat font chinese
// GB untuk font chinese simplified
// Big5 untuk font chinese traditional
AddGBFont();
$pdf->Open();
$pdf->AddPage();

// cetak logo utama
$pdf->image('img/logo.jpg',11,2,180,30);
$pdf->SetFont('GB','B',12);

// buat garis
$pdf->setLineWidth(0.8);
$pdf->line(10,46,200,46);

// mulai membuat kalimat dengan font chinese
// anda harus menggunakan editor teks yg mendukung tampilan font chinese
// misalnya PHP Designer.
$pdf->text(10,52,'ÉêÇëÈϵÄÀúÊÊé¡');
$pdf->setLineWidth(0.7);
$pdf->line(10,54,40,54);
$pdf->text(140,60,'³ÉÔ±ÊýÄ¿');
$pdf->text(10,60,'ÐÕÃû');
$pdf->text(10,65,'³öÉúµØ');
$pdf->text(10,70,'ÄêÁä');
$pdf->text(10,75,'³öÉúÆÚ');
$pdf->text(10,80,'Éí¸ß/ÌåÖØ');
$pdf->text(10,85,'ÌåÖØ');
$pdf->text(10,90,'¹«½ï');
$pdf->text(10,95,'½ÌÓý');
$pdf->text(10,100,'×Ú½Ì');
$pdf->text(10,105,'Ȏ񚵀');

// tampilkan photo CTKI
$photo=$_SERVER['DOCUMENT_ROOT']."/photo/siti.jpg";
$pdf->image($photo,90,80,110,145);
// tampilkan
$pdf->Output();
?>

MEMBUAT LAPORAN BERFORMAT EXCEL

Untuk Aplikasi berbasis web, seringkali kita kesulitan untuk mendapatkan format laporan yg mantap. meskipun kita bisa membuatnya dalam format HTML atau PDF. Kekurangan format HTML adalah tampilan mudah berubah dengan berubahnya browser yg kita pakai. Sedangkan untuk membuat format PDF, cukup merepotkan untuk menampilkan data dalam format tabel, apalagi kalau data yg akana ditampilkan cukup panjang.
Untuk itu kita perlu mencari format laporan yg 'enak' untuk dilihat tetapi mudah dibuat, yakni format Excel. Script yg saya jadikan contoh ini berupa laporan AN-05 (Laporan pemberangkatan CTKI standar). File-file class untuk menghasilkan file format excel ini bisa anda download di www.syamsul.org/download/excel.

<?php

require_once ('../incl/class.writeexcel_workbook.inc.php');
require_once ('../incl/class.writeexcel_worksheet.inc.php');

// akses ke file koneksi database
// database bisa apa saja : MySQL,PosgreSQL,ODBC,dsb
include ('../incl/koneksi.php');

// buat file temporary
$fname = tempnam("/tmp", "simple.xls");

// buat workbook baru
$workbook = &new writeexcel_workbook($fname);
// buat format tampilan header
$header =& $workbook->addformat(array(
bold => 1,
italic => 0,
color => 'black',
size => 8,
font => 'Arial',
));
$header->set_align('center');
// buat format 1 tampilan teks
$teks1 =& $workbook->addformat(array(
bold => 0,
italic => 0,
color => 'black',
size => 8,
font => 'Arial',
));
$teks1->set_align('left');
// buat format 2 tampilan teks
$teks2 =& $workbook->addformat(array(
bold => 0,
italic => 1,
color => 'black',
size => 8,
font => 'Arial',
));
$teks2->set_align('center');
// buat worksheet baru
$worksheet = &$workbook->addworksheet(' lembar-1 ');

// mulai menuliskan data
// sintaks : write(baris-n, kolom-n, ukuran).
// baris dan kolom dimulai dgn indeks 0

// buat header worksheet
$worksheet->write(0, 1, "LAPORAN PEMBERANGKATAN TKI DI LUAR NEGERI ", $header);
$worksheet->merge_cells(0,1,0,3);

// buat header kolom
$worksheet->set_column(0,0,3);
$worksheet->write(1, 0, "No.", $header);
$worksheet->set_column(1,1,22);
$worksheet->write(1, 1, "Nama TKI &", $header);
$worksheet->write(2, 1, "Temp/Tgl Lahir", $header);
$worksheet->set_column(2,2,7);
$worksheet->write(1, 2, "Jenis", $header);
$worksheet->write(2, 2, "Kelamin", $header);
$worksheet->set_column(3,3,30);
$worksheet->write(1, 3, "Alamat Keluarga di", $header);
$worksheet->write(2, 3, "Indonesia / Kandepnaker", $header);
$worksheet->set_column(4,4,10);

# query record data CTKI
$n = 2; $m=1;
$query = "select refno,nama,tmplahir,tgllahir,alamat from biodata where statustki='berangkat' order by refno";
$recordSet = &$db->Execute($query);
while(!$recordSet->EOF){
// pecahkan panjang alamat tki
$alm1 = substr($recordSet->fields["alamat"],0,30);
$alm2 = substr($recordSet->fields["alamat"],30,strlen($recordSet->fields["alamat"]));

// mulai menampilkan data
$worksheet->write($n+1,0,$m,$teks1);
$worksheet->write($n+1,1,$recordSet->fields["nama"],$teks1);
$worksheet->write($n+2,1,$recordSet->fields["tmplahir"]." / ".$recordSet->fields["tgllahir"],$teks1);
$worksheet->write($n+1,2,'WANITA',$teks2);
$worksheet->write($n+1,3,$alm1,$teks2);
$worksheet->write($n+2,3,$alm2,$teks2);
$recordSet->MoveNext();
$n=$n+3; $m=$m+1;
}

// tutup workbook
$workbook->close();

// tampilkan dalam format excel
header("Content-Type: application/x-msexcel; name=\"cetak_an05.xls\"");
header("Content-Disposition: inline; filename=\"cetak_an05.xls\"");

// buka dan tampilkan hasilnya
$fh=fopen($fname, "rb");
fpassthru($fh);

// hapus file sementara
unlink($fname);

?>