web design
Bagaimana membuat URL cantik, dan "bersahabat"
Bahasan saat ini untuk webmaster pemula, karena biasanya yang sudah mahir tidak begitu memperhatikan hal ini lagi. Dan juga bahasan itu bukan untuk website yang menggunakan template blog atau cms karena biasanya sudah diset dari sononya. Yang akan kita lakukan adalah membuat alamat URL yang singkat dan search engine friendly. Anda lihat dua alamat url berikut ini dan coba bandingkan:
http://www.contoh.com/index.php?id_sezione=360&sid=3a5ebc944f41daa6f849f730f1
http://www.contoh.com/user/links
Mana yang lebih enak dilihat? pasti anda menjawab link kedua lebih enak dilihat. Begitu pula search engine lebih menyukai link yang mudah dimengerti dan mudah diingat. Hal ini bisa mengurangi rasa pusing pengunjung anda sekaligus mengoptimalkan hasil di search engine. Memang ada search engine seperti Google misalnya yang sudah dapat mengenali url dinamis yang mengarah pada satu halaman dengan content yang berbeda. Tapi tidak menutup kemungkinan beberapa search engine lain langsung berhenti total karena menganggap itu hanya satu halaman. Siapa yang rugi sekarang?
Senjata yang akan kita gunakan adalah mod_rewrite di file htaccess yang ada di Apache. Oh iya, hal ini tidak dapat dilakukan di Apache untuk Windows. Jika anda belum memiliki file htaccess silakan membuatnya menggunakan text editor seperti notepad dan disimpan dengan nama .htaccess - Anda harus hati-hati menyimpan dengan nama file ini di notepad. Saya peringatkan anda bahwa mod_rewrite bukan hal yang mudah dan simple sekali jadi. Kesalahan sedikit dapat membuat web anda tidak berfungsi (biasanya dengan error 500 atau 404) karena kesalahan konfigurasi. Jika hal tersebut terjadi, restart ulang browser anda dan coba benahi lagi.
Rewrite dan Redirect
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
RewriteEngine on
Baris pertama dan kedua bersifat opsional, terserah anda ingin menambahkannya atau tidak. Jika terjadi error maka server akan menampilkan halaman yang sudah anda tentukan. Hal ini berguna untuk membuat custom error page dan mungkin bisa anda gunakan untuk melihat kesalahan yang anda lakukan. File .htaccess bersifat inherit atau warisan, berlaku untuk semua subfolder dibawahnya. Jika anda ingin ada perubahan di folder tertentu maka anda buat file .htaccess di folder tersebut. Baris ketiga diatas harus ada karena itulah kunci dari proses rewrite yang akan kita lakukan.
RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.php [NC]
Contoh diatas adalah contoh simple melakukan redirect atas request di browser. Anda harus sedikit paham tentang regular expression untuk dapat melakukan proses rewrite yang semakin kompleks. Yang dilakukan oleh contoh diatas adalah memindahkan browser yang merequest file .htm ke file .php. Hal ini mungkin berguna jika anda ingin menyembunyikan extension dari file yang anda gunakan atau ingin agar file php anda yang "mengurus" semua hal. Alamat di address bar browser anda tetap .htm padahal anda telah memindahkan ke file php anda. Semuanya dilakukan dibalik layar, dan user tidak menyadarinya. Tanda [NC] yang terakhir berarti No Case alias "case-insensitive" dimana UsEr.htm dan user.htm dianggap sama.
RewriteRule ^(.+)\.htm$ http://contoh.com/$1.php [R=302,NC]
Hampir sama dengan yang dilakukan sebelumnya tapi kita meredirect ke web eksternal. Tanda R di belakang berarti proses redirect yang dapat anda isi dengan 301 [Dipindah Permanen] atau 302 [Sementara]. Hati-hati untuk menset ke R=301 karena sekali salah maka browser anda akan terus menuju alamat yang salah tersebut selamanya. Sekali lagi, jika terjadi kesalahan, restart browser anda dan coba bersihkan historynya.
Regular Expression
Ehm, saya coba jelaskan sedikit tentang regular expression yang digunakan dalam melakukan mod_rewrite.
--Escape:
\char melakukan escape karakter berikutnya
Contohnya untuk melakukan escape pada karakter khusus seperti [].() dsb.
--Teks:
. Karakter tunggal apapun
[chars] Class karakter
[^chars] Negasi class karakter
text1|text2 Alternatif: teks1 atau teks2 (artinya "atau")
Contohnya [^/] akan cocok dengan semua karakter kecuali /
(user|users).html cocok dengan user.html atau user.html
--Jumlah:
? 0 atau 1 dari teks
* 0 atau N dari teks (lebih luas)
+ 1 atau N dari teks
--Pengelompokkan dan Capture:
(text) kelompok teks
Contoh ^(.*)\.html foo.php?bar=$1
--Penanda:
^ Penanda mulai
$ Penanda selesai
Contohnya ^user(.*) sesuai dengan foo dan foobar tapi tidak dengan eggfoo
(.*)l$ cocok dengan gol dan cool, tapi tidak dengan foo
URL cantik
Semua orang suka alamat url yang pendek, simple dan mudah diingat. Hal tersebut dapat dilakukan dengan mudah oleh mod_rewrite. Misalnya "http://situsku/public/files/download/download.php?file=my.zip" diubah menjadi "http://situsku/comot?file=my.zip". Hal ini dilakukan dengan menuliskan:
RewriteRule ^comot /public/files/download/download.php
Dengan WWW atau tanpa WWW?
Asal anda tahu saja, alamat "http://www.situs.com", "http://situs.com", "http://situs.com/htm" dilihat sebagai tiga hal yang berbeda oleh search engine meskipun ketiganya mengarah pada file yang sama. Ada baiknya ada "menyatukan" ketiganya sehingga search engine tidak memberi penilaian yang berbeda-beda. Secara umum, orang lebih menyukai alamat dengan menggunakan www, tapi terserah anda. Untuk meredirect user yang memasukkan tanpa www ke yang menggunakan www, maka di file .htaccess kita tuliskan:
RewriteCond %{HTTP_HOST} ^situs\.com
RewriteRule ^(.*)$ http://www.situs.com/$1 [R=301,L]
Ada sesuatu yang baru disini yaitu RewriteCond. RewriteCond adalah seperti logika if then. Jika memenuhi syarat maka eksekusi baris berikutnya. Tanda L berarti berhenti/selesai. %{HTTP_HOST}, %{QUERY_STRING}, %{COOKIE} adalah variabel di Apache. Oh iya, tanda $1 adalah backreference, digunakan untuk menampung hasil capture yang kita lakukan. Tergantung dari capture yang kita lakukan, anda bisa mendapatkan satu atau lebih backreference dengan hasil $1, $2. Ada satu hal lagi, disamping tanda $1 ada pula tanda %1 yang menampung capture dari %{QUERY_STRING}. Contohnya adalah meredirect dari "http://tomat.com/comot?foo=bar" ke "http://tomat.com/page.php?bar=bar" dengan menuliskan:
RewriteCond %{QUERY_STRING} foo=(.*)
RewriteRule ^comot(.*) /page.php?bar=%1
Kesimpulan
Dengan mod_rewrite kita memindahkan user dari satu tempat ke tempat lain tanpa disadari dengan tujuan untuk mempermudah mereka. Sebenarnya ada banyak hal lagi yang bisa dilakukan oleh mod_rewrite tapi sementara ini cukup. Anda harus lebih sering berlatih tentang penulisannya dan jangan keburu melakukan redirect permanen sebelum anda benar-benar yakin semua berjalan lancar. Usahakan untuk meredirect user tidak lebih dari 6 kali redirect, misalnya dari index di redirect ke user tapi diredirect lagi ke download, dst. Dengan ini semoga anda bisa membuat url yang unik dan cantik :)
Pengikut
Input Suggest Mirip Facebook
Pengantar
Pada awalnya saya ingin membuat input yang dapat memberikan bantuan mirip google suggest sehingga saat saya memasukkan satu huruf maka akan muncul dropdown berisi data yang mirip dengan input yang saya masukkan. Setelah mencoba mencari kode javascript (biasanya memang fasilitas seperti ini dikerjakan oleh javascript) di google, saya menemukan beberapa kode tapi bagi saya terlalu panjang dan tidak sesuai dengan keinginan. Apalagi setelah saya melihat sebuah situs yang membahas tentang dropdown mirip Facebook, akhirnya saya coba buat sendiri sesuai dengan keinginan saya :). Saya menggunakan Ajax karena pengetahuan saya tentang javascript agak payah :), jadi kodenya saya lempar ke PHP agar fungsi pencocokan string dilakukan oleh PHP dan kedepannya mungkin bisa menggunakan data dari database untuk menampilkan suggest-nya. Oh iya, ini screenshot hasilnya:
File yang dibutuhkan
Disini saya membutuhkan tiga file yaitu file "test.php", "tests.php" dan "httpconn.js". File pertama adalah tampilan yang kita lihat, file kedua adalah file php yang menghandle request dari ajax sedangkan file ketiga adalah file koneksi ajax. Untuk file ketiga, nanti bisa dimasukkan ke file pertama menggunakan tag ". Jika anda menginginkan source yang berisi tiga file tersebut, anda dapat melihat disini: source
Memulai Coding
Saya akan tampilkan dulu file yang pertama dimana berisi input yang akan dimodifikasi. File ini hanya berisi HTML dan javascript. Ini isinya:
HTML!doctype>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tes Saja</title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<script type="text/javascript" src="./httpconn.js"></script>
<style type="text/css">
#formtest {
font-family: "lucida grande",tahoma,verdana,arial,sans-serif; font-size: 0.8em;
}
#formtest .text {
width: 215px; height: 20px; border: 1px solid #979797; display: block;
position: relative;
}
#suggest {
width: 215px; min-height: 25px; overflow: visible; border: 1px solid #D7D7D7;
position: absolute; display: none; opacity: 0.9; z-index: 999;
background-color: #EFEFEF; color: #180909;
}
#suggest a {
text-decoration: none; line-height: 1.5em;
}
ul#fbList {
width: 100%; margin: 0; padding: 0; float: left; list-style: none;
}
ul#fbList li {
width: 100%; margin: 0; padding: 4px 0px; float: left;
clear: both; border-bottom: 1px solid #D7D7D7; text-align: left; text-indent: 7px;
}
ul#fbList li a {
width: 100%; margin: 0; padding: 0; float: left; display: block; color: #180909;
}
ul#fbList li.first { background-color: #5072AC; }
ul#fbList li.first a { color: #FFF; }
ul#fbList li.last { border: 0; }
ul#fbList li a strong { background-color: #ACACAC; }
ul#fbList li.first a strong { background-color: transparent; }
</style>
<script type="text/javascript">
// [CDATA[!>
function showSuggest(id,ids) {
input = getObject(ids); output = getObject(id);
textId = input.value;
ReplaceElementID('tests.php?tes=',id,textId);
if(input.value == '') {
output.style.display = 'none';
} else {
output.style.display = 'block';
}
}
function getObject(id) {
return document.getElementById(id);
}
function putValue(id,ids,text) {
input = getObject(id); input.value = text;
output = getObject(ids); output.style.display = 'none';
}
document.onclick = function (e) {
e = e || window.event
var target = e.target || e.srcElement
var box = document.getElementById("suggest")
do {
if (box == target) {
// Click occured inside the box, do nothing.
//return
}
target = target.parentNode
} while (target)
// Click was outside the box, hide it.
box.style.display = "none"
}
// ]]>
</script>
</head>
<body>
<form id="formtest">
Nama Teman:<input type="text" size="10" maxlength="23" id="textId" class="text"
onkeyup = "showSuggest('suggest','textId')" autocomplete="off" />
<div id="suggest"></div>
<hr />
Silakan masukkan nama teman anda untuk mengirim undangan melalui email.
</form>
</body>
</html>
Ehm, kita bahas dulu isi file pertama ini. Anda lihat dibagian "head", disitu kita memasukkan file external "httpconn.js", terus ada kode css untuk mengatur tampilan dropdown kita nantinya. Div dengan id "suggest" adalah div yang akan menampilkan data. Setelah itu ada beberapa kode javascript yang akan melakukan request Ajax serta mengatur tampilan dropdown kita nanti seperti menyembunyikan div "suggest" jika link diklik, dsb. Untuk fungsi terakhir, saya dapat nyontek dari internet :) (kelihatan dari comment-nya pakai bahasa Inggris). Lalu di bagian "body", disitu ditampilkan form yang berisi input dengan id="textId" beserta properti "onkeyup" untuk mengirim request dengan Ajax. Ada bagian "autocomplete=off", yang berguna untuk mencegah browser menyimpan data isian sebelumnya. Bagian ini tidak valid menurut W3C tapi biarlah :), asalkan jangan divalidasi, gak masalah.
Sekarang akan kita bahas file kedua yaitu "tests.php" yang berisi kode PHP untuk menghandle request dengan Ajax. Ini isinya:
PHP
$tes = $_GET['tes'];
$data = array('Amir Syaiffudin','Siti Umiyati','Ahmad Syarifuddin','Emilia Contessa',
'Dini Anggita','Jono Purnomo','Gunawan Wibisono','Petty Sukemi',
'Janoko Amudya','Samsul Arifin','Anang Makruf');
$arrResult = array();
for($x = 0; $x < count($data); $x++) {
if(@stripos($data[$x],$tes) !== false) {
$pattern = "/($tes)/i"; $replacement = '\\1';
$formatted = preg_replace($pattern,$replacement,$data[$x]);
$arrResult[] = array($data[$x],$formatted);
}
}
echo "\"
fbList\">";
if(count($arrResult) == 0) {
echo 'textId\',\'suggest\',\'\')">Tidak ada ';
} else {
for($x =0; $x <count($arrResult); $x++) {
if($x == 0) {
$row = ' class="first"';
} else {
if($x == count($arrResult) - 1) {
$row = ' class="last"';
} else {
$row = '';
}
}
echo '.$row.'>textId\',\'suggest\',\''.$arrResult[$x][0].'\')">'.$arrResult[$x][1].'';
}
}
echo "";
?>
Seperti yang anda lihat, saya memiliki array yang berisi nama orang yang ingin kita masukkan pada dropdown. Mungkin nanti data array ini bisa berasal dari database. Sebenarnya yang ditampilkan bukan dropdown biasa yang menggunakan tag "select" tapi saya menggunakan "ul" atau list yang berisi link. Link ini akan mengaktifkan fungsi "putValue" saat diklik dengan memberi properti "onclick".
Penutup
Kode yang saya gunakan adalah kode "versi saya", jadi mungkin saja ada "bug" yang belum saya ketahui. Anda dapat memodifikasi sesuka anda, misalkan dengan menggunakan database sebagai hasil request ajax-nya. Terima kasih