#!WikiMarkdown
Bab 4 - Dasar-Dasar Pembuatan Halaman
=====================================
Penuh rasa ingin tahu, tutorial pertama yang diikuti oleh programmer ketika bela
jar bahasa baru atau sebuah framework adalah sesuatu untuk menampilkan "Hello, w
orld!" pada layar. Sebenarnya aneh berpikir jika komputer sebagai benda yang dap
at menyapa seluruh dunia, semenjak setiap usaha pada lapangan inteligensia buata
n selalu menghasilkan kemampuan percakapan yang buruk. Tetapi symfony tidak sebo
doh itu dibandingkan program lain, dan buktinya adalah, anda dapat membuat halam
an yang menyapa "Hello, `<Your Name Here>`" di dalamnya.
Bab ini akan mengajarkan anda bagaimana untuk membuat sebuah modul, yang merupak
an struktur elemen yang mengelompokkan halaman-halaman. Anda juga akan belajar u
ntuk membuat halaman, yang dipisah antara action dan template, karena adanya pol
a MVC. Link dan form adalah interaksi web dasar; anda akan melihat bagaiman untu
k menysispkannya pada template dan menanganinya pada action.
Membuat Kerangka Modul
---------------------Sebagaimana diterangkan pada Bab 2, symfony mengelompokkan halaman-halaman ke da
lam modul-modul. Sebelum membuat sebuah halaman, anda perlu membuat sebuah modul
, yang awalnya berupa kulit kosong dengan struktur file yang dapat dikenali oleh
symfony.
Baris perintah symfony mengotomatisasi pembuatan modul-modul. Anda hanya perlu m
emanggil tugas `init-module` dengan nama aplikasi dan nama modul sebagai argumen
. Pada bab sebelumnya, anda sudah membuat sebuah applikasi `myapp`. Untuk menamb
ahkan modul `mymodule` ke aplikasi ini, ketik perintah-perintah berikut:
> cd ~/myproject
> symfony init-module myapp mymodule
>> dir+
>> dir+
>> file+
~/myproject/apps/myapp/modules/mymodule
~/myproject/apps/myapp/modules/mymodule/actions
~/myproject/apps/myapp/modules/mymodule/actions/actions.class.p
>>
>>
>>
>>
dir+
dir+
dir+
file+
~/myproject/apps/myapp/modules/mymodule/config
~/myproject/apps/myapp/modules/mymodule/lib
~/myproject/apps/myapp/modules/mymodule/templates
~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.
>>
>>
>>
>>
dir+
file+
tokens
tokens
~/myproject/apps/myapp/modules/mymodule/validate
~/myproject/test/functional/myapp/mymoduleActionsTest.php
~/myproject/test/functional/myapp/mymoduleActionsTest.php
~/myproject/apps/myapp/modules/mymodule/actions/actions.class.p
>> tokens
~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.
hp
php
hp
php
Diluar direktori `actions/`, `config/`, `lib/`, `templates/`, dan `validate/`, p
erintah ini membuat hanya tiga file saja. Satu pada folder test/ yang berhubunga
n dengan pengujian unit, dan anda tidak perlu terganggu dengannya hingga Bab 15.
File `actions.class.php` (ditunjukkan pada Listing 4-1) mem-forward ke halaman
ucapan selamat modul default. File `templates/indexSuccess.php` yang masih koson
g.
symfony (meskipun
jika anda menamba
anda memanggil `m
404.
>**SIDEBAR**
>URL-URL adalah bagian dari respon
>
>Symfony menyediakan sistem routing yang memperbolehkan anda menggunakan pemisah
an penuh antara nama action sebenarnya dan bentuk URL yang digunakan untuk meman
ggilnya. Ini memperbolehkan format kustom pada URL sebaimana jika URL tersebut s
ebagai bagian dari respon. Anda tidak lagi dibatasi oleh struktur file atau para
meter-parameter request; URL untuk sebuah action dapat terlihat sebagai frase ya
ng anda inginkan. Sebagai contoh, pemanggilan action index dari suatu modul yang
dinamakan artikel biasanya terlihat seperti ini:
>
>
http://localhost/myapp_dev.php/article/index?id=123
>
>URL ini mengambil artikel yang diberikan dari database. Pada contoh ini, artike
l diambil (dengan `id=123`) tentang bagian di Eropa yang secara khusus mendiskus
ikan masalah keuangan di Perancis. Tetapi URL dapat ditulis dengan cara sangat b
erbeda dengan contoh sebelumnya dengan cukup merubah file konfigurasi `routing.y
ml`:
>
>
http://localhost/articles/europe/france/finance.html
>
>Bukan hanya URL yang dihasilkan search engine-friendly, tetapi juga sangat bera
rti bagi pengguna, yang selanjutnya dapat menggunakan address bar sebagai baris
perintah pseudo untuk membuat query-query kustom, seperti berikut:
>
>
http://localhost/articles/tagged/finance+france+euro
>
>Symfony mengetahui bagaimana cara memroses dan menciptkan URL-URL pintar untuk
pengguna. Sistem routing otomatis menempelkan parameter-parameter request dari U
RL pintar dan menyediakannya untuk action. Dia juga memformat hyperlink-hyperlin
k yang disertakan dalam respon sehingga hyperlink tersebut terlihat "pintar". An
da akan banyak belajar mengenai fitur ini pada Bab 9.
>
>Secara keseluruhan, ini berarti bahwa bagimana anda menamai suatu action dari a
plikasi-aplikasi anda seharusnya tidak mempengaruhi bagimana bentuk URL yang dig
unakan untuk memanggilnya harus terlihat, melainkan dari fungsi-fungsi action-ac
tion aplikasi tersebut. Nama sebuah action menjelaskan apa sebenarnya yang dapat
dikerjakannya, dan sering berupa kata kerja dalam bentuk infinitif (semisal `sh
ow`, `list`, `edit`, dll). Nama-nama action dapat dibuat sama sekali tak nampak
kepada pengguna, jadi jangan ragu untuk menggunakan nama-nama action eksplisit (
semisal `listByName` atau `showWithComments`). Anda akan menhemat komentar-komen
tar kode untuk menjelaskan fungsi action anda, plus kode anda akan lebih mudah d
ipahami.
### Menambah Template
Action mengharapkan sebuah template untuk me-render dirinya. Sebuah template ada
lah file yang diletakkan pada direktori `templates/` dari sebuah modul, dinamaka
n dengan action dan terminasi action. Terminasi action default adalah "success,"
jadi file template yang harus dibuat untuk action `myAction` dinamakan `myActio
nSuccess.php`.
Template-template disarankan hanya berisi kode presentasi saja, jadi usahakan se
dikit mungkin menggunakan kode PHP. Sebagai fakta, halaman yang menampilkan "Hel
lo, world!" dapat menggunakan template sederhana seperti ditunjukkan pada Listin
g 4-3.
Listing 4-3 - Template `mymodule/templates/myActionSuccess.php`
[php]
<p>Hello, world!</p>
Jika anda perlu untuk mengeksekusi beberapa kode PHP dalam template, anda seharu
snya menghindari penggunakan sintaks PHP biasa, seperti ditunjukkan pada Listing
4-4. Melainkan, tulis template-template menggunakan sintaks PHP alternatif, sep
erti ditunjukkan pada Listing 4-5, untuk menjaga kode mudah dimengerti oleh prog
ramer-programer non PHP. Bukan hanya kode akhir akan teridentasi dengan benar, t
etapi juga membuat kode PHP kompleks tetap dalam action, karena hanya statemen-s
tatemen kontrol (`if`, `foreach`, `while`, dll) yang memiliki sintaks alternatif
.
Listing 4-4 - Sintaks PHP Biasa, Bagus untuk Action, Tetapi Buruk untuk Template
[php]
<p>Hello, world!</p>
<?php
if ($test)
{
echo "<p>".time()."</p>";
}
?>
Listing 4-5 - Sintaks PHP Alternatif, Bagus untuk Template
[php]
<p>Hello, world!</p>
<?php if ($test): ?>
<p><?php echo time(); ?></p>
<?php endif; ?>
>**TIP**
>Sebuah aturan yang baik untuk memeriksa jika sintaks template cukup mudah dibac
a adalah file tersebut seharusnya tidak berisi kode HTML yang di-echo-kan oleh P
HP atau menggunakan kurung kurawal. Dari kebanyakan waktu, ketika membuka `<?php
`, anda juga akan menutupnya dengan `?>` pada baris yang sama.
### Melewatkan Informasi dari Action ke Template
Tugas sebuah action adalah melakukan semua kalkulasi yang rumit, pengambilan dat
a, dan pengujian-pengujian, dan untuk menentukan variabel-variabel bagi template
untuk di-echo-kan atau diujikan. Symfony menyediakan atribut-atribut dalam kela
s action (diakses melalui `$this->variableName` dalam action) yang langsung dapa
t diakses dalam template dari namespace global (via `$variableName`). Listing 46 dan 4-7 menunjukkan bagaimana untuk melewatkan informasi dari action ke templa
te.
Listing 4-6 - Setting Atribut Action dalam Action untuk Membuatnya Tersedia bagi
Template
[php]
<?php
class mymoduleActions extends sfActions
{
public function executeMyAction()
{
$today = getdate();
$this->hour = $today['hours'];
}
}
Listing 4-7 - Template Memiliki Akses Langsung ke Attribut-Attribut Action
[php]
<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It is already <?php echo $hour ?>.</p>
<?php endif; ?>
>**CATATAN**
>Template sudah punya akses ke beberapa potong data tanpa perlu setup variabel d
alam action. Setiap template dapat memanggil metode-metode dari obyek-obyek `$sf
_context`, `$sf_request`, `$sf_params`, dan `$sf_user`. Mereka berisi data yang
berkaitan dengan konteks sekarang, request, parameter-parameter request, dan ses
i. Anda akan belajar bagaimana menggunakannya secara efisien.
Mendapatkan Informasi dari Pengguna dengan Form
----------------------------------------------Form adalah cara terbaik untuk mendapatkan informasi dari pengguna. Menulis form
dan elemen-elemen dalam HTML kadang-kadang dapat menyusahkan, khususnya jika an
da menginginkan hasil yang XHTML-compliant. Anda dapat menyertakan elemen-elemen
form dalam template-template symfony seperti biasa, sepeti ditunjukkan pada Lis
ting 4-8, tetapi symfony menyediakan helper-helper yang membuat tugas ini menjad
i mudah.
Listing 4-8 - Template Dapat Beisi Kode HTML Umum
[php]
<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It is already <?php echo $hour ?>.</p>
<?php endif; ?>
<form method="post" action="/myapp_dev.php/mymodule/anotherAction">
<label for="name">What is your name?</label>
<input type="text" name="name" id="name" value="" />
<input type="submit" value="Ok" />
</form>
Sebuah helper adalah fungsi PHP yang didefinisikan oleh symfony yang dimaksudkan
untuk digunakan dalam template-template. Helper menghasilkan beberapa kode HTML
dan lebih cepat digunakan dibandingkan dengan menulis kode HTML aktual sendiri.
Menggunakan helper-helper symfony, anda mendapatkan hasil yang sama dengan List
ing 4-8 dengan kode yang ditunjukkan pada Listing 4-9.
Listing 4-9 - Lebih Cepat dan Mudah Menggunakan Helper daripada Menggunakan Tag
HTML
[php]
<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It is already <?php echo $hour ?>.</p>
<?php endif; ?>
<?php echo form_tag('mymodule/anotherAction') ?>
<?php echo label_for('name', 'What is your name?') ?>
<?php echo input_tag('name') ?>
<?php echo submit_tag('Ok') ?>
</form>
>**SIDEBAR**
>Helper disediakan untuk membantu anda
>
>Misal, seperti contoh pada Listing 4-9, anda berpikir bahwa versi helper tidak
sebegitu cepat dibandingkan dengan menulis sendiri kode HTML, pertimbangkan beri
kut ini:
>
>
[php]
>
<?php
>
$card_list = array(
>
'VISA' => 'Visa',
>
'MAST' => 'MasterCard',
>
'AMEX' => 'American Express',
>
'DISC' => 'Discover');
>
echo select_tag('cc_type', options_for_select($card_list, 'AMEX'));
>
?>
>
>Yang menghasilkan HTML berikut:
>
>
[php]
>
<select name="cc_type" id="cc_type">
>
<option value="VISA">Visa</option>
>
<option value="MAST">MasterCard</option>
>
<option value="AMEX" selected="selected">American Express</option>
>
<option value="DISC">Discover</option>
>
</select>
>
>Keuntungan menggunakan helper dalam template adalah kecepatan coding, kejelasan
kode, dan ringkas. Harga yang harus dibayar hanyalah waktu yang dibutuhkan untu
k belajar, yang akan selesai ketika anda menyelesaikan buku ini, dan waktu untuk
menulis <?php echo ?>, yang mungkin anda sudah memiliki jalan pintas pada penyu
nting teks favorit anda. Jadi anda bisa saja tidak menggunakan helper symfony da
lam template-template dan menulis kode HTML sebagaimana biasa anda lakukan, teta
pi hal ini banyak merugikan dan juga kurang menyenangkan.
Perlu dicatat penggunaan tag pembuka pendek (`<?=`, yang ekuivalen dengan `<?php
echo`) tidak direkomendasikan dalam aplikasi-aplikasi web profesional, karena s
erver web produksi anda mungkin bisa mengenali lebih dari satu bahasa scripting
sehingga terjadi kebingungan. Di samping itu, tag pembuka pendek tidak bekerja d
engan konfigurasi PHP default dan perlu pengaktifan tweaking server. Akhirnya, k
etika anda harus bekerja dengan XML dan validasi, itu akan gagal segera karena `
<?` memiliki arti khusus dalam XML.
Manipulasi form membutuhkan satu bab tersendiri, semenjak symfony menyediakan be
rbagai macam peralatan-peralatan, kebanyakan helper, untuk membuatnya lebih muda
h. Anda akan belajar lebih banyak mengenai helper-helper tersebut pada Bab 10.
Link ke Action Lain
------------------Anda sudah mengetahui bahwa ada pemisahan total antara nama action dan URL yang
digunakan untuk memanggilnya. Jadi jika anda membuat link ke `anotherAction` dal
am template seperti pada Listing 4-10, itu hanya akan bekerja dengan routing def
ault. Jika kemudian anda memutuskan untuk merubah tampilan URL, maka anda perlu
melihat lagi semua template-template dan merubah hyperlink.
Listing 4-10 - Hyperlink, dengan Cara Klasik
[php]
<a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous">
I never say my name
</a>
Untuk menghindari usaha ini, anda seharusnya selalu menggunakan helper `link_to(
)` untuk membuat hyperlink ke action-action aplikasi. Listing 4-11 mendemonstras
ikan penggunaan helper hyperlink.
Listing 4-11 - Helper `link_to()`
[php]
<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It is already <?php echo $hour ?>.</p>
<?php endif; ?>
<?php echo form_tag('mymodule/anotherAction') ?>
<?php echo label_for('name', 'What is your name?') ?>
<?php echo input_tag('name') ?>
<?php echo submit_tag('Ok') ?>
<?php echo link_to('I never say my name','mymodule/anotherAction?name=anon
ymous') ?>
</form>
HTML yang dihasilkan sama dengan sebelumnya, kecuali ketika anda mengubah aturan
-aturan routing, semua template-template akan bertindak dengan benar dan mem-for
mat URL secara sesuai.
Helper `link_to()`, seperti kebanyakan helper lainnya, menerima argumen lain seb
agai pilihan khusus dan attribut-atribut tag tambahan. Listing 4-12 menunjukkan
contoh sebuah argumen pilihan dan HTML yang dihasilkan. Arguman pilihan bisa ber
upa array asosiatif atau string sederhana ditunjukkan dengan pasangan `key=value
` yang dipisahkan oelh spasi.
Listing 4-12 - Kebanyakan Helper Menerima Argumen Pilihan
[php]
// Argumen pilihan dengan array asosiatif
<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anony
mous',
array(
'class'
=> 'special_link',
'confirm' => 'Are you sure?',
'absolute' => true
)) ?>
// Argumen pilihan dengan string
<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anony
mous',
'class=special_link confirm=Are you sure? absolute=true') ?>
// Kedua pemanggilan tersebut menghasilkan output sama
=> <a class="special_link" onclick="return confirm('Are you sure?');"
href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymo
us">
I never say my name</a>
Kapan pun anda menggunakan helper symfony yang menghasilkan tag HTML, anda dapat
menyisipkan atribut-atribut tag tambahan (semisal atribut `class` pada contoh p
ada Listing 4-12) dalam argumen pilihan. Anda bahkan dapat menulis atribut-atrib
ut ini dengan cara HTML 4.0 "quick-and-dirty" (tanpa tanda kutip ganda), dan sym
fony akan menghasilkan format XHTML yang manis. Itulah alasan lain mengapa helpe
r-helper lebih cepat daripada menulis HTML.
>**CATATAN**
>Karena membutuhkan pengolahan dan transformasi tambahan, sintaks string sedikit
lebih lambat dibandingkan dengan sintaks array.
Seperti helper-helper form, helper-helper link jumlahnya banyak dan memiliki ban
yak pilihan. Bab 9 akan menggambarkannya secara detail.
Mendapatkan Informasi dari Request
---------------------------------Baik pengguna mengirimkan informasi via form (biasanya dengan request POST) atau
via URL (request GET), anda dapat mengambil data terkait dari action dengan met
ode `getRequestParameter()` dari obyek `sfActions`. Listing 4-13 menunjukkan bag
aimana, pada `anotherAction`, anda mengambil nilai dari parameter `name`.
Listing 4-13 - Mengambil Data dari Parameter Request dalam Action
[php]
<?php
class mymoduleActions extends sfActions
{
...
atan template-template difasilitasi dengan helper-helper, yang merupakan fungsifungsi yang disediakan oleh symfony yang menghasilkan kode HTML. Dan anda perlu
men-cam-kan bahwa URL adalah sebagai bagian dari respon, yang dapat diformat ses
uai keperluan, jadi anda seharusnya tidak dibingungkan dengan penggunaan referen
si langsung ke URL dalam penamaan action atau pengambilan parameter request.
Sekali anda mengetahui prinsip-prinsip dasar ini, anda sudah siap menulis sebuah
aplikasi utuh dengan symfony. Tetapi itu akan membutuhkan jalan yang panjang, s
emenjak setiap tugas yang harus anda capai sepanjang pengembangan aplikasi difas
ilitasi dengan satu atau jalan lain oleh beberapa fitur symfony . . . dan itulah
mengapa buku ini tidak berhenti sampai di sini.
}}}