From 14ed823994d40b299914b980af6e4dbffb9c2198 Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Tue, 21 Aug 2007 14:34:36 +0000 Subject: Indonesian quickstart/protected/pages/Advanced --- .gitattributes | 23 ++ .../pages/Advanced/Samples/I18N/LanguageList.tpl | 1 + .../pages/Advanced/Samples/I18N/id/Home.page | 161 ++++++++++ .../Advanced/Samples/I18N/messages/index.id.xml | 29 ++ .../Advanced/Samples/I18N/messages/tests.id.xml | 17 ++ .../protected/pages/Advanced/id/Assets.page | 69 +++++ .../protected/pages/Advanced/id/Auth.page | 120 ++++++++ .../protected/pages/Advanced/id/Collections.page | 135 +++++++++ .../protected/pages/Advanced/id/Error.page | 77 +++++ .../protected/pages/Advanced/id/I18N.page | 336 +++++++++++++++++++++ .../protected/pages/Advanced/id/Logging.page | 61 ++++ .../protected/pages/Advanced/id/MasterContent.page | 57 ++++ .../protected/pages/Advanced/id/Performance.page | 88 ++++++ .../protected/pages/Advanced/id/Scripts.page | 334 ++++++++++++++++++++ .../protected/pages/Advanced/id/Scripts1.page | 86 ++++++ .../protected/pages/Advanced/id/Scripts2.page | 214 +++++++++++++ .../protected/pages/Advanced/id/Scripts3.page | 84 ++++++ .../protected/pages/Advanced/id/Security.page | 79 +++++ .../protected/pages/Advanced/id/State.page | 54 ++++ .../protected/pages/Advanced/id/Themes.page | 60 ++++ .../protected/pages/Advanced/id/exception.gif | Bin 0 -> 7658 bytes .../protected/pages/Advanced/id/exception2.gif | Bin 0 -> 39000 bytes .../protected/pages/Advanced/id/logrouter.gif | Bin 0 -> 12120 bytes .../protected/pages/Advanced/id/mastercontent.gif | Bin 0 -> 10748 bytes .../protected/pages/Advanced/id/pcrelation.gif | Bin 0 -> 6600 bytes 25 files changed, 2085 insertions(+) create mode 100644 demos/quickstart/protected/pages/Advanced/Samples/I18N/id/Home.page create mode 100644 demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.id.xml create mode 100644 demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.id.xml create mode 100644 demos/quickstart/protected/pages/Advanced/id/Assets.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Auth.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Collections.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Error.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/I18N.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Logging.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/MasterContent.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Performance.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Scripts.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Scripts1.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Scripts2.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Scripts3.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Security.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/State.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/Themes.page create mode 100644 demos/quickstart/protected/pages/Advanced/id/exception.gif create mode 100644 demos/quickstart/protected/pages/Advanced/id/exception2.gif create mode 100644 demos/quickstart/protected/pages/Advanced/id/logrouter.gif create mode 100644 demos/quickstart/protected/pages/Advanced/id/mastercontent.gif create mode 100644 demos/quickstart/protected/pages/Advanced/id/pcrelation.gif diff --git a/.gitattributes b/.gitattributes index c20bf896..3de8b5ff 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1166,16 +1166,19 @@ demos/quickstart/protected/pages/Advanced/Samples/I18N/Home.zh.page -text demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.php -text demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.tpl -text demos/quickstart/protected/pages/Advanced/Samples/I18N/config.xml -text +demos/quickstart/protected/pages/Advanced/Samples/I18N/id/Home.page -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.de.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.en.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.es.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.fr.xml -text +demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.id.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.pl.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/index.zh.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.de.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.en.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.es.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.fr.xml -text +demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.id.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.pl.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/messages/tests.zh.xml -text demos/quickstart/protected/pages/Advanced/Samples/I18N/zh_TW/Home.page -text @@ -1188,6 +1191,26 @@ demos/quickstart/protected/pages/Advanced/State.page -text demos/quickstart/protected/pages/Advanced/Themes.page -text demos/quickstart/protected/pages/Advanced/exception.gif -text demos/quickstart/protected/pages/Advanced/exception2.gif -text +demos/quickstart/protected/pages/Advanced/id/Assets.page -text +demos/quickstart/protected/pages/Advanced/id/Auth.page -text +demos/quickstart/protected/pages/Advanced/id/Collections.page -text +demos/quickstart/protected/pages/Advanced/id/Error.page -text +demos/quickstart/protected/pages/Advanced/id/I18N.page -text +demos/quickstart/protected/pages/Advanced/id/Logging.page -text +demos/quickstart/protected/pages/Advanced/id/MasterContent.page -text +demos/quickstart/protected/pages/Advanced/id/Performance.page -text +demos/quickstart/protected/pages/Advanced/id/Scripts.page -text +demos/quickstart/protected/pages/Advanced/id/Scripts1.page -text +demos/quickstart/protected/pages/Advanced/id/Scripts2.page -text +demos/quickstart/protected/pages/Advanced/id/Scripts3.page -text +demos/quickstart/protected/pages/Advanced/id/Security.page -text +demos/quickstart/protected/pages/Advanced/id/State.page -text +demos/quickstart/protected/pages/Advanced/id/Themes.page -text +demos/quickstart/protected/pages/Advanced/id/exception.gif -text +demos/quickstart/protected/pages/Advanced/id/exception2.gif -text +demos/quickstart/protected/pages/Advanced/id/logrouter.gif -text +demos/quickstart/protected/pages/Advanced/id/mastercontent.gif -text +demos/quickstart/protected/pages/Advanced/id/pcrelation.gif -text demos/quickstart/protected/pages/Advanced/logrouter.gif -text demos/quickstart/protected/pages/Advanced/logrouter.vsd -text demos/quickstart/protected/pages/Advanced/mastercontent.gif -text diff --git a/demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.tpl b/demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.tpl index 2f919630..de1ef60f 100644 --- a/demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.tpl +++ b/demos/quickstart/protected/pages/Advanced/Samples/I18N/LanguageList.tpl @@ -5,6 +5,7 @@
Demo ini memperlihatkan komponen dasar yang tersedia dalam PRADO untuk memproses Internasionalisasi dan Lokalisasi aplikasi web. Halam ini memanfaatkan template siap multipel lokal (atau kultur) untuk memperlihatkan halaman terlokalisasi yang tersedia. Untuk melihat versi dilokalisasi yang berbeda, silahkan ganti setelan bahasa dalam browser anda.
+ ++Saat ini kultur anda adalah <%= $this->Page->CurrentCulture %>. +
+ Sebagai tambahan ke template siap kultur. Teks dapat dilokalisasi menggunakan banyak sumber terjemanan yang berbeda. PRADO menyediakan wadah gettext, XML, SQLite, dan MySQL untuk menyimpan terjemahan pesan. Contoh dalam link berikut mendemonstrasikan bagaimana teks dapat dilokalisasi menggunakan komponen TTranslate. +
+Mengembangkan dan memelihara situs multi-bahasa adalah masalah umum bagi para pengembang web.
+Fitur berikut didukung oleh PRADO:
++Asset adalah file sumber daya (seperti gambar, suara, video, CSS stylesheet, javascript, dll.) yang dimiliki oleh kelas komponen tertentu. Assets disediakan bagi para pengguna Web. Untuk usabilitas dan kemudahan penyebaran kelas komponen terkait, asset harus berada bersama dengan file kelas komponen. Sebagai contoh, tombol toggle dapat memakai dua gambar, disimpan dalam file down.gif dan up.gif, untuk menampilkan kondisi toggle berbeda. Jika kita ingin file gambar disimpan di bawah direktori images di bawah akar dokumen server Web, tidak akan menjadi nyaman bagi para pengguna komponen tombol toggle, karena setiap kali mereka mengembangkan atau menyebarkan aplikasi baru, mereka harus meng-copy file gambar ke direktori tertentu itu secara manual. Untuk mengeliminir persyaratan ini, direktori relatif ke file kelas komponen harus digunakan untuk menyimpan file gambar. Strategi umum adalah menggunakan direktori yang berisi file kelas komponen untuk menyimpan file asset. +
++Karena direktori yang berisi file kelas komponen biasanya tidak bisa diakses oleh pengguna Web, PRADO menerapkan skema penerbitan asset untuk menjadikan assets tersedia bagi para pengguna Web. Sebuah asset, setelah diterbitkan, akan mempunyai URL di mana para pengguna bisa mengambil file asset. +
+ ++PRADO menyediakan beberapa metode untuk penerbitan asset atu direktori yang berisi asset: +
++HATI-HATI: Sangat berhati-hatilah dengan penerbitan asset, karena ia memberikan para pengguna Web akses ke file yang sebelumnya tidak dapat diakses. Pastikan bahwa anda tidak menerbitkan file yang tidak ingin pengguna lain melihatnya. +
+ ++Penerbitan asset diatur oleh modul System.Web.TAssetManager. Standarnya, semua file asset yang diterbitkan disimpan di bawah direktori [AppEntryPath]/assets, di mana AppEntryPath merujuk ke direktori yang berisi naskah entri aplikasi. Pastikan direktori assets bisa ditulisi oleh proses server Web. Anda dapat mengubah direktorinya ke direktori lain dengan mengkonfigurasi properti BasePath dan BaseUrl pada modul TAssetManager dalam konfigurasi aplikasi, +
++PRADO menggunakan teknik cache guna memastikan efisiensi penerbitan asset. Menerbitkan asset intinya memerlukan operasi copy file, yang mahal. Untuk menyimpan operasi copy file yang tidak diperlukan, System.Web.TAssetManager hanya menerbitkan asset saat ia memiliki waktu modifikasi file lebih baru daripada file yang pernah diterbitkan. Ketika aplikasi dijalankan di bawah mode Performance, pemeriksaan cap waktu tersebut juga diabaikan. +
++SARAN: Jangan menggunakan penerbitan asset secara berlebihan. Konsep asset dipakai terutama untuk membantu pemakaian ulang dan redistribusi kelas komponen lebih baik. Normalnya, anda tidak akan menggunakan penerbitan asset untuk sumberdaya yang tidak terikat ke komponen manapun dalam aplikasi. Sebagai contoh, anda jangan menggunakan penerbitan asset untuk gambar yang digunakan terutama sebagai elemen desain (misalnya logo, gambar latar belakang, dll). Biarkan server Web melayani gambar ini secara langsung yang akan membantu meningkatkan performansi aplikasi anda. +
+ ++Sekarang kita menggunakan contoh tombol toggle untuk menjelaskan penggunaan asset. Kontrol menggunakan dua file gambar up.gif dan down.gif, yang disimpan di bawah direktori yang berisi file kelas. Ketika tombol dalam kondisi Up, kita ingin menampilkan gambar up.gif. Ini dapat dikerjakan seperti berikut, +
++Dalam contoh di atas, pemanggilan $this->getAsset('up.gif') akan menerbitkan file gambar up.gif dan mengembalikan URL untuk file gambar yang diterbitkan. URL kemudian disajikan sebagai atribut dari tag gambar HTML. +
++Untuk meredistribusi ToggleButton, cukup paketkan bersama file kelas dan file gambar. Para pengguna ToggleButton cuma perlu untuk mengurai file, dan mereka bisa menggunakannya secara langsung tanpa mencemaskan mengenai ke mana meng-copy file gambar itu. +
++Otentikasi adalah proses verifikasi apakah seseorang yang mengaku siapa dirinya. Biasanya menyangkut nama pengguna dan kata sandi, tapi bisa menyertakan metode lain dari mendemonstrasikan identitas, seperti kartu pintar, sidik jari, dll. +
++Otorisasi adalah mendapatkan keterangan jika orang yang sekali teridentifikasi, diijinkan untuk memanipulasi sumber daya tertentu. Ini biasanya ditentukan dengan menyelidiki apakah orang itu memiliki aturan akses tertentu terhadap sumber daya atau tidak. +
+ ++PRADO menyediakan kerangka kerja otentikasi/otorisasi yang dapat diperluas. Seperti dijelaskan dalam masa hidup aplikasi, TApplication menyimpan beberapa masa hidup untuk modul yang bertanggung jawab terhadap otentikasi dan otorisasi. PRADO menyediakan modul TAuthManager untuk keperluan tersebut. Para pengembang dapat memasukan modul otentikasinya sendiri dengan mudah. TAuthManager didesain untuk dipakai bersama dengan modul TUserManager, yang menerapkan datbase pengguna hanya-baca. +
++Ketika sebuah permintaan halaman terjadi, TAuthManager akan mencoba untuk mengembalikan informasi pengguna dari sesi. Jika tidak ada informasi pengguna yang ditemukan, pengguna dianggap sebagai pengguna anonim atau tamu. Guna menjembatani verifikasi identitas pengguna, TAuthManager menyediakan dua metode yang umum dipakai: login() dan logout(). Pengguna dimasukan (diverifikasi) jika entitas nama pengguna serta kata sandinya sama dengan rekaman dalam database pengguna yang diatur oleh TUserManager. Pengguna dikeluarkan jika informasi pengguna dihapus dari sesi dan dia perlu masuk lagi jika dia membuat permintaan baru terhadap halaman. +
++Selama masa hidup aplikasi Otorisasi, yang terjadi setelah masa hidup Otentikasi, TAuthManager akan memverifikasi apakah pengguna saat ini mempunyai akses ke halaman yang diminta berdasarkan set aturan otorisasi. Otorisasi adalah berbasis-aturan, misalnya seorang pengguna memiliki akses ke sebuah halaman jika 1) halaman secara ekplisit menyatakan bahwa pengguna mempunyai akses; 2) atau pengguna adalah aturan tertentu yang memiliki akses ke halaman. Jika pengguna tidak mempunyai akses ke halaman, TAuthManager akan mengalihkan browser pengguna ke halaman masuk yang ditetapkan oleh properti LoginPage. +
+ ++Untuk menghidupkan kerangka kerja otentikasi PRADO, tambahkan modul TAuthManager dan modul TUserManager ke konfigurasi aplikasi, +
++Di atas, properti UserManager dari TAuthManager disetel ke modul users yang adalah TUserManager. Para pengembang dapat menggantinya dengan modul manajemen pengguna yang berasal dari TUserManager. +
++Aturan otorisasi untuk halaman ditetapkan dalam konfigurasi halaman seperti berikut, +
++Aturan otorisasi bisa berupa aturan mengijinkan atau aturan menolak. Setiap aturan terdiri dari empat properti opsional: +
++Ketika permintaan halaman sedang diproses, daftar aturan otorisassi menjadi tersedia. Akan tetapi, hanya aturan efektif yang pertama menyamai pengguna saat ini akan menyajikan hasil otorisasi. +
++Dalam contoh di atas, pengguna anonim akan ditolak atas penulisan ke PageID1 dan PageID2, sementara User1 dan User2 dan semua pengguna aturan Role1 bisa mengakses dua halaman (baik metode get maupun post). +
+ ++Seperti telah disebutkan di atas, TUserManager menerapkan database pengguna hanya-baca. Informasi pengguna ditetapkan baik dalam konfigurasi aplikasi ataupun file XML eksternal. +
++Kita telah melihat contoh di atas yang menggunakan duapengguna ditetapkan dalam konfigurasi aplikasi. Sintaks lengkap atas penetapan pengguna dan informasi aturan adalah sebagi berikut, +
++di mana atribut roles dalam elemen user adalah opsional. Aturan pengguna dapat ditetapkan baik dalam elemen user ataupun dalam elemen role terpisah. +
+ ++TDbUserManager diperkenalkan dalam v3.1.0. Tujuan utamanya adalah untuk menyederhanakan tugas pengaturan akun pengguna yang disimpan dalam sebuah database. Ini membutuhkan para pengembang untuk menulis kelaspengguna yang mewakili informasi yang diperlukan untuk akun pengguna. Kelas pengguna harus diperluas dari TDbUser. +
++Untuk menggunakan TDbUserManager, konfigurasi itu dalam konfigurasi aplikasi seperti berikut: +
++Dalam contoh di atas, UserClass menetapkan bahwa kelas akan dipakai untuk membuat turunan pengguna. Kelas harus diperluas dari TDbUser. ConnectionID merujuk ke ID dari modul TDataSourceConfig yang menetapkan bagaimana untuk melakukan koneksi database guna mendapatkan informasi penggunanya. +
++Kelas pengguna harus menerapkan dua metode abstrak dalam TDbUser: validateUser() dan createUser(). Karena informasi akun pengguna disimpan dalam sebuah database, kelas pengguna dapat menggunakan properti DbConnection-nya untuk menjangkau database. +
+ ++Koleksi adalah struktur data dasar dalam pemrograman. Sebagai tambahan pada pemrograman PHP, array dipakai secara luas untuk mewakili koleksi struktur data. Array PHP adalah campuran dari array berindeks-kardinal dan tabel campuran. +
++Untuk menghidupkan manipulasi obyek-terorientasi atas koleksi, PRADO menyediakan kelas koleksi bertenaga. Diantaranya, TList dan TMap adalah yang paling mendasar dan biasanya melayani sebagai basis kelas untuk kelas koleksi lainnya. Karena banyak komponen PRADO memiliki properti yang bertipe koleksi, penting bagi para pengembang untuk menguasai pemakaian kelas koleksi PRADO. +
+ ++Obyek TList mewakili array berindeks-kardinal, misalnya array (obyek) dengan indeks 0, 1, 2, ... +
++TList bisa dipakai seperti array PHP. Sebagai contoh, +
++Untuk memperoleh jumlah item dalam daftar, gunakan properti Count. Catatan, jangan gunakan count($list), karena ia selalu mengembalikan 1. +
+ ++Sebagai tambahan, TList menerapkan beberapa metode yang nyaman untuk dipakai secara umum guna memanipulasi data dalam sebuah daftar. Ini termasuk +
++Seperti telah disebutkan di atas, banyak properti komponen PRADO didasarkan pada TList atau kelas koleksi berasal dari TList. Properti ini semuanya berbagi pemakaian tersebut di atas. +
++Sebagai contoh, TControl (basis kelas untuk semua kontrol PRADO) mempunyai properti yang disebut Controls yang mewakili koleksi dari kontrol anak. Tipe Controls adalah TControlCollection yang memperluas TList. Oleh karena itu, untuk menambahkan kontrol anak baru, kita dapat menggunakan cara berikut, +
++Untuk menjelajahi melalui kontrol anak, kita bisa menggunakan, +
++Controh lain adalah properti Items, tersedia dalam kontrol list, TRepeater, TDataList dan TDataGrid. Dalam kontrol ini, kelas leluhur dari Items adalah TList. +
+ ++Seringkali kita ingin memperluas TList untuk melakukan operasi tambahan untuk setiap penambahan atau penghapusan sebuah item. Satu-satunya metode yang diperlukan kelas anak untuk mengganti adalah insertAt() dan removeAt(). Sebagai contoh, untuk memastikan daftar hanya berisi item yang bertipe TControl, kita dapat mengganti insertAt() sebagai berikut, +
++Obyek TMap mewakili tabel campuran (atau kami katakan array berindeks-string). +
++Mirip dengan TList, TMap bisa dipakai layaknya sebuah array, +
++Properti Count memberikan jumlah item dalam map sementara properti Keys mengembalikan daftar kunci yang dipakai dalam map. +
+ ++Metode berikut disediakan oleh TMap demi kenyamanan, +
++TAttributeCollection adalah kelas khusus yang diperluas dari TMap. Ia dipakai terutama oleh properti Attributes dari TControl. +
+Selain fungsionalitas normal yang disediakan oleh TMap, TAttributeCollection membolehkan anda untuk mendapatkan dan menyetel item koleksi seperti mendapatkan dan menyetel properti. Sebagai contoh, + ++Catatan, dalam $collection di atas TIDAK mempunyai properti Label. +
++Tidak seperti TMap, kunci dalam TAttributeCollection tidak sensitif huruf. Oleh karena itu $collection->Label sama dengan $collection->LABEL. +
++Karena fitur baru di atas, ketika berhadapan dengan properti Attributes dari kontrol, kita dapat mengambil keuntungan dari konsep subproperti dan mengkonfigurasi nilai atribut kontrol dalam sebuah template seperti berikut, +
++yang menambahkan atribut bernama onclick ke kontrol TButton. +
++PRADO menyediakan kerangka kerja penanganan kesalahan dan laporan lengkap berdasarkan pada mekanisme eksepsi dari PHP 5. +
+ ++Kesalahan yang terjadi dalam aplikasi PRADO dapat diklasifikasikan ke dalam tiga kategori: kesalahan yang disebabkan oleh penguraian naskah PHP, kode yang salah (seperti memanggil fungsi yang tidak didefinisikan, menyetel properti yang tidak dikenal), dan yang disebabkan oleh pemakaian yang tidak benar pada aplikasi Web oleh pengguna klien (seperti mencoba untuk mengakses halaman terbatas). PRADO tidak dapat berhadapan dengan kesalahan kategori pertama karena tidak dapat ditangkap dalam kode PHP. PRADO menyediakan sebuah hirarki eksepsi untuk berhadapan dengan kategori kedua dan ketiga. +
++Semua kesalahan dalam aplikasi PRADO digambarkan sebagai eksepsi. Basis kelas untuk seluruh eksepsi PRADO adalah TException. Ia menyediakan fungsionalitas internasionalisasi pesan bagi semua eksepsi sistem. Pesan kesalahan dapat diterjemahkan ke dalam bahasa yang berbeda tergantung pada preferensi bahasa browser pengguna. +
++Eksepsi muncul karena pemakaian yang tidak benar dari kerangka kerja PRADO yang diturunkan dari TSystemException, yang bisa berupa salah satu dari kelas eksepsi berikut: +
++Kesalahan karena pemakaian yang salah dari aplikasi Web oleh pengguna klien diturunkan dari TApplicationException. +
+ ++Memunculkan eksepsi dalam PRADO tidak berbeda dengan memunculkan eksepsi normal PJHP. Satu hal yang sama adalah untuk memunculkan eksepsi yang benar. Secara umum, eksepsi yang ditujukan untuk ditampilkan ke pengguna aplikasi harus menggunakan THttpException, sementara eksepsi yang ditampilkan bagi para pengembang harus menggunakan kelas eksepsi lain. +
+ ++Eksepsi muncul selama menjalankan aplikasi PRADO ditangkap oleh modul System.Exceptions.TErrorHandler. Template output berbeda dipakai untuk menampilkan eksepsi yang ditangkap. THttpException dianggap berisi pesan kesalahan yang ditujukan untuk aplikasi pengguna akhir dan kemudian menggunakan grup template khusus. Untuk semua eksepsi lainnya, template umum ditampilkan seperti berikut dipakai untuk menyajikan eksepsi. +
+ + ++Para pengembang dapat mengkustomisasi penyajian pesan kesalahan. Standarnya, semua template output kesalahan disimpan dalam framework/Exceptions/templates. Lokasi dapat diubah dengan mengkonfigurasi TErrorHandler dalam konfigurasi aplikasi, +
++THttpException menggunakan satu set template yang dibedakan berdasarkan pada nilai properti StatusCode yang berbeda dari THttpException. StatusCode memiliki arti yang sama seperti kode status dalam protokol HTTP. Sebagai contoh, kode status yang sama dengan 404 berarti URL yang diminta tidak ditemukan pada server. File template output menggunakan konvensi penamaan berikut: +
++di mana status code merujuk ke nilai properti StatusCode dari THttpException, dan kode bahasa harus bahasa yang benar seperti misalnya en, zh, fr, dll. Ketika THttpException muncul, PRADO akan memilih template yang sesuai untuk menampilkan pesan eksepsi. Pertama PRADO akan mencari file template yang namanya berisi kode status dan yang bahasanya lebih disukai oleh jendela browser klien. Jika template seperti itu tidak ada, ia akan mencari template yang memiliki kode status yang sama tapi tanpa kode bahasa. +
++Konvensi penamaan untuk file template yang dipakai bagi semua eksepsi adalah sebagai berikut, +
++Sekali lagi, jika bahasa yang diinginkan tidak ditemukan, sebaliknya PRADO akan mencoba menggunakan exception.html. +
+Banyak aplikasi web dibangun dengan PHP tidak memikirkan internasionlisasi saat ia pertama kali ditulis. Itu mungkin dikarenakan tidak dimaksudkan untuk digunakan dalam bahasa dan kultur. Internasionalisasi adalah aspek penting karena meningkatkan adopsi Internet dalam banyak negara yang berbicara non-Ingris. Proses internasionalisasi dan lokalisasi akan mengandung kesulitan. Di bawah adalah beberapa petunjuk umum untuk menginternasionalisasi aplikasi yang sudah ada.
+ +Identifikasi dan pisahkan data yang beragam dengan kultur. Yang paling jelas adalah teks/string/pesan. Tipe lain dari data juga harus dipertimbangkan. Daftar berikut mengkategorikan beberapa contoh data sensitif kultur +
+ +Bila memungkinkan semua ragam teks harus diisolasi dan disimpan dalam format persisten. Teks ini termasuk, pesan kesalahan aplikasi, string ditulis tangan dalam file PHP, email, teks statis HTML, dan teks pada elemen formulir (misalnya tombol).
+ +Untuk menghidupkan fitur lokalisasi dalam PRADO, anda perlu menambahkan beberapa opsi konfigurasi dalam konfigurasi aplikasi anda. +Pertama anda perlu menyertakan namespace System.I18N.* ke path anda. +
+Kemudian, jika anda ingin menterjemahkan beberapa teks dalam aplikasi anda, anda perlu menambahkan sumber data pesan terjemahan.
+Di mana source dalam translation adalah path titik ke direktori di mana anda akan menyimpan katalog pesan terjemahan. Atribut autosave jika dihidupkan, menyimpan pesan tidak diterjemahkan kembali ke dalam katalog pesasn. +Dengan menghidupkan cache, pesan yang diterjemahkan disimpan dalam direktori aplikasi runtime/i18n. +Nilai marker dipakai untuk mengelilingi teks yang tidak diterjemahkan. +
+ +Dengan konfigurasi lengkap, sekarang kita dapat mulai melokalisasi aplikasi anda. Jika anda menghidupkan autosave, setelah menjalankan aplikasi anda dengan beberapa aktivitas lokalisasi (misalnya menterjemahkan beberapa teks), anda akan melihat sebuah direktori dan messages.xml dibuat di dalam direktori source.
+ +File katalog pesan terjemahan, jika menggunakan type="XLIFF", adalah format intechange XML pesan terjemahan distandarisasi. Anda bisa mengedit file XML menggunakan editor yang mampu menangani UTF-8. Format dari XML adalah sesuatu mirip seperti berikut ini.
+ +Sekali globalisasi dihidupkan, anda dapat mengakses setelan globalisasi, seperti Culture, Charset, dll, menggunakan
+Anda juga mengubah cara kultur ditentukan dengan mengubah atribut class dalam konfigurasi modul. Sebagai contoh, untuk menyetel kultur yang tergantung pada setelan browser, anda bisa menggunakan kelas TGlobalizationAutoDetect.
+
Anda juga bisa menyediakan kelas globalisasi sendiri untuk mengubah bagaimana kultur aplikasi ditetapkan. +Terakhir, anda dapat mengubah setelan globalisasi dengan basis halaman demi halaman menggunakan tag kontrol template. Sebagai contoh, mengubah Culture ke "zh".
+Fungsi localize mencari string yang diterjemahkan yang sama dengan aslinya dari sumber terjemahan anda. Pertama, anda perlu mencari semua teks dikode langsung dalam PHP yang ditampilkan atau dikirimkan ke pengguna akhir. Contoh berikut melokalisasi teks $sender (menganggap, katakanlah, sender adalah sebuah tombol). Kode asli sebelum lokalisasi adalah sebagai berikut.
+
Pesan dikodekan langsung "Hello, world!" dilokalisasi menggunakan fungsi localize.
+Pesan gabungan dapat berisi data variabel. Sebagai contoh, dalam pesan "There are 12 users online.", integer 12 dapat berubah tergantung pada beberapa data dalam aplikasi anda. Ini sulit diterjemahkan karena posisi dari data variabel mungkin berbeda untuk bahasa yang berbeda. Seabgai tambahan, bahasa yang berbeda memiliki aturannya sendiri untuk bentuk jamak (jika ada) dan/atau pembilang. Contoh berikut tidak mudah untuk diterjemahkan, karena struktur kalimat sudah tetap dengan dikodekan langsung data variabel dengan pesan.
+Di mana parameter kedua dalam localize mengambil array asosiatif dengan kunci sebagai penempatan yang dicari dalam teks dan menggantinya dengan nilai terkait. +Fungsi localize tidak memecahkan masalah lokalisasi bahasa yang memiliki bentuk jamak, solusinya adalah menggunakan TChoiceFormat.
+ +The following sample demonstrates the basics of localization in PRADO.
+Pesan dan string bisa dilokalisasi dalam PHP atau dalam template. +Untuk menterjemahkan pesan atau string dalam template, gunakan TTranslate.
+ +TTranslate juga dapat melakukan penempatan string. Properti Parameters bisa digunakan untuk menambah pasangan nama nilai untuk penempatan. Substring dalam terjemahan dikurung dengan "{" dan "}" yang dianggap sebagai nama parameter selama pencarian penempatan. Contoh berikut akan menempatkan substring "{time}" dengan nilai atribut parameter "Parameters.time=<%= time() %>".
+
Kependekan dari TTranslate juga disediakan menggunakan sintaks berikut.
+di mana string akan diterjemahkan ke bahasa berbeda berdasarkan preferensi bahasa pengguna akhir. Sintaks ini bisa dipakai dengan nilai atribut juga.
+Memformat tanggal dan jam dilokalisasi adalah pekerjaan langsung.
+Properti Pattern menerima 4 predefininisi pola tanggal dilokalisasi dan 4 predefininisi pola jam dilokalisasi.
++Predefinisi bisa dipakai dalam setiap kombinasi. Jika menggunakan pola predefinisi gabungan, pola pertama harus tanggal, diikuti oleh spasi, dan terakhir pola jam. Sebagai contoh, pola tanggal lengkap dengan pola jam pendek. Aktual uruta dari tanggal-jam dan pola aktual akan ditentukan secara otomatis dari data lokal yang ditetapkan oleh properti Culture.
+ +Anda dapat menetapkan pola kustom menggunakan sub-pola berikut.
+Format tanggal/jam ditetapkan dalam arti pola waktu string. Dalam pola ini, semua huruf ASCII disimpan sebagai huruf pola, yang ditetapkan sebagai berikut:
+
Jumlah pola huruf menentukan format.
+ +(Teks): 4 huruf menggunakan bentuk lengkap, kurang dari 4 menggunakan bentuk pendek atau singkatan +jika ada. (misalnya "EEEE" menghasilkan "Monday", "EEE" menghasilkan "Mon")
+ +(Angka): jumlah digit minimum. Angka lebih pendek adalah diisi-nol ke jumlah ini (misalnya jika "m" menghasilkan "6", "mm" menghasilkan "06"). Tahun ditangani secara khusus; yakni jika jumlah 'y' adalah 2, Tahun akan dipotong 2 digit. (misalnya jika "yyyy" menghasilkan "1997", "yy" menghasilkan "97".) + Tidak seperti field lain, pecahan detik dipadatkan pada sisi kanan dengan nol.
+ +(Teks dan Angka): 3 atau lebih, pakai teks, sebaliknya pakai angka. (misalnya +"M" menghasilkan "1", "MM" menghasilkan "01", "MMM" menghasilkan "Jan", and "MMMM" +menghasilkan "January".)
+ +Setiap karakter dalam pola yang tidak dalam jangkauan ['a'..'z'] +dan ['A'..'Z'] akan diperlakukan sebagai teks bertanda kutip. Contohnya, karakter seperti +':', '.', ' ', dan '@' akan muncul dalam hasil teks waktu +meskipun tidak dikurung dalam tanda kutip tunggal.
+ +Contoh menggunakan lokal US:
+
+
Jika properti Value tidak ditetapkan, tanggal dan jam saat ini yang dipakai.
+ +Kerangka kerja Internasionalisasi PRADO menyediakan pembentukan kurs lokal dan pembentukan angka. Harap dicatat bahwa komponen TNumberFormat hanya menyediakan pembentukan, saat ini ia tidak melakukan konversi atau pertukaran.
+ +Numbers can be formatted as currency, percentage, decimal or scientific +numbers by specifying the Type attribute. The valid types are:
+Properti Culture dan Currency dapat ditetapkan untuk membentuk angka spesifik lokal.
+ +Jika seseorang dari US ingin melihat gambar penjualan dari sebuah toko dalam bahasa Jerman (katakanlah menggunakan kurs EURO), diformat menggunakan kurs jerman, anda perlu untuk menggunakan atribut Culture="de_DE" guna memperoleh kurs yang benar, misalnya 100,00$. Pemisah desimal dan pengelompokan kemudian juga dari lokal de_DE. Ini dapat menimbulkan beberapa kebingungan karena orang dari US memakai "," (koma) sebagai pemisah ribuan. Oleh karena itu, atribut Currency tersedia agar output dari hasil contoh berikut menghasilkan $100.00
+
Properti Pattern menetapkan jumlah digit, posisi pengelompokan ribuan, jumlah titik desimal dan posisi desimal. Karakter aktual yang dipakai untuk menyajikan titik desimal dan titik ribuan adalah spesifik kultur dan akan berubah secara otomatis berdasarkan properti Culture. Karakter Pattern yang benar adalah:
++Sebagai contoh, anggap Value="1234567.12345" dan dengan +Culture="en_US" (yang menggunakan "," untuk titik pemisah ribuan dan "." untuk pemisah desimal). +
+Pesan gabungan, misalnya penempatan string, bisa dilakukan dengan TTranslateParameter.
+Dalam contoh berikut, string "{greeting}" dan "{name}" masing-masing akan diganti dengan nilai "Hello" dan "World". Penempatan string harus dikurung dengan "{" dan "}". Parameter selanjutnya diterjemahkan dengan menggunakans TTranslate.
+
+
Menggunakan fungsi localize atau komponen TTranslate untuk menterjemahkan pesan tidak memberitahu penterjemah kardinalitas dari data yang diminta untuk menentukan struktur jamak yang benar yang dipakai. Ia hanya memberitahunya bahwa ada data tersedia, data dapat berupa apa saja. Selanjutnya, penterjemah tidak akan bisa menentukan dengan memperhatikan penempatan data plural yang benar, struktur bahasa atau prasa yang dipakai. Misalnya dalam bahasa Inggris, untuk menterjemahkan kalimat, "There are {number} of apples.", hasil terjemahan akan berbeda tergantung pada jumlah apel.
+ +Komponen TChoiceFormat melakukan pilihan terjemahan pesan/string. Contoh berikut mendemonstrasikan terjemahan pesan 2 pilihan sederhana.
+ +Dalam contoh di atas, Value "1" (satu), kemudian string yang diterjemahkan adalah "One Apple". Jika Value adalah "2", maka ia akan menampilkan "Two Apples".
+ +Pilihan pesan/string dipisashkan oleh pipa "|" diikuti oleh set notasi dari formulir.
+Setiap kombinasi tidak-kosong dari kurung kotak dan bulat dapat diterima. +String yang dipilih untuk tampilan tergantung pada properti Value. Value dievaluiasi untuk setiap set-nya sampai Value ditemukan milik set tertentu.
+ + ++PRADO menyediakan fungsionalitas sangat fleksibel dan bisa diperluas. Pesan yang dicatat dapat diklasifikasikan berdasarkan tingkat catatan dan kategori pesan. Menggunakan tingkat dan katkegori filter, pesan selanjutnya bisa dialihkan ke tujuan yang berbeda, seperti file, email, jendela browser, dll. Diagram berikut memperlihatkan arsitektur dasar dari mekanisme pencatatan PRADO, +
+ + ++Dua metode berikut disediakan untuk mencatat pesan dalam PRADO, +
++Perbedaan antara Prado::log() dan Prado::trace() adalah bahwa yang kedua memilih secara otomatis tingkat catatan berdasarkan mode aplikasi. Jika aplikasi dalam mode Debug, informasi pelacakan stack ditambahkan ke pesan. Prado::trace() dipakai secara luas dalam kode inti kerangka kerja PRADO. +
+ ++Pesan yang dicatat menggunakan dua fungsi di atas dipelihara dalam memori. Untuk menggunakan pesan, para pengembang perlu mengalihkannya ke tujuan tertentu seperti file, email, atau jendela browser. Pengalihan pesan diatur oleh modul System.Util.TLogRouter. Ketika dimasukan ke dalam aplikasi, ia bisa mengalihkan pesan ke tujuan yang berbeda secara paralel. Saat ini PRADO menyediakan tiga jenis rute: +
++Untuk menghidupkan pengalihan pesan, masukan dan konfigurasi modul TLogRouter dalam konfigurasi aplikasi, +
++Dalam contoh di atas, Levels dan Categories menetapkan log dan filter kategori untuk mengambil secara selektif pesan ke tujuan terkait. +
+ ++Pesan bisa disaring berdasarkan tingkat catatan serta kategorinya. Setiap catatan pesan dikaitkan dengan tingkat dan kategori catatan. Dengan tingkat dan kategori, para pengembang dapat mengambil pesan secara selektif yang menarik bagi mereka. +
++Tingkat catatan didefinisikan dalam System.Util.TLogger termasuk: DEBUG, INFO, NOTICE, WARNING, ERROR, ALERT, FATAL. Pesan bisa disaring berdasarkan kriteria tingkat catatan. Sebagai contoh, jika sebuah filter menetapkan tingkat WARNING dan ERROR, maka hanya pesan tersebut yakni WARNING and ERROR yang akan dikembalikan. +
++Kategori pesan adalah hirarkis. Kategori yang namanya awalan dari yang lain disebut menjadi leluhur kategori atas kategori lainnya. Sebagai contoh, kategori System.Web adalah leluhur dari kategori System.Web.UI dan System.Web.UI.WebControls. Pesan bisa diambil secara selektif menggunakan filter kategori hirarkis tersebut. Sebagai contoh, jika filter kategori adalah System.Web, maka semua pesan dalam System.Web dikembalikan. Sebagai tambahan, pesan dalam kategori anak seperti System.Web.UI.WebControls, juga dikembalikan. +
++Dengan ketentuan, pesan yang dicatat dalam kode inti PRADO dikategorikan berdasarkan namespace dari kelas terkait. Sebagai contoh, pesan yang dicatat dalam TPage akan menjadi kategori System.Web.UI.TPage. +
+ ++Halaman dalam aplikasi Web sering berbagi bagian yang sama. Sebagai contoh, semua halaman dari aplikasi tutorial berbagi bagian header dan footer yang sama. Jika kita menyimpan header dan footer secara berulang dalam setiap file sumber halaman, ia akan memusingkan pemeliharaan jika suatu saat kita menginginkan sesuatu pada header atau footer. Untuk memecahkan masalah ini, PRADO memperkenalkan konsep master dan konten. Ini terutama pola dekorator, dengan konten didekorasi oleh master. +
++Master dan konten hanya berlaku ke kontrol template (kontrol memperluas TTemplateControl atau kelas anaknya). Kontrol template dapat mempunyai paling banyak satu kontrol master dan satu atau beberapa konten (masing-masing diwakili oleh kontrol TContent). Konten akan disisipkan ke dalam kontrol master di tempat yang disiapkan oleh kontrol TContentPlaceHolder. Dan penyajian kontrol template adalah TContentPlaceHolder yang disiapkan kontrol master diganti dengan TContent. +
++Sebagai contoh, anggap kontrol template mempunyai template berikut: +
++yang menggunakan MasterControl sebagai kontrol masternya. Kontrol master mempunyai template berikut, +
++Kemudian, konten disisipkan ke dalam kontrol master berdasarkan diagram berikut, sementara hubungan leluhur-anak dapat dilihat dalam berikutnya. Catatan, kontrol template mengabaikan apapun dalam template selain konten, sementara kontrol master memelihara apapun dan mengganti tempat konten dengan konten berdasarkan ID yang sama. +
+ alt="Master dan Konten" /> + alt="Hubungan leluhur-anak antara master dan konten" /> + ++Master sangat mirip dengan template eksternal yang diperkenalkan sejak versi 3.0.5. Tag include khusus dipakai untuk menyertakan file template eksternal ke dalam basis template. +
++Baik template master maupun eksternal bisa dipakai untuk berbagi konten yang sama diantara halaman. Master adalah kontrol template yang berisi konten umum dan file kelasnya berisi logika terkait dengan master. Dilain pihak, template eksternal adalah file template murni tanpa file kelas apapun. +
++Oleh karena itu, gunakan kontrol master jika konten umum harus dikaitkan dengan beberapa logika, seperti header halaman dengan kotak pencarian atau kotak login. Kontrol master membolehkan anda untuk menetapkan bagaimana konten umum harus berinteraksi dengan pengguna akhir. Jika anda menggunakan template eksternal, anda harus menyimpan logika yang diperlukan dalam halaman atau kelas kontrol yang memiliki basis template. +
++Performansinya, template eksternal lebih ringan daripada master seperti berisi kontrol sendiri yang berparisipasi dalam masa hidup halaman, karena pembentuk hanya dipakai saat template sedang diuraikan. +
+ ++Performansi aplikasi Web dipengaruhi oleh banyak faktor. Akses database, operasi sistem file, bandwidth jaringan adalah faktor pengaruh potensial. PRADO mencoba dalam setiap usaha untuk mengurangi akibat performansi yang disebabkan oleh kerangka kerja. +
+ ++PRADO menyediakan teknik cache generik yang dipakai oleh beberapa bagian inti kerangka kerja. Sebagai contoh, ketika cache dihidupkan, TTemplateManager akan menyimpan template yang diurai dalam cache dan menggunakannya kembali dalam permintaan berikut, yang menghemat waktu penguraian template. TThemeManager mengadopsi strategi yang mirip untuk berhadapan dengan penguraian tema. +
++Menghidupkan cache sangat mudah. Cukup tambahkan modul cache dalam konfigurasi aplikasi, dan PRADO memelihara semuanya. +
++Para pengembang juga bisa mengambil keuntungan dari teknik cache dalam aplikasinya. Properti Cache dari TApplication mengembalikan modul cache yang dimasukan bila ia tersedia. Untuk menyimpan dan mengambil item data dari dalam cache, gunakan perintah berikut, +
++di mana $keyName harus berupa string yang secara unik mengidentifikasi item data yang disimpan dalam cache. +
+ ++Sejak v3.1.0, kontrol baru bernama TOutputCache telah diperkenalkan. Kontrol ini membolehkan para pengguna untuk men-cache bagian-bagian dari output halaman. Bila dipakai dengan benar, teknik ini bisa meningkatkan performansi halaman secara signifikan karena kontrol di dalamnya tidak dibuat sama sekali jika versi yang di-cache diminta. +
+ ++Banyak file naskah PHP yang disertakan dapat mempengaruhi performansi aplikasi secara signifikan. Kelas PRADO disimpan dalam file berbeda dan ketika memproses sebuah permintaan halaman, ia bisa menyertakan puluhan file kelas. Untuk mengurangi masalah ini, setiap rilis PRADO, sebuah file bernama pradolite.php juga disertakan. File ini adalah gabungan dari seluruh file kelas inti PRADO dengan komentar dan pencatatan pesannya yang sudah dibuang. +
++Untuk menggunakan pradolite.php dalam naskah entri aplikasi, ganti penyertaan prado.php dengan pradolite.php. +
+ ++Mode aplikasi juga mempengaruhi performansi aplikasi. Aplikasi PRADO dapat berupa salah satu dari mode berikut: Off, Debug, Normal dan Performance. Mode Debug harus dipakai terutama selama pengembangan aplikasi, sementara mode Normal biasanya dipakai dalam tahap berikutnya setelah aplikasi disebarkan guna memastikan semuanya berjalan dengan baik. Setelah aplikasi terbukti bekerja stabil, selanjutnya mode bisa dialihkan ke Performance untuk meningkatkan performansi. +
++Perbedaan antara mode Debug, Normal dan Performance yaitu di bawah mode Debug, catatan aplikasi akan berisi informasi debug, dan di bawah mode Performance, pemeriksaan cap waktu tidak dilakukan untuk template yang di-cache dan asset yang dipublikasikan. Oleh karena itu, di bawah mode Performance, aplikasi mungkin tidak berjalan dengan baik jika template atau asset dimodifikasi. Karena mode Performance dipakai terutama saat aplikasi sudah stabil, mengubah template atau asset tidak disukai. +
++Untuk berganti mode aplikasi, konfigurasi itu dalam konfigurasi aplikasi: +
++Standarnya PRADO menyimpan kondisi halaman dalam field tersembunyi dari output HTML. Kondisi halaman bisa berukuran sangat besar jika menggunakan kontrol yang kompleks, seperti TDataGrid. Guna mengurangi ukuran besarnya halaman yang dikirimkan melalui jaringan, dua strategi dapat dipakai. +
++Pertama, anda dapat mematikan kondisi tampilan dengan menyetel EnableViewState menjadi false untuk halaman atau beberapa kontrol pada halaman jika pengguna tidak perlu berinteraksi dengan halaman/kontrol. +
++Kedua, anda bisa menggunakan penyimpanan kondisi halaman berbeda. Sebagai contoh, kondisi halaman bisa disimpan dalam sesi, yang menyimpan kondisi halamaa terutama pada sisi server dan menghemat waktu transmisi jaringan. Properti StatePersisterClass dari halaman menentukan kelas persisten kondisi yang dipakai. Standarnya menggunakan System.Web.UI.TPageStatePersister untuk menyimpan kondisi persisten dalam field tersembunyi. Anda bisa mengubah properti ini ke kelas persisten anda sendiri, selama kelas persister menerapkan antarmuka IPageStatePersister. Anda dapat mengkonfigurasi properti ini dalam beberapa tempat, seperti konfigurasi aplikasi atau konfigurasi halaman menggunakan tag <pages> or <page>, +
++Catatan, dalam SpecialPage di atas akan menggunakan MyPersister2 sebagai kelas persisternya, sementara halaman lainnya akan menggunakan MyPersister1. Oleh karena itu, anda dapat memiliki strategi perister kondisi untuk halaman yang berbeda. +
+ ++Teknik cache server terbukti sangat efektif meningkatkan performansi aplikasi PRADO. Sebagai contoh, kita telah mengamati bahwa dengan menggunakan Zend Optimizer, RPS (request per second) dari aplikasi PRADO bisa meningkat lebih dari sepuluh kali. Tentunya, ini merupakan harga dari output yang stabil, sementara teknik cache PRADO selalu memastikan kebenaran output. +
+ ++ Jika anda adalah seorang pengembang web developer dan datang dari tempat yang sama seperti saya, anda mungkin telah mengenal sedikit Javascript dalam halaman web anda, terutama sebagai perekat UI. +
++ + Sampai saat ini, saya tahu bahwa Javascript mempunyai kemampuan OO daripada ketika saya dipekerjakan, tetapi saya tidak merasa perlu menggunakannya. Karena browser mulai mendukung set fitur Javascript dan DOM lebih distandarisasikan, itu menjadi semangat untuk menulis kode yang lebih fungsional dan kompleks untuk dijalankan pada klien. Itu membantu kelahiran fenomena AJAX. +
++ Saat kita mulai mempelajari apa yang diperlukan untuk menulis aplikasi AJAX yang baik, kita mulai memperhatikan bahwa Javascript yang kita pakai benar-benar berada di puncak gunung es. + Sekarang kita melihat Javascript dipakai melampaui pekerjaan UI sehari-hari yang sederhana seperti validasi input dan tugas-tugas kecil. Kode klien sekarang jauh lebih maju dan berlapis, lebih mirip aplikasi desktop sebenarnya atau klien tebal dari klien-server. Kita melihat librari kelas, model obyek, hirarki, pola, dan banyak hal lain yang dapat kita pakai hanya dalam kode di dalam server. +
++ Dalam banyak cata kita dapat mengatakan bahwa dengan tiba-tiba palang ditaruh lebih tinggi dari sebelumnya. Ia mengambil palang pintu lebih ahli menulis aplikasi untuk Web baru dan kita perlu mengingkatkan keahlian Javascript kita agar bisa sampai ke sana. + Jika anda mencoba untuk menggunakan banyak librari javascript yang ada di luar sana, seperti + Prototipe.js, + Scriptaculous, + moo.fx, + Perilaku, + YUI, + dan lain-lain, anda secara kebetulan akan menemukan diri anda sendiri sedang membaca kode JS. Mungkin dikarenakan anda ingin mempelajari bagaimana mereka melakukannya, atau karena anda penasaran, atau lebih sering karena itulah satu-satunya cara untuk memahami bagaimana untuk memakainya, karena dokumentasi nampaknya tidak banyak ditujukan terutama terhadap librari ini. Apapun kasusnya, anda akan menghadapi teknik kung-fu yang akan menjadi asing dan menakutkan jika anda belum melihat itu sebelumnya. +
+ ++ Kegunaan dari artikel ini tepatnya menjelaskan tipe konstruksi yang banyak dari kita belum terbiasa dengannya. +
+ + ++ JavaScript Object Notation (JSON,) adalah salah satu dari isu baru yang muncul sekitar tema AJAX. JSON, cukup dikatakan suatu cara mendeklarasikan obyek dalam Javascript. Mari kita lihat contoh segera dan perhatikan bagaimana kemudahannya. +
++ Mari kita tambahkan sedikit pembentukan agar terlihat lebih mirip bagaimana kita biasa menemukannya di sana: +
++ Di sini kita membuat referensi ke obyek dengan dua properti (color + dan legCount) serta metode (communicate.) + Tidak sulit untuk memahami bahwa properti obyek dan metode didefinisikan sebagai daftar dipisahkan koma. Masing-masing anggota diperkenalkan dengan nama, diikuti oleh titik dua dan kemudian definisi. Dalam hal properti, ini cukup mudah, hanya nilai properti. Metode yang dibuat dengan penempatan fungsi anonim, yang akan kami jelaskan lebih baik di bawah baris. + Setelah obyek dibuat dan ditempatkan ke variabel myPet, kita dapat menggunakanya seperti ini: +
+ ++ Anda akan melihat JSON banyak dipakai di mana saja dalam JS baru-baru ini, sebagai argumen bagi fungsi, sebagai nilai hasil, sebagai respon server (dalam string,) dll. +
+ ++ Ini mungkin tidak biasa bagi para pengembang yang tidak pernah memikirkan tentang itu, tapi dalam fungsi JS adalah sebuah obyek. Anda bisa mengirimkan sebuah fungsi sebagai argumen terhadap fungsi lain sama seperti anda mengirimkan sebuah string, misalnya. Ini sering dipakai dan siap digunakan. +
+ ++ Lihat pada contoh ini. Kami akan mengirimkan fungsi ke fungsi lain yang akan memakainya. +
++ Catatan bahwa kami mengirimkan myDog.bark dan myCat.meow tanpa menambahkan tanda kurung "()" kepadanya. Jika kita melakukan itu kita tidak mengirimkan fungsi, sebaliknya kita akan memanggil metode dan mengirimkan nilai hasilnya, tidak terdefinisi dalam kedua kasus di sini. +
+ ++ Jika anda ingin membuat kucing malas mulai mengeong, anda dapat dengan mudah melakukan ini: +
++ Dua baris berikut dalam JS melakukan hal yang sama. +
+ ++ Karena saya yakin anda sudah mengetahuinya, anda dapat mengakses item individual dalam sebuah array menggunakan tanda kurung kotak: +
++ + Tetapi anda tidak dibatasi pada indeks numerik. Anda bisa mengakses banyak obyek JS dengan menggunakan namanya, dalam sebuah string. Contoh berikut membuat obyek kosong, dan menambah beberapa anggotanya dengan nama. +
++ Kode di atas mempunyai pengaruh yang sama seperti berikut: +
++ Dalam banyak cara, ide obyek dan array asosiatif (hashes) dalam JS tidak dibedakan. Dua baris berikut melakukan hal yang sama juga. +
++ + Kekuatan besar dari bahasa pemrograman obyek berasal dari pemakaian kelas. Saya tidak berpikir telah menebak bagaimana kelas didefinisikan dalam JS hanya menggunakan pengalaman saya sebelumnya dengan bahasa lainnya. Nilailah bagi diri anda sendiri. +
++ Mari kita lihat bagaimana kita menambahkan metode pada kelas Pet kita. Kita akan menggunakan properti prototype yang dimiliki oleh semua kelas. Properti prototype adalah sebuah obyek yang berisi semua anggota yang merupakan obyek yang akan dimiliki oleh kelas. + Bahkan kelas JS standarnya, seperti String, Number, + dan Date mempunyai obyek prototype yang bisa kita tambah metode serta propertinya dan menjadikan setiap obyek dari kelas itu secara otomatis mendapatkan anggota baru ini. +
+ ++ Itulah saatnya librari seperti prototype.js siap digunakan. Jika kita menggunakan prototype.js, kita dapat membuat kode kita lebih bersih (setidaknya menurut saya.) +
++ Jika anda tidak pernah bekerja dengan bahasa yang mendukung klosur anda akan mendapatkan idion berikut terlalu busuk. +
++ + Wah! Mari kita jelaskan apa yang terjadi di sini sebelum anda memutuskan saya telah pergi terlalu jauh dan beralih ke artikel yang lebih baik dari yang ini. +
++ Pertama, dalam contoh di atas kita menggunakan librari prototype.js, yang menambahkan setiap fungsi ke kelas array. Setiap fungsi menerima satu argumen yang adalah obyek fungsi. Fungsi ini, silah berganti akan dipanggil sekali untuk setiap item dalam array, mengirimkan dua argumen saat dipanggil, item dan indeks untuk item saat ini. Mari kita panggil fungsi ini sebagai fungsi pengulang kita. + Kita juga dapat menulis kode seperti ini. +
++ Tapi ketika kita tidak ingin melakukan seperti semua anak sekolah, bukan? + Lebih serius, bagaimanapun juga, format terakhir ini lebih sederhana untuk dimengerti karena kita memasuki kode mencari fungsi myIterator. Adalah baik untuk memiliki logaika fungsi iterator di sana dalam tempat yang sama ia dipanggil. Juga, dalam hal ini, kitak tidak memerlukan fungsi iterator di manapun juga dalam kode kita, maka kita dapat mengubahnya ke dalam fungsi anonim tanpa hukuman. +
+ ++ + Salah satu masalah yang paling umum yang kita miliki dengan JS adalah saat kita mulai menulis kode kita, itulah kegunaan dari kata kunci this. Ini benar-benar menjadi tripwire. +
++ Seperti disebutkan sebelumnya, sebuah fungsi juga adalah sebuah obyek dalam JS, dan adakalanya kita tidak memperhatikan bahwa kita mengirimkan sebuah fungsi. +
++ Ambil potongan kode ini sebagai contoh. +
++ Karena fungsi buttonClicked didefinisikan di luar obyek manapun kita cenderung berpikir kata kunci this akan berisi referensi ke + obyek window atau document (menganggap kode ini ada ditengah halaman HTML yang dilihat dalam browser.) +
+ ++ Tapi saat kita menjalankan kode ini kita melihat ia bekerja seperti yang dimaksudkan dan menampilkan id dari tombol yang diklik. Apa yang terjadi di sini adalah bahwa kita membuat metode onclick dari setiap tombol yang berisi referensi obyek buttonClicked, mengganti apapun yang ada di sana sebelumnya. Sekarang kapan saja tombol diklik, browser akan menjalankan sesuatu mirip dengan baris berikut. +
++ + Itu tidak membingungkan sama sekali bukan? Tapi lihat apa yang terjadi, anda mulai memiliki obyek lain yang berhadapan dengannya dan anda ingi betindak pada obyek ini terhadap event seperti klik tombol. +
++ Anda pikir bagus, sekarang saya dapat mengklik tombol Clear pada halaman saya dan tiga kotak teks itu akan dikosongkan. Kemudian anda mencoba mengklik tombol hanya untuk mendapatkan kesalahan runtime. Kesalahan akan terkait dengan + (tebak apa?) kata kunci this. + Masalahnya adalah bahwa this.formFields tidak didefinisikan jika + this berisi sebuah referensi ke tombol, tepatnya itulah apa yang terjadi. Satu solusi cepat adalah menulis ulang baris kode terakhir. +
+ ++ Cara itu kita membuat fungsi baru yang memanggil metode penolong di dalam konteks obyek penolong. +
++Dalam hal anda tidak pernah menggunakannya, prototype.js adalah librari + JavaScript yang ditulis oleh Sam Stephenson. + Pemikiran yang hebat ini dan kode sesuai-standar yang ditulis dengan baik mengambil banyak beban terkait dengan pembuatan halaman web sangat interaktif dan kaya yang mengkarakterkan Web 2.0 di belakang anda. +
+ ++ Jika anda baru saja mencoba menggunakan librari ini, anda mungkin mencatat bahwa dokumentasi bukanlah salah satu titik yang terkuat. Seperti banyak pengembang lain sebelum saya, saya mempelajari prototype.js dengan membaca kode sumber dan melakukan percobaan denganya. Saya pikir akan baik jika mengambil catatan selama saya mempelajari dan berbagi dengan orang lain. +
++ Setelah anda membaca contoh dan referensi, para pengembang yang terbiasa dengan bahasa pemrograman Ruby akan mencatat kesamaan maksud antara kelas built-in Ruby dan banyak ekstensi diimplementasikan oleh librari ini. +
+ + ++ Fungsi $() adalah jalan pintas yang siap digunakan untuk fungsi yang semua-terlalu-sering document.getElementById() terhadap DOM. Seperti fungsi DOM, fungsi ini mengembalikan elemen yang id-nya dikirimkan sebagai sebuah argumen. +
+ ++ Tidak seperti fungsi DOM, bagaimanapun juga, yang satu ini melampauinya. Anda dapat mengirimkan lebih dari satu id dan + $() akan mengembalikan obyek Array dengan semua elemen yang diminta. Contoh di bawah seharunya menggambarkan ini. +
+This is a paragraph
+This is another paragraph
++ Hal baik lainnya dari fungsi ini adalah bahwa anda bisa mengirimkan baik string id ataupun elemen obyek itu sendiri, yang menjadikan fungsi ini sangat berguna ketika membuat fungsi lain yang juga mengambil bentuk argumen. +
+ ++ Fungsi $F() adalah jalan pintas penyambutan lainnya. Ia mengembalikan nilai dari setiap kontrol input field, seperti kotak teks atau daftar drop-down. Fungsi bisa diambil sebagai argumen baik elemen id ataupun elemen obyek itu sendiri. +
+Sintaks untuk bekerja dengan event terlihat seperti kode di bawah.
+ +Menganggap untuk saat ini kita ingin mengamati sebuah link yang diklik, kita dapat melakukan yang berikut:
+ +Jika kita menginginkan untuk mendapatkan elemen yang memicu event, kita melakukan ini:
+ +Jika kita ingin mengamati tekanan tombol untuk seluruh dokumen, kita dapat melakukan yang berikut:
+ +Dan katakanlah kita ingin melacak apa yang telak diketikan:
+ +Prototipe mendefinisikan properti di dalam obyek event untuk beberapa dari tombol yang lebih umum, maka jangan ragu-ragu untuk mencari di sekitar Prototype guna melihat yang mana saja itu.
+ +Catatan terakhir pada event tekanan tombol; Jika anda ingin mendeteksi klik kiri anda bisa menggunakan Event.isLeftClick(event).
+ +Tarik dan jatuhkan, pengukuran ulang elemen dinamis, permainan, dan lebih banyak lagi, semuanya memerlukan kemampuan untuk melacak lokasi X dan Y dari mouse. Prototipe menjadikan hal ini cukup sederhana. Kode di bawah melacak posisi X dan Y dari mouse dan memindahkan nilainya ke dalam kotak input bernama mouse.
+ +Jika kita ingin mengamati lokasi mouse saat ia melewati elemen tertentu, cukup ubah argumen dokumen ke id atau elemen yang relevan.
+ +Event.stop(event) akan menghentikan propagasi sebuah event .
+ +Sejauh ini semuanya sudah jelas, tapi sesuatu mulai menjadi sedikit lebih rumit ketika anda perlu bekerja dengan event dalam lingkungan obyek-terorientasi. Anda harus berhadapan dengan penyatuan dan sintaks yang terlihat aneh yang memerlukan beberapa waktu bagi anda untuk mengetahuinya.
+ +Mari kita lihat pada beberapa kode agar anda bisa mendapatkan pengertian yang lebih baik atas apa yang sedang saya bicarakan.
+Wah! Apa yang terjadi di sini? Kita telah mendefinisikan kelas kustom kita EventDispenser. Kita akan menggunakan kelas ini untuk menyiapkan event untuk dokumenkita. Banyak dari kode ini ditulis ulang yang kita lihat di awal kecuali kali ini, kita bekerja dari dalam sebuah obyek.
+ +Melihat metode initialize, sebenarnya kita dapat melihat bagaimana sesuatu menjadi berbeda sekarang. Lihat kode di bawah ini:
+Kita mendapatkan iterator, penyatuan dan semua hal lainnya. Mari kita rinci apa yang dikerjakan kode ini.
+ +Pertama kita memburu koleksi elemen berdasarkan selektor CSS. Ini menggunakan fungsi selektor Prototipe $$(). +Setelah kita menemukan daftar item kita berhadapan dengan apa yang kita kirim ke dalam setiap iterasi di mana kita akan menambahkan pengamat kita.
+ +Sekarang, melihat kode di atas, anda akan mencatat fungsi bindEvent. Ini mengambil metode sebelumnya showTagName dan memperlakukannya sebagai metode yang akan dipicu ketika seseorang mengklik salah satu dari item daftar kita.
+ +Anda juga akan mencatat bahwa kita mengirimkan ini sebagai argumen ke fungsi bindEvent. +Ini membolehkan kita untuk mereferensi obyek dalam konteks EventDispenser +di dalam fungsi showTagName(event) kita. Jika fungsi showTagName memerlukan parameter tambahan, anda melampirkannya ke parameter terakhir dari bindEvent. Sebagai contoh
+Selanjutnya, anda akan melihat bind(this) yang dilampirkan ke fungsi iterator. +Ini sama sekali tidak berkaitan dengan event, ia berada di sini untuk membolehkan saya menggunakan this di dalam iterator. Jika kita tidak menggunakan bind(this), saya tidak bisa mereferensi metode showTagName di dalam iterator.
+ +Ok, kita berlanjut untuk melihat metode kita yang sebenarnya dipanggil saat terjadi event. Karena kita sudah berhadapan dengan showTagName, mari kita lihat itu.
+ +Seperti yang anda lihat, fungsi ini menerima satu argumen--event. +Agar kita mendapatkan elemen yang memicu event kita perlu mengirimkan argumen ke Event.element. Sekarang kita dapat memanipulasinya kapan saja.
+ +Ini mencakup bagian yang paling membingungkan dari kode kita. Teks di atas juga relevan untuk bagian sisa dari kode kita. Jika ada sesuatu mengenai ini yang tidak anda mengerti, jangan ragu-ragu untuk mengajukan pertanyaan dalam forum.
+ +Yang satu ini melontarkan saya dari lingkaran untuk pertama kali saya mencoba menggunakannya. +Saya mencoba sesuatu yang mirip dengan apa yang saya lakukan dalam pemanggilan Event.observe dengan kekecualian penggunaan stopObserving, tapi tidak ada yang berubah. Dengan kata lain, kode di bawah ini TIDAK bekerja.
+ +Apa yang terjadi di sini? Alasan ini tidak bekerja karena tidak ada penunjuk ke pengamat. Ini berarti bahwa ketika kita mengirimkan this.showTagName dalam metode Event.observe sebelumnya, kita mengirimkannya sebagai fungsi anonim. Kita tidak bisa mereferensi fungsi anonim karena ia tidak mempunyai penunjuk.
+ +Lalu bagaimana kita yakin pekerjaan diselesaikan? Semua yang kita perlukan adalah memberikan fungsi mengamati penunjuk, atau kelompok versi bebas: Setel variabel yang mengarah ke this.showTagName. Ok, mari kita ubah kode kita sedikit.
+ +Sekarang kita bisa menghapus pendengar event dari daftar kita seperti ini:
+Librari javascript yang didistribusikan dengan Prado dapat ditemukan dalam direktori +framework/Web/Javascripts/source. File packages.php +dalam direktori itu mendefinisikan daftar nama paket yang tersedia yang diambil. Itu bisa diambil seperti berikut. +
+Ketergantungan masing-masing librari secara otomatis dipecahkan. Komponen yang memerlukan libari tertentu juga akan secara otomatis mengambil librari yang diperlukan. +Sebagai contoh, jika anda menambah komponen TDatePicker pada halaman, datepicker dan dependensinya akan secara otomatis disertakan pada halaman.
+ +Lihat TClientScript untuk opsi penambahan kode Javascript kustom anda ke halaman.
+ +Gunakan TClientScriptLoader untuk menerbitkan dan menggabung file javascript yang sudah ada (misalnya librari javascript yang didistribusikan dengan Prado atau sebaliknya) sebagai paket.
Untuk kontrol yang lebih besar pada apa dan kapan untuk menerbitkan, gunakan metode +registerJavascriptPackages($base, $packages, $debug=null, $gzip=true) +dalam kelas TClientScriptManager, yang turunannya bisa diperoleh dengan $this->getPage()->getClientScript() atau persamaannya. +Sebagai contoh, jika multipel kontrol akan memakai set librari javascript yang sama, tulis sebuah kelas untuk menangani registrasi paket yang diperlukan oleh kontrol tersebut. + ++Kondisi tampilan berada di jantung PRADO. Kondisi tampilan menggambarkan data yang bisa dipakai untuk menyimpan kembali halaman ke kondisi terakhir kali dilihat oleh pengguna akhir sebelum membuat permintaan saat ini. Standarnya, PRADO menggunakan field tersembunyi untuk menyimpan informasi kondisi tampilan. +
++Sangat penting untuk memastikan bahwa kondisi tampilan tidak dirusak oleh pengguna akhir. Tanpa perlindungan, pengguna yang jahat bisa menginjeksi kode berbahaya ke dalam kondisi tampilan dan instruksi yang tidak diinginkan yang mungkin dilakukan ketika kondisi halaman sedang dikembalikan pada sisi server. +
++Untuk mencegah kondisi tampilan dari perusakan, PRADO memaksa kondisi tampilan memeriksa HMAC (Keyed-Hashing for Message Authentication) sebelum menyimpan kembali kondisi tampilan. Pemeriksaan itu bisa mendeteksi apakah kondisi tampilan sudah dirusak atau tidak oleh pengguna akhir. Seandainya kondisi tampilan dimodifikasi, PRADO akan berhenti mengembalikan kondisi tampilan dan mengembalikan pesan kesalahan. +
++Pemeriksaan HMAC memerlukan kunci pribadi yang harus menjadi rahasia bagi pengguna akhir. Para pengembang dapat menetapkan kunci ataupun membiarkan PRADO membuat kunci secara otomatis. Menetapkan kunci secara manual berguna saat aplikasi berjalan pada taman server. Untuk melakukannya, konfigurasi TSecurityManager dalam konfigurasi aplikasi, +
++Pemeriksaan HMAC tidak mencegah pengguna akhir dari pembacaan konten kondisi tampilan. Ukuran keamanan yang ditambahkanadalah untuk mengenkripsi informasi kondisi tampilan agar pengguna akhir tidak bisa mengurainya. Untuk menghidupkan enkripsi kondisi tampilan, setel EnableStateEncryption dari halaman menjadi true. Ini dapat dilakukan dalam konfigurasi halaman atau dalam kode halaman. Catatan, mengenkripsi kondisi tampilan dapat menurunkan performansi aplikasi. Strategi yang lebih baik adalah dengan menyimpan kondisi tampilan pada sisi server daripada field tersembunyi. +
+ ++Penaskahan situs silang(juga dikenal sebagai XSS) terjadi saat aplikasi web mengumpulkan data dari pengguna. Penyerang akan sering menyuntikan JavaScript, VBScript, ActiveX, HTML, atau Flash menjadi aplikasi yang mudah diserang guna mengelabui pengguna aplikasi lain dan mengumpulkan data darinya. Sebagai contoh, Sistem forum yang didesain dengan buruk dapat menampilkan input pengguna dalam tulisan forum tanpa pemeriksaan apapun. Kemudian penyerang bisa menyuntikan beberapa kode jahat JavaScript ke dalam sebuah tulisan agar pengguna lain membaca tulisan ini, JavaScript berjalan tidak seperti yang diharapkan pada komputernya. +
++Salah satu ukuran paling penting guna mencegah penyerangan XSS adalah memeriksa input pengguna sebelum menampilkannya. Seseorang dapat melakukan pengkodean-HTML dengan input pengguna untuk mencapai tujuan ini. Akan tetapi, dalam beberapa situasi, pengkodean-HTML mungkin tidak disukai karena ia mematikan seluruh tag HTML. +
++PRADO menyertakan pekerjaan SafeHTML dan menyediakan bagi para pengembang komponen berguna yang disebut TSafeHtml. Dengan mengurung konten di dalam tag komponen TSafeHtml, konten yang dikurung dipastikan amab bagi pengguna akhir. Sebagai tambahan, TTextBox yang umum dipakai memiliki properti SafeText yang berisi input pengguna yang dipastikan aman bila ditampilkan secara langsung ke pengguna akhir. +
+ ++Melindungi cookie dari serangan adalah sangat penting, karena ID sesi umumnya disimpan dalam cookie. Jika seseorang memegang ID sesi, intinya ia mempunyai semua informasi sesi relevan. +
++Ada beberapa pengukur guna mencegah cookie dari serangan. +
++PRADO menertapkan skema validasi cookie yang mencegah cookie dimodifikasi. Dalam keadaan tertentu, ia melakukan pemeriksaan HMAC untuk nilai cookie jika validasi cookie dihidupkan. +
++Validasi cookie standarnya dimatikan. Untuk menghidupkannya, konfigurasi modul THttpRequest seperti berikut, +
++Untuk menggunakan skema validasi cookie yang disediakan oleh PRADO, anda juga perlu mengambil cookie melalui koleksi Cookies dari THttpRequest dengan menggunakan pernyataan PHP berikut, +
++Untuk mengirimkan data cookie yang dikode dengan informasi validasi, buat obyek THttpCookie baru dan menambahkannya ke koleksi Cookies dari THttpResponse, +
++Aplikasi Web sering memerlukan untuk mengingat apa yang pengguna akhir kerjakan dalam permintaan halaman sebelumnya agar permintaan halaman baru bisa dilayani sesuai dengan itu. Persisten kondisi untuk menangani masalah ini. Secara tradisional, jika halaman perlu memelihara interaksi pengguna, ia akan mengurut ulang sesi, cookie, atau field tersembunyi. PRADO menyediakan baris baru skema kondisi persisten, termasuk kondisi tampilan, kondisi kontrol, dan kondisi aplikasi. +
+ ++Kondisi tampilan berada di jantung PRADO. Dengan kondisi tampilan, halaman Web menjadi tangguh dan mampu menyimpan kembali halaman ke kondisi terakhir kali pengguna akhir berinteraksi sebelum permintaan halaman saat ini. Pemrograman Web mirip dengan pemrograman GUI Windows, dan para pengembang dapat berpikir secara kontinyu tanpa mencemaskan mengenai perjalanan pulang pergi antara pengguna akhir dan server web. Sebagai contoh, dengan kondisi tampilan, sebuah kontrol kotak centang dapat mendeteksi apakah input pengguna mengubah konten dalam kotak centang atau tidak. +
++Kondisi tampilan hanya tersedia untuk kontrol. Kondisi tampilan dari kontrol bisa dimatikan dengan menyetel properti EnableViewState menjadi false. Untuk menyimpan variabel dalam kondisi tampilan, panggil yang berikut, +
++di mana $this merujuk ke obyek kontrol, Caption adalah kunci unik yang mengidentifikasi variabel $caption yang disimpan dalam kondisi tampilan. Untuk mengambil variabel kembali dari kondisi tampilan, panggil yang berikut, +
++Kondisi kontrol mirip dengan kondisi tampilan dalam setiap aspek kecuali bahwa kondisi kontrol tidak bisa dimatikan. Kondisi kontrol bertujuan dipakai untuk menyimpan informasi kondisi krusial halaman atau kontrol mana yang tidak bekerja dengan baik. +
++Untuk menyimpan dan mengambil variabel dalam kondisi kontrol, gunakan perintah berikut, +
++Kondisi aplikasi merujuk ke data yang persisten melalui sesi pengguna dan permintaan halaman. Contoh umum dari kondisi aplikasi adalah penghitung kunjungan pengguna. Nilai penghitung adalah persisten meskipun sesi pengguna saat ini berakhir. Catatan, kondisi tampilan dan kondisi kontrol hilang jika permintaan pengguna untuk halaman yang berbeda, karena kondisi sesi hilang jika sesi pengguna berakhir. +
++Untuk menyimpan dan mengambil variabel dalam kondisi aplikasi, gunakan perintah berikut, +
++PRADO melapisi manajemen sesi tradisional dalam modul THttpSession. Modul dapat diakses dari dalam setiap komponen dengan menggunakan $this->Session, di mana $this merujuk ke obyek komponen. +
+ ++Tema dalam PRADO menyediakan cara bagi para pengembang untuk menyediakan tampilan konsisten melintasi seluruh aplikasi web. Tema berisi daftar nilai awal untuk properti dari berbagai tipe kontrol. Ketika menerapkan tema ke sebuah halaman, semua kontrol dalam halaman tersebut akan menerima nilai properti awal terkait dari tema. Ini membolehkan tema untuk berinteraksi dengan seti properti yang banyak dari berbagai kontrol PRADO, berarti bahwa tema bisa dipakai untuk menetapkan jangkauan besar dari properti penyajian yang tidak bisa dilakukan metode tema lain (misaslnya CSS). Sebagai contoh, tema bisa dipakai untuk menetapkan ukuran standar halaman dari semua grid data melintasi aplikasi dengan menetapkan nilai standar untuk properti PageSize dari kontrol TDataGrid. +
+ ++Tema adalah sebuah direktori yang terdiri dari file skin, file javascript dan file CSS. Setiap file javascript atau CSS yang berada dalam tema akan diregistrasi dengan halaman yang menerapkan tema. Skin adalah set nilai properti awal untuk tipe kontrol tertentu. Tipe kontrol dapat memiliki satu atau beberapa skin, masing-masing diidentifikasi dengan SkinID unik. Ketika menerapkan tema ke sebuah halaman, skin diterapkan ke kontrol jika tipe kontrol dan nilai SkinID keduanya sama dengan ada dalam skin. Catatan, jika skin memiliki nilai SkinID kosong, ia akan menerapkannya ke semua kontrol dari tipe tertentu yang SkinID-nya tidak disetel atau kosong. File skin terdiri dari satu atau beberapa skin, untuk satu atau beberapa tipe kontrol. Tema adalah gabungan dari skin yang didefinisikan dalam semua file skin. +
+ ++Untuk menggunakan sebuah tema, anda perlu menyetel properti Theme dari halaman dengan nama tema, yaitu nama direktori tema. Anda dapat menyetelnya dalam konfigurasi halaman atau dalam konstruktor atau metode onPreInit() dari halaman. Anda tidak bisa menyetel properti setelah onPreInit() karena saat itu, kontrol anak dari halaman sudah dibuat (skin harus diterapkan ke kontrol setelah kontrol tersebut dibuat.) +
++Untuk menggunakan skin tertentu dalam tema untuk sebuah kontrol, setel properti SkinID dari kontrol dalam template seperti berikut, +
++Ini akan menerapkan skin 'Blue' ke tombol. Catatan, nilai properti awal yang ditetapkan oleh skin 'Blue' akan mengganti setiap nilai properti tombol. Gunakan tema stylesheet jika anda tidak ingi diganti. Untuk menggunakan tema stylesheet, setel properti StyleSheetTheme dari halaman daripada Theme (anda bisa memiliki keduanya StyleSheetTheme dan Theme). +
++Untuk menggunakan file Javascript dan file CSS yang berada dalam sebuah tema, kontrol THead harus ditempatkan pada template halaman. Ini dikarenakan tema akan meregistrasi file itu dengan halaman dan THead adalah tempat yang tepat untuk menempatkan mengambil file tersebut. +
++Dimungkinkan untuk menetapkan tipe media dari file CSS yang berisikan sebuah tema. Standarnya, file CSS berlaku untuk semua tipe media. Jika file CSS bernama seperti mystyle.print.css, ia akan diterapkan hanya pada tipe media print. Sebagai contoh lain, mystyle.screen.css hanya berlaku untuk media screen, dan mystyle.css berlaku bagi semua tipe media. +
+ ++Semua tema standarnya harus ditempatkan di bawah direktori [AppEntryPath]/themes, di mana AppEntryPath merujuk ke direktori yang berisi naskah entri aplikasi. Jika anda ingin menggunakan direktori berbeda, konfigurasi properti BasePath dan BaseUrl dari modul System.Web.UI.TThemeManager dalam konfigurasi aplikasi, +
++Membuat sebuah tema melibatkan pembuatan direktori tema dan penulisan file skin (dan kemungkinan file Javascript serta CSS). Nama file skin harus diakhiri dengan .skin. Format file skin adalah sama seperti file template kontrol. Karena file skin tidak mendefinisikan penyajian hubungan leluhur-aak diantara kontrolnya, anda tidak bisa menempatkan tag komponen di dalam yang lainnya. Dan setiap teks statis antara tag komponen diabaikan. Untuk mendefinisikan skin 'Blue' seperti telah disebutkan di atas untuk TButton, tulis yang berikut dalam file skin, +
++Seperti sudah disebutan di atas, anda dapat menyimpan beberapa skin dalam satu file skin, atau memisahkannya ke dalam beberapa file. Strategi yang umum digunakan adalah bahwa setiap file skin hanya berisi skin untuk satu tipe kontrol. Sebagai contoh, Button.skin akan berisi skin hanya untuk tipe kontrol TButton. +
+