06 Maret, 2008

Buat File PDF on the Fly dengan Bahasa Arab

Sebelumnya saya sudah pernah membuat file PDF on the fly dengan memakai bahasa Mandarin. Saat itu kesulitannya mencari file-file class PHP yg bisa merender font-font bahasa mandarin ke format PDF. Pada akhirnya saya menemukan FPDF dengan dukungan file class chinese.php.
Sekarang saya mendapat proyek yang antara lain membuat file PDF - on the fly juga, ke format bahasa Arab. Saya pikir mudah untuk membuatnya, mengingat saya agak paham - dikit-dikit - tentang penulisan bahasa Arab. Apalagi komputer saya memakai Windows XP yg dengan mudah di-install untuk mendukung pemakaian bahasa Arab.
Ternyata dugaan saya salah! Saya sudah install file-file pendukung untuk bahasa Arab, lalu saya install juga Adobe Reader khusus format ME (Middle East), kemudian saya pasang juga software untuk pengetikan bahasa Arab. Eh, ternyata saat saya aplikasikan di script PHP, output filenya selalu berbentuk "???????", meski saya sudah coba pakai PHPDesigner yg juga mendukung penulisan bahasa Arab.
Saya sudah coba file class TCPDF yg memang mendukung penulisan huruf dari kanan ke kiri (RTL) semacam bahasa Arab dan Hebrew. Tetapi saat saya coba menggunakan font-font Arabic, outputnya ternyata terpotong-potong - dalam arti hasil keluarannya berupa font-font arab yg masih utuh, tidak tersambung sesuai kaidah bahasa Arab - meskipun saat penulisannya sudah tersambung dengan sempurna.
Setengah mati saya coba cari-cari di internet, file-file class untuk pengerjaan proyek tersebut, sampai akhirnya saya menemukan file class ar-glyph.php buatan Khaled Al Samaa di www.ar-php.com/php/arabic
File class ini merupakan turunan dari class UFPDF, yg berbeda dengan class TCPDF diatas. UFPDF sendiri merupakan turunan class FPDF yg saya pakai untuk membuat file PDF on the fly menggunakan bahasa Mandarin.
Hasilnya? wow keren.... karena justru dengan file class ini saya sudah tidak perlu lagi meng-install file-file pendukung bahasa Arab untuk Windows XP saya, tidak juga harus meng-install Adobe Reader versi ME (Arabic), atau bahkan tanpa harus meng-install software untuk pengetikan bahasa Arab. Cukup salin file-file tadi (termasuk file font Arab yg ada di folder hasil download) ke direktori root server Anda, dan Anda buat modifikasi dari file contoh yg disertakan di file ar-glyph.php tadi melalui software PHPDesigner anda.

Selamat mencoba...

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>