Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

merge from yiidoc

  • Loading branch information...
commit 1bff887bf2a9f6eaee15520829dfba21acbca626 1 parent aa67830
qiang.xue authored
Showing with 6,560 additions and 0 deletions.
  1. +17 −0 docs/guide/de/changes.txt
  2. +149 −0 docs/guide/es/basics.view.txt
  3. +17 −0 docs/guide/id/changes.txt
  4. +216 −0 docs/guide/id/extension.create.txt
  5. +47 −0 docs/guide/id/extension.integration.txt
  6. +29 −0 docs/guide/id/extension.overview.txt
  7. +234 −0 docs/guide/id/extension.use.txt
  8. +73 −0 docs/guide/id/form.action.txt
  9. +377 −0 docs/guide/id/form.model.txt
  10. +19 −0 docs/guide/id/form.overview.txt
  11. +71 −0 docs/guide/id/form.table.txt
  12. +72 −0 docs/guide/id/form.view.txt
  13. +550 −0 docs/guide/id/topics.auth.txt
  14. +96 −0 docs/guide/id/topics.console.txt
  15. +105 −0 docs/guide/id/topics.error.txt
  16. +271 −0 docs/guide/id/topics.i18n.txt
  17. +150 −0 docs/guide/id/topics.logging.txt
  18. +160 −0 docs/guide/id/topics.performance.txt
  19. +181 −0 docs/guide/id/topics.prado.txt
  20. +137 −0 docs/guide/id/topics.security.txt
  21. +65 −0 docs/guide/id/topics.theming.txt
  22. +219 −0 docs/guide/id/topics.url.txt
  23. +221 −0 docs/guide/id/topics.webservice.txt
  24. +17 −0 docs/guide/ja/changes.txt
  25. +512 −0 docs/guide/ja/topics.auth.txt
  26. +262 −0 docs/guide/ja/topics.i18n.txt
  27. +139 −0 docs/guide/ja/topics.logging.txt
  28. +155 −0 docs/guide/ja/topics.performance.txt
  29. +175 −0 docs/guide/ja/topics.prado.txt
  30. +213 −0 docs/guide/ja/topics.webservice.txt
  31. +239 −0 docs/guide/no/database.dao.txt
  32. +18 −0 docs/guide/no/database.overview.txt
  33. +31 −0 docs/guide/no/quickstart.installation.txt
  34. +41 −0 docs/guide/no/quickstart.what-is-yii.txt
  35. +59 −0 docs/guide/no/toc.txt
  36. +17 −0 docs/guide/pl/changes.txt
  37. +65 −0 docs/guide/pl/topics.theming.txt
  38. +217 −0 docs/guide/ru/topics.i18n.txt
  39. +34 −0 docs/guide/vi/basics.entry.txt
  40. +30 −0 docs/guide/zh_cn/topics.theming.txt
  41. +222 −0 framework/messages/no/yii.php
  42. +37 −0 framework/views/no/error.php
  43. +33 −0 framework/views/no/error400.php
  44. +32 −0 framework/views/no/error401.php
  45. +33 −0 framework/views/no/error404.php
  46. +35 −0 framework/views/no/error500.php
  47. +31 −0 framework/views/no/error503.php
  48. +74 −0 framework/views/no/exception.php
  49. +23 −0 framework/views/no/log-firebug.php
  50. +32 −0 framework/views/no/log.php
  51. +19 −0 framework/views/no/profile-callstack-firebug.php
  52. +30 −0 framework/views/no/profile-callstack.php
  53. +22 −0 framework/views/no/profile-summary-firebug.php
  54. +41 −0 framework/views/no/profile-summary.php
  55. +44 −0 requirements/messages/no/yii.php
  56. +77 −0 requirements/views/no/index.php
  57. +75 −0 requirements/views/ru/index.php
View
17 docs/guide/de/changes.txt
@@ -0,0 +1,17 @@
+Neue Features
+=============
+
+Diese Seite fasst die wesentlichen neuen Features jeder Yii-Version zusammen.
+
+Version 1.0.5
+-------------
+
+ * ActiveRecord wurden um benannte Bereiche erweitert. Siehe:
+ - [Benannte Bereiche](/doc/guide/database.ar#named-scopes)
+ - [Relationale Abfragen mit benannten Bereichen](/doc/guide/database.arr#relational-query-with-named-scopes)
+
+
+ * ActiveRecord unterstützt nun lazy loading mit dynamischen Abfrageoptionen. Siehe:
+ - [Dynamische Optionen für relationale Abfragen](/doc/guide/database.arr#dynamic-relational-query-options)
+
+<div class="revision">$Id: changes.txt 956 2009-04-21 15:16:03Z qiang.xue@gmail.com $</div>
View
149 docs/guide/es/basics.view.txt
@@ -0,0 +1,149 @@
+Vista (View)
+============
+
+Una vista es un script PHP que consiste basicamente en elementos de la interfaz
+de usuario (user interface - UI). La misma puede contener expresiones PHP, pero
+es recomendable que estas expresiones no modifiquen los datos del modelo y se
+mantengan relativamente simples. Para el mantener la separación de la lógica y
+la presentación se recomienda que la gran parte de la lógica se encuentre
+en el modelo y no en la vista.
+
+Una vista tiene el mismo nombre que es utilizada para identificar un archivo
+script de vista cuando se presenta. El nombre de la vista es el mismo que el nombre
+del archivo de la vista. Por ejemplo, la vista `edit`se refiere a el archivo
+script de vista llamado `edit.php`. Para presentar una vista llame a
+[CController::render()] con el nombre de la vista. Este método buscara la vista
+dentro del directorio `protected/views/ControllerID`.
+
+Dentro del script de vista podemos acceder al controlador utilizando `$this`.
+De esta forma podemos pasmar cualquier propiedad del controlador en la vista
+evaluando `$this->propertyName`.
+
+También podemos utilizar la siguiente forma de llamado a la función render del
+controlador para pasar datos a la vista.
+
+~~~
+[php]
+$this->render('edit', array(
+ 'var1'=>$value1,
+ 'var2'=>$value2,
+));
+~~~
+
+En el ejemplo anterior, el método [render()|CController::render] extraera el segundo parametro array
+en el script de vista para que lo podamos acceder como variables locales `$var1` y `$var2`.
+
+Esquema (Layout)
+----------------
+
+El esquema o layout es un tipo de vista especial que es utilizado para decorar vistas.
+El mismo contiene usualmente porciones de la interfaz de usuario que son comunes a travez de
+muchas vistas. Por ejemplo, el esquema o layout puede contener la porción de header y footer
+y embeber dentro el contenido de la vista,
+
+~~~
+[php]
+......header here......
+<?php echo $content; ?>
+......footer here......
+~~~
+
+en donde `$content` contiene el resultado de la presentación de la vista contenida.
+
+El esquema o layout es aplicado implicitamente cuando se llama a la funcion
+[render()|CController::render]. Por predeterminado, el script de la vista
+`protected/views/layouts/main.php` es utilizado como el esquema. Esto puede ser
+personalizado modificando [CWebApplication::layout] o [CController::layout].
+Para presentar una vista sin aplicarle ningún esquema, llame a la funcion
+[renderPartial()|CController::renderPartial] en vez de la función `render()`.
+
+Widget
+------
+
+Un widget es una instancia de [CWidget] o una clase que lo hereda. Es un componente
+con proposito presentacional principalmente. Los widgets son usualmente embebidos
+en los scripts de vista para generar interfaces de usuarios complejas y contenidas
+en los mismos widgets. Por ejemplo, un widget calendario puede ser utilizado para
+presentar una interfaz de usuario compleja de calendario. Los widgets nos ayudan a
+tener mayor reusabilidad de la interfaz de usuario.
+
+Para utilizar un widget realize lo siguiente en un script de vista:
+
+~~~
+[php]
+<?php $this->beginWidget('path.to.WidgetClass'); ?>
+...body content that may be captured by the widget...
+<?php $this->endWidget(); ?>
+~~~
+
+o
+
+~~~
+[php]
+<?php $this->widget('path.to.WidgetClass'); ?>
+~~~
+
+El segundo se utiliza cuando el widget no necesita ninguno contenido es su cuerpo.
+
+Los widgets pueden ser configurados para customizarse según su comportamiento.
+Esto es realizado mediante la configuración de sus valores de propiedades iniciales
+cuando se llama al método [CBaseController::beginWidget] o al método
+[CBaseController::widget]. Por ejemplo, cuando se utiliza el widget [CMaskedTextField],
+se puede identificar que máscara se desea utilizar. Podemos hacerlo pasandole
+un array con los valores de las propiedades incialmente de la siguiente forma, donde
+las claves del array son los nombres de las propiedades y los valores del array los
+vlores iniciales de las correspondientes propiedades del widget:
+
+~~~
+[php]
+<?php
+$this->widget('CMaskedTextField',array(
+ 'mask'=>'99/99/9999'
+));
+?>
+~~~
+
+Para definir un nuevo widget extienda [CWidget] y sobrecarge los métodos
+[init()|CWidget::init] y [run()|CWidget::run]:
+
+~~~
+[php]
+class MyWidget extends CWidget
+{
+ public function init()
+ {
+ // this method is called by CController::beginWidget()
+ }
+
+ public function run()
+ {
+ // this method is called by CController::endWidget()
+ }
+}
+~~~
+
+Como un controlador el widget también puede tener sus propias vistas. Por predeterminado,
+los archivos de vista de un widget se encuentran dentro del subdirectorio `views` del
+directorio que contiene el archivo de clase widget. Estas vistas pueden ser presentadas
+llamando al método [CWidget::render()], similarmente a como se realiza en un controlador.
+La única diferencia es que no se le aplicará ningún esquema o layout a la vista de un widget.
+
+Vistas de sistema
+-----------------
+
+Las vistas de sistema es la forma de referirse a las vistas utilizadas por Yii
+para mostrar los errores y la informaccion del logueo. Por ejemplo, cuando
+un se realiza un pedido de un controlador o una accion inexistente, Yii lanzará una
+excepción explicando el error. Yii mostrará el error utilizando la vista del sistema
+especifica para el mismo.
+
+Los nombres de las vistas del sistema siguen ciertas reglas. Nombres como
+`errorXXX` refieren a vistas que muestran las CHttpException con código de error
+`XXX`. Por ejemplo, si [CHttpException] es lanzada con el código de error 404,
+la vista `error404` será la que se mostrará.
+
+Yii provee un conjunto de vistas de sistema predeterminados que se pueden localizar en
+`framework/views`. Las mismas pueden ser personalizadas creando las vistas con el mismo
+nombre de archivo dentro de `protected/views/system`.
+
+<div class="revision">$Id: basics.view.txt 416 2008-12-28 05:28:11Z sebathi $</div>
View
17 docs/guide/id/changes.txt
@@ -0,0 +1,17 @@
+Fitur Baru
+==========
+
+Halaman ini meringkas fitur-fitur utama baru yang diperkenalkan dalam setiap rilis Yii.
+
+Versi 1.0.5
+-------------
+
+ * Rekaman aktif ditingkatkan dengan mendukung lingkup penamaan. Lihat:
+ - [Lingkup Bernama](/doc/guide/database.ar#named-scopes)
+ - [Query Relasional dengan Lingkup Bernama](/doc/guide/database.arr#relational-query-with-named-scopes)
+
+
+ * Rekaman aktif ditingkatkan dengan mendukung pemanggilan lazy dengan opsi query dinamis. Lihat:
+ - [Opsi Query Relasional Dinamis](/doc/guide/database.arr#dynamic-relational-query-options)
+
+<div class="revision">$Id: changes.txt 956 2009-04-21 15:16:03Z qiang.xue@gmail.com $</div>
View
216 docs/guide/id/extension.create.txt
@@ -0,0 +1,216 @@
+Membuat Ekstensi
+================
+
+Karena ekstensi bertujuan agar dipakai oleh pengembang pihak ketiga, diperlukan
+beberapa usaha tambahan untuk membuatnya. Berikut ini adalah beberapa pedoman umum:
+
+* Ekstensi harus berdiri sendiri. Yakni, ketergantungan internalnya harus
+ minimal. Ini akan memusingkan bagi para penggunanya jika sebuah ekstensi perlu
+ menginstalasi paket, kelas atau file sumber tambahan.
+* File yang dimiliki ekstensi harus diatur pada direktori yang sama di mana
+ namanya adalah nama ekstensi
+* Kelas dalam ekstensi harus diawali dengan huruf guna menghindari konflik
+ penamaan dengan kelas dalam ekstensi lainnya.
+* Ekstensi harus disertai dengan rincian instalasi dan dokumentasi API.
+ Ini akan mengurangi waktu dan usaha yang diperlukan oleh pengembang lain
+ saat mereka menggunakan esktensi.
+* Ekstensi harus menggunakan lisensi yang sesuai. Jika Anda ingin menjadikan
+ ekstensi Anda dipakai baik oleh proyek open-source dan closed-source,
+ Anda dapat menggunakan lisensi seperti BSD, MIT, dll., bukan GPL karena ia
+ mengharuskan kode yang dipakainya juga harus open-source.
+
+Berikut ini, kami menjelaskan bagaimana untuk membuat sebuah ekstensi baru, berdasarkan
+pada kategorisasi dalam [tinjauan](/doc/guide/extension.overview).
+Deskripsi ini juga berlaku saat Anda membuat komponen terutama yang dipakai
+dalam proyek Anda sendiri.
+
+Komponen Aplikasi
+-----------------
+
+[Komponen aplikasi](/doc/guide/basics.application#application-component)
+harus mengimplementasikan antar muka [IApplicationComponent] atau diperluas dari
+[CApplicationComponent]. Metode utama yang perlu diimplementasikan adalah
+[IApplicationComponent::init] di mana komponen melakukan beberapa pekerjaan
+inisialisasi. Metode ini dipanggil setelah komponen dibuat dan nilai properti awal
+(yang ditetapkan dalam [konfigurasi aplikasi](/doc/guide/basics.application#application-configuration))
+diterapkan.
+
+Secara standar, komponen aplikasi dibuat dan diinisialisasi hanya saat ia
+diakses untuk pertama kali saat penanganan permintaan. Jika komponen aplikasi
+memerlukan untuk dibuat segera setelah turunan aplikasi dibuat, ia akan
+memerlukan pengguna untuk mendaftar ID-nya dalam properti [CApplication::preload].
+
+
+Widget
+------
+
+[Widget](/doc/guide/basics.view#widget) harus diperluas dari [CWidget] atau
+anak kelasnya.
+
+Cara termudah pembuatan widget baru adalah dengan memperluas widget yang sudah ada dan
+menimpa metodenya atau mengganti nilai standar propertinya. Sebagai ontoh, jika
+Anda ingin menggunakan gaya CSS lebih bagus untuk [CTabView], Anda dapat mengkonfigurasi
+properti [CTabView::cssFile] saat menggunakan widget. Anda juga dapat memperluas [CTabView]
+seperti berikut agar Anda tida perlu lagi mengkonfigurasi properti saat menggunakan widget.
+
+~~~
+[php]
+class MyTabView extends CTabView
+{
+ public function init()
+ {
+ if($this->cssFile===null)
+ {
+ $file=dirname(__FILE__).DIRECTORY_SEPARATOR.'tabview.css';
+ $this->cssFile=Yii::app()->getAssetManager()->publish($file);
+ }
+ parent::init();
+ }
+}
+~~~
+
+Dalam contoh di atas, kita menimpa metode [CWidget::init] dan menempatkan
+URL [CTabView::cssFile] ke gaya standar CSS baru kita jika properti
+belum disetel. Kita menempatkan file gaya CSS baru di bawah direktori yang sama
+dengan file kelas `MyTabView` agar bisa dipaketkan sebagai sebuah
+ekstensi. Karena file gaya CSS tidak bisa diakses oleh Web, kita perlu
+menerbitkannya sebagai sebuah asset.
+
+Untuk membuat widget baru dari awal, kita perlu mengimplementasikan dua metode:
+[CWidget::init] dan [CWidget::run]. Metode pertama dipanggil saat kita
+menggunakan `$this->beginWidget` untuk menyisipkan widget dalam sebuah tampilan, dan
+metode kedua dipanggil saat kita memanggil `$this->endWidget`.
+Jika kita ingin menangkap dan memroses konten yang ditampilkan diantara kedua
+invokasi metode ini, kita dapat memulai [membufer output](http://us3.php.net/manual/en/book.outcontrol.php)
+pada [CWidget::init] dan mengembil output yang di-bufer pada [CWidget::run]
+guna pemrosesan selanjutnya.
+
+Widget sering terkait dengan penyertaan CSS, JavaScript atau file sumber lain
+dalam halaman yang menggunakan widget. Kita menyebut file-file ini *assets* karena
+tempatnya bersama dengan file kelas widget dan biasanya tidak bisa diakses oleh
+pengguna Web. Agar file-file ini bisa diakses oleh Web, kita perlu menerbitkannya
+dengan menggunakan [CWebApplication::assetManager], seperti yang ditampilkan dalam snippet kode di atas.
+Selain itu, jika kita ingin menyertakan file CSS atau JavaScript dalam halaman saat ini,
+kita perlu mendaftarkannya dengan menggunakan [CClientScript]:
+
+~~~
+[php]
+class MyWidget extends CWidget
+{
+ protected function registerClientScript()
+ {
+ // ...terbitkan file CSS atau JavaScript di sini...
+ $cs=Yii::app()->clientScript;
+ $cs->registerCssFile($cssFile);
+ $cs->registerScriptFile($jsFile);
+ }
+}
+~~~
+
+Widget juga dapat memiliki file tampilan sendiri. Jika seperti itu, buat direktori bernama
+`views` di bawah direktori yang berisi file kelas widget, dan simpan semua file
+tampilan di sana. Dalam kelas widget, untuk me-render tampilan widget, gunakan
+`$this->render('NamaTampilan')`, yang mirip dengan apa yang dilakukan dalam sebuah kontroler.
+
+Aksi
+----
+
+[Aksi](/doc/guide/basics.controller#action) harus diperluas dari [CAction]
+atau anak kelasnya. Metode utama yang perlu diimplementasikan untuk sebuah filter
+adalah [IAction::run].
+
+Filter
+------
+[Filter](/doc/guide/basics.controller#filter) harus diperluas dari [CFilter]
+atau anak kelasnya. Metode utama yang perlu diimplementasikan untuk sebuah filter
+adalah [CFilter::preFilter] dan [CFilter::postFilter]. Yang pertama dipanggil sebelum
+aksi dijalankan sementara yang filter kedua setelahnya.
+
+~~~
+[php]
+class MyFilter extends CFilter
+{
+ protected function preFilter($filterChain)
+ {
+ // logika diterapkan sebelum aksi dijalankan
+ return true; // false jika aksi seharusnya tidak dijalankan
+ }
+
+ protected function postFilter($filterChain)
+ {
+ // logika diterapkan setelah aksi dijalankan
+ }
+}
+~~~
+
+Parameter `$filterChain` adalah tipe [CFilterChain] yang berisi informasi
+tentang aksi yang saat ini disaring.
+
+
+Kontroler
+---------
+[Kontroler](/doc/guide/basics.controller) yang didistribusikan sebagai ekstensi
+harus diperluas dari [CExtController], bukan dari [CController]. Alasan utama adalah
+karena [CController] menganggap file tampilan kontroler ditempatkan di bawah
+`application.views.ControllerID`, sementara [CExtController] menganggap file tampilan
+ditempatkan di bawah direktori `views` yang tidak lain adalah subdirektori
+dari direktori yang berisi file kelas kontroler. Oleh karena itu, lebih mudah
+dalam menditribusikan kembali kontroler karena file tampilan tetap bersama dengan
+file kelas kontroler.
+
+
+Validator
+---------
+Validator harus diperluas dari [CValidator] dan mengimplementasikan metode
+[CValidator::validateAttribute].
+
+~~~
+[php]
+class MyValidator extends CValidator
+{
+ protected function validateAttribute($model,$attribute)
+ {
+ $value=$model->$attribute;
+ if($value has error)
+ $model->addError($attribute,$errorMessage);
+ }
+}
+~~~
+
+Perintah Konsol
+---------------
+[Perintah konsol](/doc/guide/topics.console) harus diperluas dari
+[CConsoleCommand] dan mengimplementasikan metode [CConsoleCommand::run].
+Secara opsional, kita dapat menimpa [CConsoleCommand::getHelp] untuk menyediakan
+beberapa informasi bantuan menarik mengenai perintah.
+
+~~~
+[php]
+class MyCommand extends CConsoleCommand
+{
+ public function run($args)
+ {
+ // $args berisi array argumen baris perintah untuk perintah ini
+ }
+
+ public function getHelp()
+ {
+ return 'Usage: how to use this command';
+ }
+}
+~~~
+
+Modul
+-----
+Silahkan merujuk ke seksi tentang [modul](/doc/guide/basics.module#creating-module) bagaimana membuat sebuah modul.
+
+Petunjuk umum untuk mengembangkan modul adalah bahwa ia harus berdiri sendiri. File sumber (seperti CSS, JavaScript, gambar) yang dipakai oleh modul harus didistribusikan bersamaan dengan modul. Dan modul harus menerbitkannya agar bisa diakses oleh Web.
+
+
+Komponen Generik
+----------------
+Mengembangkan ekstensi komponen generik mirip dengan pembuatan sebuah kelas. Sekali lagi, komponen
+juga harus berdiri sendiri agar dapat dipakai dengan mudah oleh pengembang yang lain.
+
+
+<div class="revision">$Id: extension.create.txt 749 2009-02-26 02:11:31Z qiang.xue $</div>
View
47 docs/guide/id/extension.integration.txt
@@ -0,0 +1,47 @@
+Menggunakan Librari Pihak Ketiga
+================================
+
+Yii didesain secara hati-hati agar librari pihak-ketiga dapat dengan mudah
+diintegrasikan untuk lebih memperluas fungsionalitas Yii.
+Ketika menggunakan librari pihak ketiga dalam sebuah proyek, para pengembang
+sering menghadapi masalah mengenai penyertaan penamaan kelas dan file.
+Karena semua kelas Yii diawali dengan huruf `C`, maka masalah penamaan
+kelas akan jarang terjadi; dan karena Yii tergantung pada
+[SPL autoload](http://us3.php.net/manual/en/function.spl-autoload.php)
+untuk melakukan inklusi file kelas, ia akan sejalan dengan libari lain
+jika mereka menggunakan fitur autoloading yang sama atau PHP include path untuk
+menyertakan file kelas.
+
+
+Di bawah ini kami menggunakan sebuah contoh guna menggambarkan bagaimana untuk memakai
+komponen [Zend_Search_Lucene](http://www.zendframework.com/manual/en/zend.search.lucene.html)
+dari [Zend framework](http://www.zendframework.com) dalam aplikasi Yii.
+
+Pertama, kita mengurai file rilis Zend framework ke sebuah direktori di bawah
+`protected/vendors`, menganggap bahwa direktori `protected` adalah
+[direktori basis aplikasi](/doc/guide/basics.application#application-base-directory).
+Pastikan bahwa file `protected/vendors/Zend/Search/Lucene.php` ada di sana.
+
+Kedua, pada awal file kelas kontroler, sisipkan baris berikut:
+
+~~~
+[php]
+Yii::import('application.vendors.*');
+require_once('Zend/Search/Lucene.php');
+~~~
+
+Kode di atas menyertakan file kelas `Lucene.php`. Karena kita menggunakan
+path relatif, kita perlu mengubah path include PHP agar file bisa ditempatkan
+dengan benar. Ini dilakukan dengan memanggil `Yii::import` sebelum `require_once`.
+
+Setelah kode di atas siap, kita dapat menggunakan kelas `Lucene` dalam aksi kontroler,
+seperti berikut:
+
+~~~
+[php]
+$lucene=new Zend_Search_Lucene($pathOfIndex);
+$hits=$lucene->find(strtolower($keyword));
+~~~
+
+
+<div class="revision">$Id: extension.integration.txt 251 2008-11-19 22:28:46Z qiang.xue $</div>
View
29 docs/guide/id/extension.overview.txt
@@ -0,0 +1,29 @@
+Tinjauan
+========
+
+Memperluas Yii merupakan kegiatan umum selama pengembangan. Contohnya, saat
+Anda membuat kontroler baru, Anda memperluas Yii dengan menurunkan kelas [CController]
+dan saat Anda membuat widget baru, Anda memperluas [CWidget] atau kelas widget
+lain yang sudah ada. Jika kode yang diperluas didesain untuk dipakai ulang oleh pengembang
+pihak ketiga, kita menyebutnya sebagai *ekstensi*.
+
+Ekstensi biasanya melayani satu kebutuhan tertentu. Dalam batasan Yii, ia dapat
+diklasifikasikan sebagai berikut,
+
+ * [komponen aplikasi](/doc/guide/basics.application#application-component)
+ * [widget](/doc/guide/basics.view#widget)
+ * [kontroler](/doc/guide/basics.controller)
+ * [aksi](/doc/guide/basics.controller#action)
+ * [filter](/doc/guide/basics.controller#filter)
+ * [perintah konsol](/doc/guide/topics.console)
+ * validator: validator adalah kelas komponen yang memperluas [CValidator].
+ * helper: helper adalah kelas hanya dengan metode statis saja. Ia mirip fungsi global
+ yang menggunakan nama kelas sebagai namespace-nya.
+ * [modul](/doc/guide/basics.module): modul adalah unit software beriri sendiri yang terdiri dari [model](/doc/guide/basics.model), [tampilan](/doc/guide/basics.view), [kontroler](/doc/guide/basics.controller) dan komponen pendukung lainnya. Dalam banyak aspek, modul mirip dengan [aplikasi](/doc/guide/basics.application). Perbedaan utamanya adalah bahwa modul ada di dalam aplikasi. Sebagai contoh, kita dapat memiliki modul yang menyediakan fungsionalitas manajemen pengguna.
+
+Ekstensi juga dapat berupa komponen yang tidak masuk ke dalam kategori
+di atas. Bahkan, Yii didesain secara hati-hati sehingga hampir seluruh kodenya
+dapat diperluas dan dikustomisasi agar sesuai dengan kebutuhan secara
+individual.
+
+<div class="revision">$Id: extension.overview.txt 759 2009-02-26 21:23:53Z qiang.xue $</div>
View
234 docs/guide/id/extension.use.txt
@@ -0,0 +1,234 @@
+Menggunakan Ekstensi
+====================
+
+Menggunakan ekstensi biasanya berkaitan dengan tiga langkah berikut:
+
+ 1. Download ekstensi dari
+ [repositori ekstensi](http://www.yiiframework.com/extensions/) Yii.
+ 2. Urai ekstensi di bawah subdirektori `extensions/xyz` pada
+ [direktori basis aplikasi](/doc/guide/basics.application#application-base-directory),
+ di mana `xyz` adalah nama ekstensi.
+ 3. Impor, konfigurasi dan gunakan ekstensi.
+
+Setiap ekstensi memiliki nama yang secara identitas unik diantara semua ekstensi.
+Ekstensi diberi nama `xyz`, kita dapat menggunakan alias path
+`application.extensions.xyz` untuk menempatkannya pada basis direktori yang berisi
+semua file `xyz`.
+
+Ekstensi yang berbeda memiliki persyaratan mengenai pengimporan,
+konfigurasi dan pemakaian. Selanjutnya, kita meringkas skenario pemakaian umum
+mengenai ekstensi, berdasarkan pada kategorisasinya seperti dijelaskan dalam
+[tinjauan](/doc/guide/extension.overview).
+
+Komponen Aplikasi
+-----------------
+
+Untuk menggunakan [komponen aplikasi](/doc/guide/basics.application#application-component),
+kita perlu mengubah [konfigurasi aplikasi](/doc/guide/basics.application#application-configuration)
+lebih dulu dengan menambahkan entri baru pada properti `components`, seperti berikut:
+
+~~~
+[php]
+return array(
+ // 'preload'=>array('xyz',...),
+ 'components'=>array(
+ 'xyz'=>array(
+ 'class'=>'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // konfigurasi komponen lainnya
+ ),
+);
+~~~
+
+Selanjutnya, kita dapat mengakses komponen di mana saja mengunakan `Yii::app()->xyz`. Komponen
+akan dibuat secara lazy (yakni, dibuat saat diakses untuk pertama kali)
+kecuali kita mendaftar properti `preload`.
+
+
+Widget
+------
+
+[Widget](/doc/guide/basics.view#widget) dipakai terutama dalam [tampilan](/doc/guide/basics.view).
+Kelas widget yang diberiktan `XyzClass` dimiliki oleh ekstensi `xyz`, kita bisa menggunakannya dalam
+sebuah tampilan seperti berikut,
+
+~~~
+[php]
+// widget yang tidak memerlukan konten body
+<?php $this->widget('application.extensions.xyz.XyzClass', array(
+ 'property1'=>'value1',
+ 'property2'=>'value2')); ?>
+
+// widget yang dapat berisi konten body
+<?php $this->beginWidget('application.extensions.xyz.XyzClass', array(
+ 'property1'=>'value1',
+ 'property2'=>'value2')); ?>
+
+...konten body widget...
+
+<?php $this->endWidget(); ?>
+~~~
+
+Aksi
+----
+
+[Aksi](/doc/guide/basics.controller#action) dipakai oleh [kontroler](/doc/guide/basics.controller)
+untuk merespon permintaan spesifik pengguna. Kelas aksi `XyzClass` dimiliki oleh ekstensi
+`xyz`, kita dapat menggunakannya dengan menimpa metode [CController::actions] dalam
+kelas kontroler kita:
+
+~~~
+[php]
+class TestController extends CController
+{
+ public function actions()
+ {
+ return array(
+ 'xyz'=>array(
+ 'class'=>'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // aksi lainnya
+ );
+ }
+}
+~~~
+
+Selanjutnya, aksi dapat diakses via [rute](/doc/guide/basics.controller#route)
+`test/xyz`.
+
+Filter
+------
+[Filter](/doc/guide/basics.controller#filter) juga dipakai oleh [kontroler](/doc/guide/basics.controller).
+Terutama pre- dan post-process permintaan pengguna saat ia ditangani oleh sebuah
+[aksi](/doc/guide/basics.controller#action).
+Kelas filter `XyzClass` dimiliki oleh
+ekstensi `xyz`, kita dapat menggunakannya dengan menimpa metode [CController::filters]
+dalam file kontroler kita:
+
+~~~
+[php]
+class TestController extends CController
+{
+ public function filters()
+ {
+ return array(
+ array(
+ 'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // filter lainnya
+ );
+ }
+}
+~~~
+
+Dalam contoh di atas, kita dapat menggunakan operator plus dan minus dalam elemen pertama array
+untuk menerapkan filter ke aksi terbatas saja. Untuk lebih jelasnya, silahkan merujuk ke
+dokumentasi [CController].
+
+Kontroler
+----------
+[Kontroler](/doc/guide/basics.controller) menyediakan satu set aksi yang dapat diminta
+oleh pengguna. Untuk menggunakan ekstensi kontroler, kita perlu mengkonfigurasi
+properti [CWebApplication::controllerMap] dalam
+[konfigurasi aplikasi](/doc/guide/basics.application#application-configuration):
+
+~~~
+[php]
+return array(
+ 'controllerMap'=>array(
+ 'xyz'=>array(
+ 'class'=>'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // kontroler lainnya
+ ),
+);
+~~~
+
+Kemudian, aksi `a` dalam kontroler dapat diakses via
+[rute](/doc/guide/basics.controller#route) `xyz/a`.
+
+Validator
+---------
+Validator dipakai terutama dalam kelas [model](/doc/guide/basics.model)
+(salah satu yang diperluas baik dari [CFormModel] ataupun [CActiveRecord]).
+Kelas validator `XyzClass` dimiliki oleh
+ekstensi `xyz`, kita bisa menggunakannya dengan menimpa metode [CModel::rules]
+dalam kelas model kita:
+
+~~~
+[php]
+class MyModel extends CActiveRecord // atau CFormModel
+{
+ public function rules()
+ {
+ return array(
+ array(
+ 'attr1, attr2',
+ 'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // aturan validasi lainnya
+ );
+ }
+}
+~~~
+
+Perintah Konsol
+---------------
+Ekstensi [perintah konsol](/doc/guide/topics.console) biasanya meningkatkan
+piranti `yiic` dengan perintah tambahan. Perintah konsol
+`XyzClass` dimiliki oleh ekstensi `xyz`, kita bisa menggunakannya dengan mengatur
+file konfigurasi untuk aplikasi konsol:
+
+~~~
+[php]
+return array(
+ 'commandMap'=>array(
+ 'xyz'=>array(
+ 'class'=>'application.extensions.xyz.XyzClass',
+ 'property1'=>'value1',
+ 'property2'=>'value2',
+ ),
+ // perintah lainnya
+ ),
+);
+~~~
+
+Selanjutnya, kita dapat menggunakan piranti `yiic` yang disertai dengan perintah
+tambahan `xyz`.
+
+> Note|Catatan: Aplikasi konsol biasanya menggunakan file konfigurasi
+yang berbeda dari yang dipakai oleh aplikasi Web. Jika aplikasi dibuat
+menggunakan perintah `yiic webapp`, maka file konfigurasi untuk aplikasi
+konsol `protected/yiic` adalah `protected/config/console.php`,
+sementara file konfigurasi untuk aplikasi Web adalah `protected/config/main.php`.
+
+
+Modul
+-----
+Silahkan merujuk ke seksi mengenai [modul](/doc/guide/basics.module#using-module) bagaimana menggunakan modul.
+
+
+Komponen Generik
+----------------
+Untuk menggunakan [komponen](/doc/guide/basics.component) generik, pertama
+kita perlu menyertakan file kelasnya dengan menggunakan
+
+~~~
+Yii::import('application.extensions.xyz.XyzClass');
+~~~
+
+Selanjutnya, kita dapat membuat turunan kelas, mengkonfigurasi propertinya,
+dan memanggi metodenya. Kita juga bisa memperluasnya untuk membuat anak kelas baru.
+
+
+<div class="revision">$Id: extension.use.txt 749 2009-02-26 02:11:31Z qiang.xue $</div>
View
73 docs/guide/id/form.action.txt
@@ -0,0 +1,73 @@
+Membuat Aksi
+============
+
+Setelah kita memiliki model, kita dapat mulai menulis logika yang diperlukan
+untuk memanipulasi model. Kita tempatkan logika ini di dalam sebuah aksi kontroler.
+Untuk contoh formulir login, kode berikut diperlukan:
+
+~~~
+[php]
+public function actionLogin()
+{
+ $form=new LoginForm;
+ if(isset($_POST['LoginForm']))
+ {
+ // kumpulkan data input pengguna
+ $form->attributes=$_POST['LoginForm'];
+ // validasi input pengguna dan alihkkan ke halaman sebelumnya jika benar
+ if($form->validate())
+ $this->redirect(Yii::app()->user->returnUrl);
+ }
+ // tampilkan formulir login
+ $this->render('login',array('user'=>$form));
+}
+~~~
+
+Dalam contoh di atas, pertama kita membuat turunan `LoginForm`; jika permintaan adalah
+permintaan POST (berarti formulir login dikirimkan), kita mempopulasi `$form`
+dengan data yang dikirimkan `$_POST['LoginForm']`; kemudian kita memvalidasi input
+dan jika sukses, mengalihkan browser pengguna ke halaman sebelumnya yang
+memerlukan otentikasi. Jika validasi gagal, atau jika aksi diakses dari
+awal, kita menyajikan tampilan `login` di mana isinya akan dijelaskan dalam
+subseksi berikut.
+
+> Tip: Dalam aksi `login`, kita menggunakan `Yii::app()->user->returnUrl` untuk mendapatkan
+URL halaman sebelumnya yang memerlukan otentikasi. Komponen
+`Yii::app()->user` adalah jenis [CWebUser] (atau anak kelasnya) yang
+mewakili informasi sesi pengguna (misalnya username, status). Untuk lebih jelasnya,
+lihat [Otentikasi dan Otorisasi](/doc/guide/topics.auth).
+
+Mari kita perhatikan pernyataan PHP berikut yang muncul dalam aksi
+`login`:
+
+~~~
+[php]
+$form->attributes=$_POST['LoginForm'];
+~~~
+
+Seperti yang kami jelaskan dalam [Mengamankan Penempatan Atribut](/doc/guide/form.model#securing-attribute-assignments),
+baris kode ini mempopulasi model dengan data yang dikirimkan pengguna.
+Properti `attributes` didefinisikan oleh [CModel] yang
+mengharapkan array pasangan nama-nilai dan menempatkan setiap nilai ke
+atribut model terkait. Maka jika `$_POST['LoginForm']` menghasilkan
+array seperti itu, kode di atas akan sama dengan kode panjang berikut
+(menganggap setiap atribut ada dalam array):
+
+~~~
+[php]
+$form->username=$_POST['LoginForm']['username'];
+$form->password=$_POST['LoginForm']['password'];
+$form->rememberMe=$_POST['LoginForm']['rememberMe'];
+~~~
+
+> Note|Catatan: Agar `$_POST['LoginForm']` menghasilkan array daripada
+string, kita tetap pada konvensi penamaan field input dalam tampilan. Pada
+keadaan tertentu, sebuah field input berkaitan dengan atribut `a` pada kelas model
+`C`, kita namai sebagai `C[a]`. Sebagai contoh, kita ingin menggunakan
+`LoginForm[username]` untuk menamai field input yang berkaitan dengan atribut
+`username`.
+
+Tugas selanjutnya sekarang adalah membuat tampilan `login` yang harus berisi
+formulir HTML dengan field input yang dibutuhkan.
+
+<div class="revision">$Id: form.action.txt 626 2009-02-04 20:51:13Z qiang.xue $</div>
View
377 docs/guide/id/form.model.txt
@@ -0,0 +1,377 @@
+Membuat Model
+=============
+
+Sebelum menulis kode HTML yang diperlukan oleh sebuah formulir, kita harus menetapkan jenis
+data apa yang diharapkan dari pengguna akhir dan aturan apa pada data ini harus
+diterapkan. Kelas model dapat dipakai guna merekam informasi ini. Model,
+seperti yang didefinisikan dalam subseksi [Model](/doc/guide/basics.model), adalah
+tempat utama untuk memelihara input pengguna dan memvalidasinya.
+
+Tergantung pada bagaimana kita menggunakan input pengguna, kita bisa membuat dua jenis
+model. Jika input pengguna dikumpulkan, dipakai dan kemudian diabaikan, kita bisa
+membuat [model formulir](/doc/guide/basics.model); jika input pengguna
+dikumpulkan dan disimpan ke dalam database, sebaliknya kita dapat menggunakan [rekaman
+aktif](/doc/guide/database.ar). Kedua jenis model berbagi basis kelas
+[CModel] yang sama yang mendefinisikan antar muka umum yang diperlukan oleh formulir.
+
+> Note|Catatan: Kita menggunakan model formulir terutama dalam contoh pada seksi ini.
+Akan tetapi, hal yang sama bisa juga diterapkan pada model [rekaman
+aktif](/doc/guide/database.ar).
+
+Mendefinisikan Kelas Model
+--------------------------
+
+Di bawah ini kita membuat kelas model `LoginForm` yang dipakai untuk mengumpulkan input pengguna pada
+halaman login. Karena informasi login hanya dipakai untuk mengotentikasi pengguna
+dan tidak perlu menyimpan, kita membuat `LoginForm` sebagai sebuah model formulir.
+
+~~~
+[php]
+class LoginForm extends CFormModel
+{
+ public $username;
+ public $password;
+ public $rememberMe=false;
+}
+~~~
+
+Tiga atribut dideklarasikan dalam `LoginForm`: `$username`, `$password` dan
+`$rememberMe`. Ini dipakai untuk memelihara nama pengguna dan kata sandi
+yang dimasukkan, dan opsi apakah pengguna menginginkan untuk mengingat login-nya.
+Karena `$rememberMe` memiliki nilai standar `false`, opsi terkait
+saat awal ditampilkan dalam formulir login tidak akan dicentang.
+
+> Info: Daripada memanggil properi variabel anggota ini, kita menggunakan
+nama *attributes* untuk membedakannya dari properti normal. Atribut
+adalah properti yang terutama dipakai untuk menyimpan data yang berasal dari
+input pengguna atau database.
+
+Mendeklarasikan Aturan Validasi
+-------------------------------
+
+Setelah pengguna mengirimkan inputnya dan model sudah dipopulasi, kita perlu
+memastikan bahwa input benar sebelum menggunakannya. Ini dikerjakan dengan
+melakukan validasi input terhadap satu set aturan. Kita menetapkan aturan
+validasi dalam metode `rules()` yang harus mengembalikan array konfigurasi
+aturan.
+
+~~~
+[php]
+class LoginForm extends CFormModel
+{
+ public $username;
+ public $password;
+ public $rememberMe=false;
+
+ public function rules()
+ {
+ return array(
+ array('username, password', 'required'),
+ array('password', 'authenticate'),
+ );
+ }
+
+ public function authenticate($attribute,$params)
+ {
+ if(!$this->hasErrors()) // kita hanya ingin mengotentikasi bila tidak ada kesalahan input
+ {
+ $identity=new UserIdentity($this->username,$this->password);
+ if($identity->authenticate())
+ {
+ $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 hari
+ Yii::app()->user->login($identity,$duration);
+ }
+ else
+ $this->addError('password','Incorrect password.');
+ }
+ }
+}
+~~~
+
+Contoh kode di atas menetapkan bahwa `username` dan `password` keduanya diperlukan,
+`password` harus diotentikasi.
+
+Setiap aturan yang dikembalikan oleh `rules()` harus dalam format berikut:
+
+~~~
+[php]
+array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...opsi tambahan)
+~~~
+
+di mana `AttributeList` adalah string nama atribut yang dipisahkan dengan koma
+yang perlu divalidasi sesuai dengan aturan; `Validator` menetapan jenis validasi
+apa yang harus dilakukan; parameter `on` adalah opsional yang menetapkan daftar
+skenario di mana aturan harus diterapkan; dan opsi tambahan adalah pasangan
+nama-nilai yang dipakai untuk menginisialisasi nilai properti validator
+terkait.
+
+Ada tiga cara untuk menetapkan `Validator` dalam aturan validasi. Pertama,
+`Validator` dapat berupa nama metode dalam kelas model, seperti
+`authenticate` dalam contoh di atas. Metode validator harus berupa tanda tangan
+berikut:
+
+~~~
+[php]
+/**
+ * @param string nama atribut yang akan divalidasi
+ * @param array opsi yang ditetapkan dalam aturan validasi
+ */
+public function ValidatorName($attribute,$params) { ... }
+~~~
+
+Kedua, `Validator` dapat berupa nama kelas validator. Saat aturan diterapkan,
+turunan kelas validator akan dibuat untuk melakukan validasi sebenarnya.
+Opsi tambahan dalam aturan dipakai untuk menginisialisasi nilai atribut
+turunannya. Kelas validator harus diperluas
+dari [CValidator].
+
+> Note|Catatan: Saat menetapkan aturan untuk model rekaman aktif, kita dapat menggunakan
+opsi spesial bernama `on`. Opsi ini bisa berupa `'insert'` atau
+`'update'` agar aturan hanya diterapkan masing-masing saat penyisipan atau
+pemutakhiran rekaman. Jika tidak disetel, aturan akan diterapkan dalam kedua kasus
+tersebut saat `save()` dipanggil.
+
+Ketiga, `Validator` dapat berupa alias pradefinisi untuk kelas validator. Dalam
+contoh di atas, nama `required` adalah alias untuk [CRequiredValidator]
+yang memastikan nilai atribut yang divalidasi tidak kosong. Di bawah ini
+adalah daftar lengkap alias pradefinisi validator aliases:
+
+ - `captcha`: alias [CCaptchaValidator], memastikan atribut sama dengan
+kode verifikasi yang ditampilkan dalam
+[CAPTCHA](http://en.wikipedia.org/wiki/Captcha).
+
+ - `compare`: alias [CCompareValidator], memastikan atribut sama dengan
+atribut atau konstan lain.
+
+ - `email`: alias [CEmailValidator], memastikan atribut berupa alamat
+email yang benar.
+
+ - `default`: alias [CDefaultValueValidator], menempatkan nilai standar
+ke atribut yang ditetapkan.
+
+ - `exist`: alias [CExistValidator], memastikan nilai atribut dapat
+ditemukan dalam kolom tabel.
+
+ - `file`: alias [CFileValidator], memastikan atribu berisi nama file
+yang di-upload.
+
+ - `filter`: alias [CFilterValidator], mengubah atribut dengan
+filter.
+
+ - `in`: alias [CRangeValidator], memastikan data ada diantara
+daftar nilai yang sudah ditetapkan.
+
+ - `length`: alias [CStringValidator], memastikan panjang data
+di dalam jangkauan tertentu.
+
+ - `match`: alias [CRegularExpressionValidator], memastikan data
+sesuai dengan ekspresi reguler.
+
+ - `numerical`: alias [CNumberValidator], memastikan data adalah
+angka yang benar.
+
+ - `required`: alias [CRequiredValidator], memastikan atribut
+tidak kosong.
+
+ - `type`: alias [CTypeValidator], memastikan atribut adalah
+jenis data tertentu.
+
+ - `unique`: alias [CUniqueValidator], memastikan data adalah unik dalam
+kolom tabel database.
+
+ - `url`: alias [CUrlValidator], memastikan data berupa URL yang benar.
+
+Di bawah ini daftar beberapa contoh pemakaian validator pradefinisi:
+
+~~~
+[php]
+// username diperlukan
+array('username', 'required'),
+// username harus antara 3 dan 12 karakter
+array('username', 'length', 'min'=>3, 'max'=>12),
+// saat dalam skenario registrasi, password harus sama dengan password2
+array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),
+// saat dalam skenario login, password harus diotentikasi
+array('password', 'authenticate', 'on'=>'login'),
+~~~
+
+
+Mengamankan Penempatan Atribut
+------------------------------
+
+> Note|Catatan: penempatan atribut berbasis-skenario sudah tersedia sejak versi 1.0.2.
+
+Setelah turunan model dibuat, seringkali kita perlu mempopulasikan atributnya
+dengan data yang dikirimkan oleh pengguna-akhir. Ini bisa dikerjakan
+dengan nyaman menggunakan penempatan masal berikut:
+
+~~~
+[php]
+$model=new LoginForm;
+$model->scenario='login';
+if(isset($_POST['LoginForm']))
+ $model->attributes=$_POST['LoginForm'];
+~~~
+
+> Note|Catatan: Properti [skenario|CModel::scenario] sudah tersedia
+> sejak versi 1.0.4. Penempatan masal akan mengambil nilai properti
+> untuk menguji apakah atribut bisa ditempatkan secara masal.
+> Dalam versi 1.0.2 dan 1.0.3, kita perlu menggunakan cara berikut untuk
+> melakukan penempatan masal pada skenario tertentu:
+>
+> ~~~
+> [php]
+> $model->setAttributes($_POST['LoginForm'], 'login');
+> ~~~
+
+Penempatan terakhir adalah penempatan masal yang menempatkan setiap entri
+dalam `$_POST['LoginForm']` ke atribut model terkait dalam skenario
+`login`. Ini sama dengan penempatan berikut:
+
+~~~
+[php]
+foreach($_POST['LoginForm'] as $name=>$value)
+{
+ if($name is a safe attribute)
+ $model->$name=$value;
+}
+~~~
+
+Tugas memutuskan apakah entri data aman atau tidak didasarkan pada
+nilai balik metode bernama `safeAttributes` dan skenario yang
+ditetapkan. Secara standar, metode mengembalikan semua variabel anggota public
+sebagai atribut aman untuk [CFormModel], sementara ia mengembalikan semua kolom tabel
+kecuali kunci primer sebagai atribut aman untuk [CActiveRecord]. Kita dapat
+menimpa metode ini guna membatasi atribut aman sesuai dengan skenario.
+Sebagai contoh, model pengguna dapat berisi beberapa atribut, tapi dalam skenario `login`
+kita hanya perlu menggunakan atribut `username` dan `password`.
+Kita dapat menetapkan batas ini seperti berikut:
+
+~~~
+[php]
+public function safeAttributes()
+{
+ return array(
+ parent::safeAttributes(),
+ 'login' => 'username, password',
+ );
+}
+~~~
+
+Lebih tepatnya, nilai balik metode `safeAttributes` seharusnya dalam struktur
+sebagai berikut:
+
+~~~
+[php]
+array(
+ // atribut ini dapat ditempatkan secara masalah dalam setiap skenario
+ // yang tidak ditetapkan secara eksplisit di bawah ini
+ 'attr1, attr2, ...',
+ *
+ // atribut ini dapat ditempatkan secara masal hana dalam skenario 1
+ 'scenario1' => 'attr2, attr3, ...',
+ *
+ // atribut ini dapat ditempatkan secara masal hana dalam skenario 2
+ 'scenario2' => 'attr1, attr3, ...',
+)
+~~~
+
+Jika model bukan sensitif-skenario (misalnya, ia hanya dipakai dalam
+satu skenario, atau semua skenario berbagi set atribut aman yang sama),
+nilai balik dapat disederhanakan sebagai string tunggal:
+
+~~~
+[php]
+'attr1, attr2, ...'
+~~~
+
+Untuk entri data yang tidak aman, kita perlu menempatkannya ke atribut
+terkait menggunakan pernyataan penempatan individual, seperti berikut:
+
+~~~
+[php]
+$model->permission='admin';
+$model->id=1;
+~~~
+
+
+Memicu Validasi
+---------------
+
+Setelah model dipopulasi dengan data yang dikirimkan-pengguna, kita memanggil [CModel::validate()]
+untuk memicu proses validasi data. Metode mengembalikan nilai yang menunjukan
+apakah validasi sukses atau tidak. Untuk model [CActiveRecord],
+validasi juga dapat dipicu secara otomatis saat kita memanggil metode
+[CActiveRecord::save()].
+
+Ketika kita memanggil [CModel::validate()], kita dapat menetapkan parameter skenario.
+Hanya aturan validasi yang berlaku pada skenario yang ditetapkan yang akan
+dijalankan. Aturan validasi pada sebuah skenario jika opsi `on` pada
+aturan tidak disetel atau berisi nama skenario yang ditetapkan. Jika kita tidak
+menetapkan skenario saat memanggil [CModel::validate()], hanya aturan yang
+memiliki opsi `on` tidak disetel yang akan dijalankan.
+
+Sebagai contoh, kita menjalankan pernyataan berikut untuk melakukan validasi
+saat meregistrasi seorang pengguna:
+
+~~~
+[php]
+$model->scenario='register';
+$model->validate();
+~~~
+
+> Note|Catatan: Properti [skenario|CModel::scenario] sudah tersedia
+> sejak versi 1.0.4. Metode validasi akan mengambil nilai properti
+> untuk menguji aturan mana yang bisa diperiksa.
+> Dalam versi 1.0.2 dan 1.0.3, kita perlu menggunakan cara berikut untuk
+> melakukan validasi pada skenario tertentu:
+>
+> ~~~
+> [php]
+> $model->validate('register');
+> ~~~
+
+Kita dapat mendeklarasikan aturan validasi dalam kelas model formulir seperti brikut,
+
+~~~
+[php]
+public function rules()
+{
+ return array(
+ array('username, password', 'required'),
+ array('password_repeat', 'required', 'on'=>'register'),
+ array('password', 'compare', 'on'=>'register'),
+ );
+}
+~~~
+
+Hasilnya, aturan pertama akan diterapkan dalam semua skenario, sementara
+dua aturan berikutnya hanya diterapkan dalam skenario `register`.
+
+> Note|Catatan: validasi berbasis-skenario sudah tersedia sejak versi 1.0.1.
+
+
+Mengambil Kesalahan Validasi
+----------------------------
+
+Kita dapat menggunakan [CModel::hasErrors()] untuk memeriksa apakah ada kesalahan
+validasi, dan jika ya, kita dapat menggunakan [CModel::getErrors()] untuk mengambil pesan
+kesalahan. Kedua metode dapat dipakai untuk semua atribut atau atribut
+individual.
+
+Label Atribut
+-------------
+
+Ketika medesain sebuah formulir, seringkali kita perlu menampilkan label untuk setiap field
+input. Label memberitahu pengguna jenis informasi apa yang harus dimasukkan
+ke dalam field. Meskipun kita dapat memberi label secara langsung dalam sebuah tampilan, ini
+akan menawarkan fleksibilitas dan kenyamanan yang lebih jika kita menetapkannya dalam
+model terkait.
+
+Secara standar, [CModel] akan mengembalikan nama atribut sebagai labelnya.
+Ini dapat dikustomisasi dengan menimpa metode
+[attributeLabels()|CModel::attributeLabels]. Seperti yang akan kita lihat dalam
+subskenario berikutnya, menetapkan label dalam model mengijinkan kita untuk membuat
+formulir lebih cepat dan bertenaga.
+
+<div class="revision">$Id: form.model.txt 922 2009-04-05 21:36:33Z qiang.xue $</div>
View
19 docs/guide/id/form.overview.txt
@@ -0,0 +1,19 @@
+Bekerja dengan Formulir
+=======================
+
+Pengumpulan data pengguna via formulir HTML adalah tugas utama dalam
+pengembangan aplikasi Web. Selain mendesain formulir, pengembang perlu
+mempopulasi formulir dengan data yang sudah ada atau nilai-nilai standar,
+memvalidasi input pengguna, menampilkan pesan kesalahan yang sesuai untuk input yang tidak benar, dan menyimpan
+input ke media penyimpan. Yii sudah menyederhanakan alur kerja ini dengan arsitektur
+MVC.
+
+Langkah-langkah berikut umumnya diperlukan saat berhadapan dengan formulir dalam Yii:
+
+ 1. Buat kelas model yang mewakili field data yang dikumpulkan;
+ 2. Buat aksi kontroler dengan kode yang merespon pengiriman formulir.
+ 3. Buat formulir dalam file naskah tampilan sesuai dengan aksi kontroler.
+
+Dalam subseksi berikut, kami menjelaskan setiap langkah ini secara lebih rinci.
+
+<div class="revision">$Id: form.overview.txt 163 2008-11-05 12:51:48Z weizhuo $</div>
View
71 docs/guide/id/form.table.txt
@@ -0,0 +1,71 @@
+Mengumpulkan Input Tabular
+==========================
+
+Adakalanya kita ingin mengumpulkan input pengguna dalam mode batch. Yakni, pengguna
+dapat memasukan informasi untuk turunan model secara multipel dan mengirimkannya
+sekaligus. Kami menyebut ini *input tabular* karena field input sering disajikan
+dalam tabel HTML.
+
+Untuk bekerja dengan input tabular, pertama kita perlu membuat atau mempopulasikan
+array turunan model, tergantung pada apakah kita menyisipkan atau memutakhirkan
+data. Selanjutnya kita dapat mengambil data input pengguna dari variabel `$_POST` dan
+menempatkannya ke setiap model. Perbedaan utama dari model input tunggal adalah
+bahwa kita mengambil data input menggunakan `$_POST['ModelClass'][$i]` daripada
+`$_POST['ModelClass']`.
+
+~~~
+[php]
+public function actionBatchUpdate()
+{
+ // ambil item yang akan dipopulasi dalam mode batch
+ // menganggap setiap item adalah kelas model 'Item'
+ $items=$this->getItemsToUpdate();
+ if(isset($_POST['Item']))
+ {
+ $valid=true;
+ foreach($items as $i=>$item)
+ {
+ if(isset($_POST['Item'][$i]))
+ $item->attributes=$_POST['Item'][$i];
+ $valid=$valid && $item->validate();
+ }
+ if($valid) // seluruh item benar
+ // ...lakukan sesuatu di sini
+ }
+ // tampilkan tampilan untuk mengumpulkan input tabular
+ $this->render('batchUpdate',array('items'=>$items));
+}
+~~~
+
+Setelah aksi siap, kita perlu bekerja pada tampilan `batchUpdate` untuk
+menampilkan field input dalam sebuah tabel HTML.
+
+~~~
+[php]
+<div class="yiiForm">
+<?php echo CHtml::beginForm(); ?>
+<table>
+<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
+<?php foreach($items as $i=>$item): ?>
+<tr>
+<td><?php echo CHtml::activeTextField($item,"name[$i]"); ?></td>
+<td><?php echo CHtml::activeTextField($item,"price[$i]"); ?></td>
+<td><?php echo CHtml::activeTextField($item,"count[$i]"); ?></td>
+<td><?php echo CHtml::activeTextArea($item,"description[$i]"); ?></td>
+</tr>
+<?php endforeach; ?>
+</table>
+
+<?php echo CHtml::submitButton('Save'); ?>
+<?php echo CHtml::endForm(); ?>
+</div><!-- yiiForm -->
+~~~
+
+Catatan dalam contoh di atas kita menggunakan `"name[$i]"` daripada `"name"` sebagai
+parameter kedua saat memanggil [CHtml::activeTextField].
+
+Jika ada kesalahan validasi, field input terkait akan diterangi secara
+otomatis, seperti halnya model input tunggal yang kami jelaskan
+sebelumnya.
+
+<div class="revision">$Id: form.table.txt 857 2009-03-20 17:31:09Z qiang.xue $</div>
View
72 docs/guide/id/form.view.txt
@@ -0,0 +1,72 @@
+Membuat Formulir
+================
+
+Menulis tampilan `login` adalah pekerjaan langsung. Kita mulai dengan sebuah tag `form`
+yang atribut aksinya berupa URL atas aksi `login` seperti dijelaskan
+sebelumnya. Kemudian kita menyisipkan label dan field input untuk atribut
+yang dideklarasikan dalam kelas `LoginForm`. Setelah itu kita menyisipkan tombol kirim
+yang dapat diklik oleh pengguna untuk mengirimkan formulir. Semua ini dapat dikerjakan dalam
+kode murni HTML.
+
+Yii menyediakan beberapa kelas pembantu guna memfasilitasi komposisi tampilan. Sebagai
+contoh, untuk membuat sebuah field input teks, kita dapat memanggil [CHtml::textField()]; untuk
+membuat daftar drop-down, panggil [CHtml::dropDownList()].
+
+> Info: Orang mungkin heran apa untungnya pemakaian bantuan jika mereka
+> memerlukan sejumlah kode yang mirip dibandingkan dengan kode HTML langsung.
+> Jawabannya adalah bahwa pembantu dapat menyediakan lebih dari sekedar kode HTML. Sebagai
+> example, the following code would generate a text input field which can
+> pemicu pengiriman formulir jika nilainya diubah oleh pengguna.
+> ~~~
+> [php]
+> CHtml::textField($name,$value,array('submit'=>''));
+> ~~~
+> Ini akan memerlukan penulisan sejumlah JavaScript dimana-mana.
+
+Dalam contoh berikut, kita menggunakan [CHtml] untuk membuat formulir login. Kita beranggapan bahwa
+variabel `$user` mewakili turunan `LoginForm`.
+
+~~~
+[php]
+<div class="yiiForm">
+<?php echo CHtml::beginForm(); ?>
+
+<?php echo CHtml::errorSummary($user); ?>
+
+<div class="simple">
+<?php echo CHtml::activeLabel($user,'username'); ?>
+<?php echo CHtml::activeTextField($user,'username'); ?>
+</div>
+
+<div class="simple">
+<?php echo CHtml::activeLabel($user,'password'); ?>
+<?php echo CHtml::activePasswordField($user,'password');
+?>
+</div>
+
+<div class="action">
+<?php echo CHtml::activeCheckBox($user,'rememberMe'); ?>
+Remember me next time<br/>
+<?php echo CHtml::submitButton('Login'); ?>
+</div>
+
+<?php echo CHtml::endForm(); ?>
+</div><!-- yiiForm -->
+~~~
+
+Kode di atas menghasilkan formulir lebih dinamis. Sebagai contoh,
+[CHtml::activeLabel()] menghasilkan label terkait dengan atribut model yang
+ditetapkan. Jika atribut memiliki kesalahan input, label kelas CSS akan diubah
+ke `error`, yang mengubah tampilan label dengan gaya CSS terkait.
+Hal yang sama, [CHtml::activeTextField()] menghasilkan field input teks
+untuk atribut model yang ditetapkan dan mengubah kelas CSS jika
+ada kesalahan pada input.
+
+Jika kita menggunakan file gaya CSS `form.css` yang disediakan oleh naskah `yiic`, formulir
+yang dihasilkan akan terlihat seperti berikut:
+
+![Halaman login](login1.png)
+
+![Login dengan halaman kesalahan](login2.png)
+
+<div class="revision">$Id: form.view.txt 857 2009-03-20 17:31:09Z qiang.xue $</div>
View
550 docs/guide/id/topics.auth.txt
@@ -0,0 +1,550 @@
+Otentikasi dan Otorisasi
+========================
+
+Otentikasi dan otorisasi diperlukan pada halaman Web yang dibatasi
+untuk para pengguna tertentu. Otentikasi adalah verifikasi apakah
+seseorang itu adalah orang yang berhak. Biasanya melibatkan username dan
+password, tapi dapat menyertakan metode lain yang menunjukan identitas, seperti
+kartu pintar, sidik jari, dll. Otorisasi adalah pencarian apakah
+orang yang sudah diidentifikasi (diotentikasi), diijinkan untuk memanipulasi
+sumber daya tertentu. Ini biasanya ditentukan dengan mencari apakah orang
+itu merupakan bagian dari aturan khusus yang memiliki akses ke sumber daya.
+
+Yii memiliki kerangka kerja bawaan otentikasi/otorisasi yang mudah
+untuk dipakai dan dapat dikustomisasi untuk kebutuhan khusus.
+
+Bagian utama dari kerangka kerja auth Yii adalah pra-deklarasi *komponen
+aplikasi user*, berupa obyek yang mengimplementasikan antar muka [IWebUser].
+Komponen user mewakili informasi identitas bagi pengguna saat ini. Kita dapat
+mengaksesnya di mana saja menggunakan
+`Yii::app()->user`.
+
+Memanfaatkan komponen user, kita dapat memeriksa apakah pengguna sudah masuk atau tidak via
+[CWebUser::isGuest]; kita bisa [memasukan|CWebUser::login] dan
+[mengeluarkan|CWebUser::logout] seorang pengguna; kita bisa memeriksa apakah pengguna dapat melakukan
+operasi tertentu dengan memanggil [CWebUser::checkAccess]; dan kita juga bisa
+mendapatkan [pembeda unik|CWebUser::name] serta informasi identitas persisten
+lainnya mengenai pengguna.
+
+Mendefinisikan Kelas Identitas
+------------------------------
+
+Untuk mengotentikasi seorang pengguna, kita mendefinisikan kelas identitas yang
+berisi logika otentikasi sebenarnya. Kelas identitas harus mengimplementasikan
+antar muka [IUserIdentity]. Kelas yang berbeda dapat diimplementasikan
+untuk pendekatan otentikasi yang berbeda (misalnya OpenID, LDAP). Awal
+yang baik adalah dengan memperluas [CUserIdentity] yang merupakan basis kelas untuk
+pendekatan otentikasi berdasarkan nama pengguna dan kata sandi.
+
+Pekerjaan utama dalam mendefinisikan kelas identitas adalah implementasi
+metode [IUserIdentity::authenticate]. Kelas identitas juga dapat mendeklarasikan
+informasi identitas tambahan yang perlu tetap ada selama sesi
+pengguna.
+
+Dalam contoh berikut, kita memvalidasi nama pengguna dan kata sandi
+terhadap tabel user dalam database menggunakan [Rekaman
+Aktif](/doc/guide/database.ar). Kita juga menimpa metode `getId` guna
+mengembalikan variabel `_id` yang disetel saat otentikasi (implementasi
+standar akan menghasilkan nama pengguna sebagai ID). Saat otentikasi,
+kita menyimpan informasi `title` yang diambil dalam suatu kondisi nama yang sama dengan
+memanggil [CBaseUserIdentity::setState].
+
+~~~
+[php]
+class UserIdentity extends CUserIdentity
+{
+ private $_id;
+ public function authenticate()
+ {
+ $record=User::model()->findByAttributes(array('username'=>$this->username));
+ if($record===null)
+ $this->errorCode=self::ERROR_USERNAME_INVALID;
+ else if($record->password!==md5($this->password))
+ $this->errorCode=self::ERROR_PASSWORD_INVALID;
+ else
+ {
+ $this->_id=$record->id;
+ $this->setState('title', $record->title);
+ $this->errorCode=self::ERROR_NONE;
+ }
+ return !$this->errorCode;
+ }
+
+ public function getId()
+ {
+ return $this->_id;
+ }
+}
+~~~
+
+Informasi yang disimpan dalam sebuah keadaan (dengan memanggil [CBaseUserIdentity::setState]) akan dialihkan
+ke [CWebUser] yang menyimpannya dalam penyimpanan persisten, seperti misalnya sesi.
+Informasi ini dapat diakses seperti properti [CWebUser]. Sebagai contoh, kita bisa
+mendapatkan informasi `title` dari pengguna saat ini dengan `Yii::app()->user->title`
+(Ini sudah tersedia sejak versi 1.0.3. Pada versi sebelumnya, kita harus menggunakan
+`Yii::app()->user->getState('title')`.)
+
+> Info: Secara standar, [CWebUser] menggunakan sesi sebagai penyimpanan persisten atas informasi
+identitas pengguna. Jika login berbasis-cookie dihidupkan (dengan menyetel
+[CWebUser::allowAutoLogin] menjadi true), informasi identitas pengguna juga dapat
+disimpan dalam cookie. Pastikan Anda tidak mendeklarasikan informasi sensitif
+(misalnya kata sandi) menjadi persisten.
+
+Masuk dan Keluar
+----------------
+
+Menggunakan kelas identitas dan komponen pengguna, kita dapat
+mengimplementasikan aksi login dan logout dengan mudah.
+
+~~~
+[php]
+// Masukkan pengguna dengan username dan password yang disediakan.
+$identity=new UserIdentity($username,$password);
+if($identity->authenticate())
+ Yii::app()->user->login($identity);
+else
+ echo $identity->errorMessage;
+......
+// Keluarkan pengguna saat ini
+Yii::app()->user->logout();
+~~~
+
+Distandarkan, seorang pengguna akan dikeluarkan setelah periode waktu tertentu bila tidak aktif,
+tergantung pada [konfigurasi sesi](http://www.php.net/manual/en/session.configuration.php).
+Untuk mengubah perilaku ini, kita dapat menyetel properti [allowAutoLogin|CWebUser::allowAutoLogin]
+pada komponen pengguna menjadi true dan mengoper parameter durasi ke dalam
+metode [CWebUser::login]. Selanjutnya pengguna akan tetap masuk selama durasi yang
+sudah ditetapkan, meskipun jika dia menutup jendela browser. Catatan bahwa
+fitur ini mengharuskan browser pengguna untuk menerima cookie.
+
+~~~
+[php]
+// Biarkan pengguna tetap masuk selama 7 hari.
+// Pastikan allowAutoLogin disetel true pada komponen user.
+Yii::app()->user->login($identity,3600*24*7);
+~~~
+
+Filter Kontrol Akses
+--------------------
+
+Filter kontrol akses merupakan skema awal otorisasi yang memeriksa apakah
+pengguna saat ini dapat melakukan aksi kontroler yang diminta. Otorisasi
+didasarkan pada nama pengguna, alamat IP klien dan jenis permintaan.
+Ini disediakan sebagai filter bernama
+["accessControl"|CController::filterAccessControl].
+
+> Tip: Filter kontrol akses cukup untuk skenario sederhana. Untuk
+kontrol akses yang kompleks, Anda dapat menggunakan role-based access (RBAC)
+yang akan segera dibahas.
+
+Untuk mengontrol akses terhadap aksi dalam kontroler, kita menginstalasi filter
+kontrol akses dengan menimpa [CController::filters] (lihat
+[Filter](/doc/guide/basics.controller#filter) untuk lebih jelasnya mengenai
+instalasi filter).
+
+~~~
+[php]
+class PostController extends CController
+{
+ ......
+ public function filters()
+ {
+ return array(
+ 'accessControl',
+ );
+ }
+}
+~~~
+
+Dalam contoh di atas, kita menetapkan bahwa filter [kontrol
+akses|CController::filterAccessControl] harus diterapkan pada setiap
+aksi `PostController`. Rincian aturan otorisasi yang dipakai oleh
+filter ditetapkan dengan menimpa [CController::accessRules] pada kelas
+kontroler.
+
+~~~
+[php]
+class PostController extends CController
+{
+ ......
+ public function accessRules()
+ {
+ return array(
+ array('deny',
+ 'actions'=>array('create', 'edit'),
+ 'users'=>array('?'),
+ ),
+ array('allow',
+ 'actions'=>array('delete'),
+ 'roles'=>array('admin'),
+ ),
+ array('deny',
+ 'actions'=>array('delete'),
+ 'users'=>array('*'),
+ ),
+ );
+ }
+}
+~~~
+
+Kode di atas menetapkan tiga aturan, masing-masing disajikan sebagai array.
+Elemen pertama array bisa berupa `'allow'` atau `'deny'` dan pasangan
+nama-nilai lainnya menetapkan parameter pola aturan. Aturan-aturan ini
+membaca: aksi `create` dan `edit` tidak bisa dijalankan oleh pengguna
+anonim; aksi `delete` dapat dijalankan oleh pengguna dengan aturan `admin`;
+dan aksi `delete` tidak bisa dijalankan oleh siapapun.
+
+Aturan akses dievaluasi satu demi satu sesuai urutan yang ditetapkan.
+Aturan pertama yang sesuai dengan pola saat ini (misalnya nama pengguna, roles,
+alamat IP klien) menentukan hasil otorisasi. Jika aturan ini adalah aturan `allow`,
+aksi bisa dijalankan; jika aturan `deny`, aksi tidak bisa dijalankan;
+jika tidak ada aturan yang sesuai konteks, aksi masih bisa dijalankan.
+
+> Tip: Untuk memastikan aksi tidak bisa dijalankan pada konteks tertentu,
+> sangat bermanfaat untuk selalu menetapkan semuanya sesuai aturan `deny` di akhir
+> set aturan, seperti yang berikut:
+> ~~~
+> [php]
+> return array(
+> // ... aturan lain...
+> // aturan ini menolak aksi 'delete' untuk semua konteks
+> array('deny',
+> 'action'=>'delete',
+> ),
+> );
+> ~~~
+> Alasan atas aturan ini dikarenakan jika tidak ada seorangpun yang sesuai konteks aturan,
+> aksi akan dijalankan.
+
+Aturan akses akan sesuai dengan parameter konteks berikut:
+
+ - [aksi|CAccessRule::actions]: menetapkan aksi mana dijalankan jika aturan sesuai.
+Ini harus berupa array ID aksi. Pembandingannya sensitif jenis huruf.
+
+ - [kontroler|CAccessRule::controllers]: menetapkan kontroler mana yang sesuai aturan
+ini. Ini harus berupa array ID kontroler. Pembandingannya sensitif jenis huruf.
+Opsi ini sudah tersedia sejak versi 1.0.4.
+
+ - [pengguna|CAccessRule::users]: menetapkan pengguna mana yang sesuai aturan ini.
+[Nama|CWebUser::name] pengguna saat ini dipakai untuk penyesuaian. Pembandingannya
+sensitif jenis huruf. Tiga karakter khusus dapat dipakai di sini:
+
+ - `*`: setiap pengguna, termasuk anonim dan pengguna terotentikasi.
+ - `?`: pengguna anonim.
+ - `@`: pengguna terotentikasi.
+
+ - [roles|CAccessRule::roles]: menetapkan roles mana yang sesuai aturan ini.
+Pemakaian fitur [kontrol akses berbasis-role](#role-based-access-control)
+dijelaskan pada subseksi berikutnya. Aturan diterapkan khususnya jika
+[CWebUser::checkAccess] mengembalikan true pada salah satu set aturan.
+Catatan, Anda harus menggunakan set aturan terutama dalam aturan `allow` karena secara definisi,
+aturan mewakili perijinan untuk melakukan sesuatu.
+
+ - [ip|CAccessRule::ips]: menetapkan alamat IP klien mana yang sesuai aturan
+ini.
+
+ - [verb|CAccessRule::verbs]: menetapkan jenis permintaan apa (misalnya
+`GET`, `POST`) sesuai aturan ini. Pembandingannya tidak sensitif jenis huruf.
+
+ - [ekspresi|CAccessRule::expression]: menetapkan ekspresi PHP yang nilainya menunjukan
+apakah aturan ini sesuai atau tidak. Dalam ekspresi, Anda dapat menggunakan variabel `$user`
+yang merujuk ke `Yii::app()->user`. Opsi ini sudah tersedia sejak versi 1.0.3.
+
+
+### Menangani Hasil Otorisasi
+
+Ketika otorisasi gagal, misalnya, pengguna tidak diijinkan untuk melakukan
+aksi yang ditetapkan, salah satu dari dua skenario berikut mungkin terjadi:
+
+ - Jika pengguna tidak masuk dan jika properti [loginUrl|CWebUser::loginUrl]
+komponen pengguna dikonfigurasi menjadi URL halaman login,
+browser akan mengalihkan ke halaman itu.
+
+ - Sebaliknya eksepsi HTTP akan ditampilkan dengan kode kesalahan 401.
+
+Ketika mengkonfigurasi properti [loginUrl|CWebUser::loginUrl], Anda dapat
+menyediakan URL relatif ataupun absolut. Selain itu, Anda juga bisa menyediakan array
+yang akan dipakai untuk membuat URL dengan memanggil [CWebApplication::createUrl].
+Elemen pertma array harus menetapkan
+[rute](/doc/guide/basics.controller#route) ke aksi kontroler login,
+dan pasangan nama-nilai lainnya adalah parmeter GET. Sebagai contoh,
+
+~~~
+[php]
+array(
+ ......
+ 'components'=>array(
+ 'user'=>array(
+ // this is actually the default value
+ 'loginUrl'=>array('site/login'),
+ ),
+ ),
+)
+~~~
+
+Jika browser dialihkan ke halaman login dan login berhasil,
+kita mungkin ingin mengalihkan browser kembali ke halaman yang menyebabkan
+kegagalan otorisasi. Bagaimana kita mengetahui URL halaman itu? Kita bisa
+memperoleh informasi ini dari properti [returnUrl|CWebUser::returnUrl]
+pada komponen pengguna. Selanjutnya kita dapat melakukan pengalihan
+berikut:
+
+~~~
+[php]
+Yii::app()->request->redirect(Yii::app()->user->returnUrl);
+~~~
+
+Kontrol Akses Berbasis-Role
+---------------------------
+
+Role-Based Access Control (RBAC) menyediakan kontrol akses terpusat yang
+sederhana dan bertenaga. Silahkan merujuk ke
+[artikel Wiki](http://en.wikipedia.org/wiki/Role-based_access_control) untuk
+lebih jelasnya mengenai perbandingan RBAC dengan skema kontrol akses
+tradisional.
+
+Yii mengimplementasikan skema RBAC hirarkis via komponen aplikasi
+[authManager|CWebApplication::authManager]. Berikut ini, pertama kami
+perkenalkan konsep utama yang dipakai dalam skema ini; kemudian kami
+jelaskan bagaimana untuk mendefinisikan data otorisasi; di akhir kami
+perlihatkan bagaimana menggunakan data otorisasi untuk melakukan pemeriksaan akses.
+
+### Tinjauan
+
+Konsep dasar dalam RBAC Yii adalah *item otorisasi*. Item otorisasi adalah
+perijinan untuk melakukan sesuatu (misalnya membuat tulisan blog baru,
+mengatur pengguna). Berdasarkan granularitas dan pengguna yang ditargetkan,
+item otorisasi bisa diklasifikasikan sebagai *operasi*,
+*tugas* dan *roles*. Role terdiri dari tugas, tugas terdiri dari operasi,
+dan operasi adalah perijinan yang atomis.
+Sebagai contoh, kita bisa memiliki sistem dengan role `administrator` yang terdiri dari
+tugas `post management` dan tugas `user management`. Tugas `user management`
+terdiri dari operasi `create user`, `update user` dan `delete user`.
+Agar lebih fleksibel, Yii juga mengijinkan role terdiri dari role atau operasi
+lain, tugas terdiri dari tugas lain, dan operasi terdiri dari operasi lainnya.
+
+Item otorisasi secara unik diidentifikasi dengan namanya.
+
+Item otorisasi dapat dikaitkan dengan *aturan bisnis*. Aturan bisnis adalah
+bagian kode PHP yang akan dijalankan saat melakukan pemeriksaan akses
+terhadap itemnya. Hanya ketika eksekusi mengembalikan nilai true,
+pengguna akan dipertimbangkan memiliki perijinan yang disajikan oleh
+item. Sebagai contoh, saat mendifinisikan operasi `updatePost`, kita akan menambahkan
+aturan bisnis yang memeriksa apakah ID pengguna sama seperti ID pemuat tulisan
+agar pembuat tersebut dapat memiliki perijinan untuk memutakhirkan
+tulisan.
+
+Menggunakan item otorisasi, kida bisa membangun *hirarki
+otorisasi*. Item `A` adalah leluhur dari item `B` lain dalam hirarki
+jika `A` terdiri dari `B` (atau katakanlah `A` mewarisi perijinan
+disajikan oleh `B`). Item dapat memiliki multipel item anak, dan juga bisa
+memiliki multipel item leluhur. Oleh karena itu, hirarki otorisasi adalah
+grarik urutan-bagian daripada sebuah pohon (susunan). Dalam hirarki ini, item role berada
+tingkat atas, item operasi pada tingkat bawah, item tugas berada
+diantaranya.
+
+Setelah kita memiliki hirarki otorisasi, kita bisa menempatkan roles dalam
+hirarki ini ke pengguna aplikasi. Pengguna setelah ditempatkan akan memiliki
+perijinan yang disajikan oleh role. Sebagai contoh, jika kita menempatkan role
+`administrator` kepada seorang pengguna, dia akan memiliki perijinan administrator
+yang termasuk `post management` dan `user management` (dan operasi terkait
+seperti misalnya `create user`).
+
+Sekarang bagian yang menyenangkan. Dalam aksi kontroler, kita ingin memeriksa apakah
+pengguna saat ini dapat menghapus tulisan yang ditetapkan. Menggunakan hirarki RBAC serta
+penempatan, ini bisa dikerjakan dengan mudah seperti berikut:
+
+~~~
+[php]
+if(Yii::app()->user->checkAccess('deletePost'))
+{
+ // hapus tulisan
+}
+~~~
+
+### Mengkonfigurasi Manajer Otorisasi
+
+Sebelum kita mendefinisikan hirarki otorisasi dan melakukan pemeriksaan akses,
+kita perlu mengkonfigurasi komponen aplikasi
+[authManager|CWebApplication::authManager]. Yii menyediakan dua jenis
+manajer otorisasi: [CPhpAuthManager] dan
+[CDbAuthManager]. Yang pertama menggunakan file naskah PHP untuk menyimpan data
+otorisasi, sementara yang kedua menyimpan data otorisasi dalam database. Ketika kita
+mengkonfigurasi komponen aplikasi [authManager|CWebApplication::authManager],
+kita harus menetapkan kelas komponen mana yang dipakai dan apa nilai
+awal untuk komponennya. Sebagai contoh,
+
+~~~
+[php]
+return array(
+ 'components'=>array(
+ 'db'=>array(
+ 'class'=>'CDbConnection',
+ 'connectionString'=>'sqlite:path/to/file.db',
+ ),
+ 'authManager'=>array(
+ 'class'=>'CDbAuthManager',
+ 'connectionID'=>'db',
+ ),
+ ),
+);
+~~~
+
+Selanjutnya kita dapat mengakses komponen aplikasi [authManager|CWebApplication::authManager]
+menggunakan `Yii::app()->authManager`.
+
+### Mendefinisikan Hirarki Otorisasi
+
+Mendefinisikan hirarki otorisasi mencakup tiga langkah: mendefinisikan
+item otorisasi, membuat hubungan diantara item otorisasi,
+dan menempatkan role ke pengguna aplikasi. Komponen aplikasi
+[authManager|CWebApplication::authManager] menyediakan seluruh set API
+untuk tugas-tugas ini.
+
+Untuk mendefinisikan item otorisasi, panggil salah satu metode berikut,
+tergantung pada jenis itemnya:
+
+ - [CAuthManager::createRole]
+ - [CAuthManager::createTask]
+ - [CAuthManager::createOperation]
+
+Setelah kita memiliki satu set item otorisasi, kita dapat memanggil metode
+untuk membuat hubungan diantara item-item otorisasi:
+
+ - [CAuthManager::addItemChild]
+ - [CAuthManager::removeItemChild]
+ - [CAuthItem::addChild]
+ - [CAuthItem::removeChild]
+
+Dan terakhir, kita memanggil metode berikut untuk menempatkan item role ke
+pengguna individual:
+
+ - [CAuthManager::assign]
+ - [CAuthManager::revoke]
+
+Di bawah ini kami memperlihatkan contoh mengenai pembangunan hirarki otorisasi dengan
+API yang sudah disediakan:
+
+~~~
+[php]
+$auth=Yii::app()->authManager;
+
+$auth->createOperation('createPost','create a post');
+$auth->createOperation('readPost','read a post');
+$auth->createOperation('updatePost','update a post');
+$auth->createOperation('deletePost','delete a post');
+
+$bizRule='return Yii::app()->user->id==$params["post"]->authID;';
+$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
+$task->addChild('updatePost');
+
+$role=$auth->createRole('reader');
+$role->addChild('readPost');
+
+$role=$auth->createRole('author');
+$role->addChild('reader');
+$role->addChild('createPost');
+$role->addChild('updateOwnPost');
+
+$role=$auth->createRole('editor');
+$role->addChild('reader');
+$role->addChild('updatePost');
+
+$role=$auth->createRole('admin');
+$role->addChild('editor');
+$role->addChild('author');
+$role->addChild('deletePost');
+
+$auth->assign('reader','readerA');
+$auth->assign('author','authorB');
+$auth->assign('editor','editorC');
+$auth->assign('admin','adminD');
+~~~
+
+> Info: sementara pada contoh di atas terlihat panjang dan membosankan, ini dikarenakan
+untuk keperluan demonstratif saja. Para pengembang biasanya harus mengembangkan beberapa
+antar muka agar pengguna akhir bisa menggunakan hirarki otorisasi
+lebih intuitif.
+
+
+### Menggunakan Aturan Bisnis
+
+Ketika kita mendefinisikan hirarki otorisasi, kita dapat mengaitkan sebuah role, tugas atau operasi dengan apa yang disebut *aturan bisnis*. Kita juga dapat mengaitkan aturan bisnis saat kita menempatkan sebuah role kepada pengguna. Aturan bisnis adalah bagian dari kode PHP (teppatnya pernyataan PHP) yang dijalankan ketika kita melakukan pemeriksaan akses. Nilai kode yang dikembalikan dipakai untuk menentukan apakah role atau penempatan diterapkan pada pengguna saat ini. Dalam contoh di atas, kita mengaitkan aturan bisnis dengan tugas `updateOwnPost`. Dalam aturan bisnis, kita cukup memeriksa apakah ID pengguna saat ini sama dengan ID pembuat tulisan. Informasi tulisan dalam array `$params` disediakan oleh para pengembang saat melakukan pemeriksaan akses.
+
+
+### Pemeriksaan Akses
+
+Untuk melakukan pemeriksaan akses, pertama kita perlu mengetahui nama item
+otorisasi. Sebagai contoh, untuk memeriksa apakah pengguna saat ini dapat membuat
+sebuah tulisan, kita akan memeriksa apakah dia memiliki perijinan yang disiapkan
+oleh operasi `createPost`. Kemudian kita memanggil [CWebUser::checkAccess] untuk melakukan
+pemeriksaan akses:
+
+~~~
+[php]
+if(Yii::app()->user->checkAccess('createPost'))
+{
+ // buat tulisan
+}
+~~~
+
+Jika aturan otorisasi dikaitkan dengan aturan bisnis yang memerlukan
+parameter tambahan, kita juga dapat mengoperkannya. Contoh, untuk
+memeriksa apakah pengguna dapat memutakhirkan sebuah tulisan, kita akan melakukan
+
+~~~
+[php]
+$params=array('post'=>$post);
+if(Yii::app()->user->checkAccess('updateOwnPost',$params))
+{
+ // mutakhirkan tulisan
+}
+~~~
+
+
+### Menggunakan Role Standar
+
+> Note|Catatan: Fitur standar role sudah tersedia sejak versi 1.0.3
+
+Banyak aplikasi Web memerlukan beberapa role sangat khusus yang ditempatkan ke
+setiap pengguna atau hampir semua pengguna sistem. Sebagai contoh, kita mungkin ingin menemppatkan beberapa
+hak bagi para pengguna terotentikasi. Ini akan memunculkan banyak masalah pemeliharaan jika
+kita secara eksplisit menetapkan dan menyimpan penempatan role tersebut. Kita dapat mengeksploitasi
+*role standar* guna memecahkan masalah ini.
+
+Role standar adalah sebuah role yang secara implisit ditempatkan ke setiap pengguna, termasuk
+yang terotentikasi dan pengunjung. Kita tidak ingin secara eksplisit menempatkannya kepada pengguna.
+Saat [CWebUser::checkAccess] dipanggil, role standar akan diperiksa lebih dulu seolah-olah ditempatkan
+kepada pengguna.
+
+Role standar harus dideklarasikan dalam properti [CAuthManager::defaultRoles].
+Contohnya, konfigurasi berikut mendeklarasikan dua role sebagai role standar: `authenticated` dan `guest`.
+
+~~~
+[php]
+return array(
+ 'components'=>array(
+ 'authManager'=>array(
+ 'class'=>'CDbAuthManager',
+ 'defaultRoles'=>array('authenticated', 'guest'),
+ ),
+ ),
+);
+~~~
+
+Karena role standar ditempatkan ke setiap pengguna, biasanya perlu dikaitkan
+dengan aturan bisnis yang menentukan apakah role benar-benar diterapkan
+kepada pengguna. Sebagai contoh, kode berikut mendefinisikan dua role,
+`authenticated` dan `guest`, yang secara efektif diterapkan masing-masing
+ke para pengguna terotentikasi dan pengunjung.
+
+~~~
+[php]
+$bizRule='return !Yii::app()->user->isGuest;';
+$auth->createRole('authenticated', 'authenticated user', $bizRule);
+
+$bizRule='return Yii::app()->user->isGuest;';
+$auth->createRole('guest', 'guest user', $bizRule);
+~~~
+
+<div class="revision">$Id: topics.auth.txt 956 2009-04-21 15:16:03Z qiang.xue@gmail.com $</div>
View
96 docs/guide/id/topics.console.txt
@@ -0,0 +1,96 @@
+Aplikasi Konsole
+================
+
+Aplikasi konsol dipakai terutama oleh aplikasi web untuk melakukan pekerjaan
+offline, seperti pembuatan kode, pencarian kompilasi indeks, pengiriman
+email, dll. Yii menyediakan sebuah kerangka kerja untuk penulisan aplikasi konsol
+secara sistematis dan berorientasi-obyek.
+
+Yii mewakili setiap tugas konsol dalam batasan turunan [perintah|CConsoleCommand],
+dan [aplikasi konsole|CConsoleApplication] yang dipakai untuk mengirimkan permintaan
+baris perintah ke perintah yang sesuai. Turunan aplikasi dibuat dalam
+naskah entri. Untuk menjalankan tugas konsol, kita cukup menjalankan
+perintah pada baris perintah sebagai berikut,
+
+~~~
+php entryScript.php CommandName Param0 Param1 ...
+~~~
+
+di mana `CommandName` merujuk pada nama perintah yang tidak sensitif jenis huruf,
+dan `Param0`, `Param1` dan seterusnya adalah parameter yang dioper ke turunan
+perintah.
+
+Naskah entri untuk aplikasi konsol biasanya ditulis seperti berikut,
+mirip dengan aplikasi Web,
+
+~~~
+[php]
+defined('YII_DEBUG') or define('YII_DEBUG',true);
+// sertakan file bootstrap Yii
+require_once('path/to/yii/framework/yii.php');
+// buat turunan aplikasi dan jalankan
+$configFile='path/to/config/file.php';
+Yii::createConsoleApplication($configFile)->run();
+~~~
+
+Kemudian kita membuat kelas perintah yang harus diperluas dari [CConsoleCommand].
+Setiap kelas perintah harus dinamai seperti nama perintah ditambahkan dengan
+`Command`. Sebagai contoh, untuk mendifisikan perintah `email`, kita harus menulis kelas
+`EmailCommand`. Semua file kelas perintah harus ditempatkan di bawah subdirektori
+`commands` pada [basis direktori
+aplikasi](/doc/guide/basics.application#application-base-directory).
+
+> Tip: Dengan mengkonfigurasi [CConsoleApplication::commandMap], Anda juga dapat memiliki
+kelas perintah dalam kkonvensi penamaan berbeda dan ditempatkan dalam direktori
+yang berbeda.
+
+Menulis kelas perintah umumnya menyangkut implementasi metode
+[CConsoleCommand::run]. Parameter baris perintah dioper sebagai array
+pada metode ini. Di bawah ini contohnya:
+
+~~~
+[php]
+class EmailCommand extends CConsoleCommand
+{
+ public function run($args)
+ {
+ $receiver=$args[0];
+ // kirim email ke $receiver
+ }
+}
+~~~
+
+Kapan saja dalam sebuah perintah, kita dapat mengakses turunan aplikasi konsol
+via `Yii::app()`. Seperti turunan aplikasi Web, aplikasi konsole juga bisa
+dikonfigurasi. Sebagai contoh, kita bosa mengkonfigurasi komponen aplikasi `db`
+untuk mengakses database. Konfigurasi biasanya ditetapkan sebagai file PHP dan
+dioper ke pembentuk kelas aplikasi konsol
+(atau [createConsoleApplication|YiiBase::createConsoleApplication] dalam
+naskah entri).
+
+Menggunakan Piranti `yiic`
+--------------------------
+
+Kita sudah menggunakan piranti `yiic` untuk [membuat aplikasi pertama
+kita](/doc/guide/quickstart.first-app). Sebenarnya piranti `yiic`
+diimplementasikan sebagai aplikasi konsol yang file naskah entrinya
+`framework/yiic.php`. Menggunakan `yiic`, kita dapat melaksanakan tugas-tugas seperti
+membuat kerangka aplikasi Web, membuat kelas kontroler atau kelas model,
+membuat kode yang dibutuhkan oleh operasi CRUD, menguraikan pesan yang
+diterjemahkan, dll.
+
+Kita dapat meningkatkan `yiic` dengan menambah perintah kita sendiri yang dikustomisasi. Untuk melakukannya,
+kita harus mulai dengan kerangka aplikasi yang dibuat menggunakan perintah `yiic webapp`,
+seperti dijelaskan dalam [Membuat Aplikasi Pertama
+Yii](/doc/guide/quickstart.first-app). Perintah `yiic webapp` akan
+membuat dua file di bawah direktori `protected`: `yiic` dan
+`yiic.bat`. Keduanya adalah versi *lokal* pada piranti `yiic` yang dibuat
+khususnya untuk aplikasi Web.
+
+Selanjutnya kita membuat perintah kita sendiri di bawah direktori `protected/commands`.
+Menjalankan piranti lokal `yiic`, kita akan melihat bahwa perintah kita sendiri
+terlihat bersama dengan yang standar. Kita juga bisa membuat perintah kita sendiri untuk
+dipakai saat `yiic shell` dipakai. Untuk melakukannya, cukup masukkan file kelas
+perintah di bawah direktori `protected/commands/shell`.
+
+<div class="revision">$Id: topics.console.txt 745 2009-02-25 21:45:42Z qiang.xue $</div>
View
105 docs/guide/id/topics.error.txt
@@ -0,0 +1,105 @@
+Penanganan Kesalahan
+====================
+
+Yii menyediakan kerangka kerja penanganan kesalahan yang lengkap berdasarkan
+pada mekanisme eksepsi PHP 5. Saat aplikasi dibuat untuk menangani permintaan
+pengguna yang masuk, ia meregistrasi metode [handleError|CApplication::handleError]
+untuk menangani peringatan dan pemberitahuan PHP; dan meregistrasi metode
+[handleException|CApplication::handleException] guna menangani eksepsi PHP
+yang tidak tertangkap. Konsekuensinya, jika peringatan/pemberitahuan PHP atau eksepsi
+yang tidak tertangkap terjadi selama eksekusi aplikasi, salah satu pengendali
+kesalahan akan mengambil alih kontrol dan memulai prosedur penanganan kesalahan
+tertentu.
+
+> Tip: Registrasi pengendali kesalahan dikerjakan dalam pembentuk aplikasi
+dengan memanggil fungsi PHP
+[set_exception_handler](http://www.php.net/manual/en/function.set-exception-handler.php)
+dan [set_error_handler](http://www.php.net/manual/en/function.set-error-handler.php).
+Jika Anda tidak menginginkan Yii menangani kesalahan dan eksepsi, Anda dapat mendefinisikan
+constant `YII_ENABLE_ERROR_HANDLER` dan `YII_ENABLE_EXCEPTION_HANDLER` menjadi
+false dalam [naskah entri](/doc/guide/basics.entry).
+
+Standarnya, [errorHandler|CApplication::errorHandler] (atau
+[exceptionHandler|CApplication::exceptionHandler]) akan memunculkan event
+[onError|CApplication::onError] (atau event
+[onException|CApplication::onException]). Jika kesalahan (atau eksepsi)
+tidak ditangani oleh pengendali event manapun, ia akan memanggil bantuan dari
+komponen aplikasi [errorHandler|CErrorHandler].
+
+Memunculkan Eksepsi
+-------------------
+
+Memunculkan eksepsi dalam Yii tidak berbeda dengan memunculkan eksepsi normal PHP.
+Anda menggunakan sintaks berikut untuk memunculkan eksepsi bila diperlukan:
+
+~~~
+[php]
+throw new ExceptionClass('ExceptionMessage');
+~~~
+
+Yii mendefinisikan dua kelas eksepsi: [CException] dan [CHttpException]. Kelas
+pertma adalah kelas eksepsi generik, sementara kelas kedua mewakili eksepsi
+yang harus ditampilkan kepada pengguna akhir. Kelas kedua juga membawa properti
+[statusCode|CHttpException::statusCode] yang mewakili kode status HTTP.
+Kelas eksepsi menentukan bagaimana ia harus ditampilkan,
+kita akan menjelaskannya nanti.
+
+> Tip: Memunculkan eksepsi [CHttpException] adalah cara mudah pelaporan
+kesalahan yang disebabkan oleh kesalahan pengguna mengoperasikan. Sebagai contoh, jika pengguna menyediakan
+ID tulisan tidak benar dalam URL, kita dapat melakukan hal berikut untuk menampilkan kesalahan 404
+(halaman tidak ditemukan):
+~~~
+[php]
+// jika ID tulisan tidak benar
+throw new CHttpException(404,'The specified post cannot be found.');
+~~~
+
+Menampilkan Kesalahan
+---------------------
+
+Ketika kesalahan dioperkan ke komponen aplikasi [CErrorHandler], ia
+memilih tampilan yang sesuai untuk menampilkan kesalahan. Jika kesalahan bertujuan untuk
+ditampilkan kepada pengguna akhir, seperti misalnya [CHttpException], ia akan menggunakan
+tampilan bernama `errorXXX`, di mana `XXX` adalah kode status HTTP (misalnya
+400, 404, 500). Jika kesalahan adalah kesalahan internal dan seharusnya hanya ditampilkan
+kepada pengembang, ia akan menggunakan tampilan bernama `exception`. Jika kasus yang kedua,
+informasi jejak panggilan juga baris kesalahan akan
+ditampilkan.
+
+> Info: Ketika aplikasi berjalan dalam [mode
+produksi](/doc/guide/basics.entry#debug-mode), semua kesalahan termasuk yang internal
+akan ditampilkan menggu8nakan tampilan `errorXXX`. Ini dikarenakan jejak panggilan
+kesalahan mungkin berisi informasi yang sensitif. Dalam hal ini,
+pengembang harus bergantung pada log kesalahan untuk menentukan penyebab kesalahan
+sebenarnya.
+
+[CErrorHandler] mencari file tampilan terkait untuk sebuah tampilan dengan urutan
+sebagai berikut:
+
+ 1. `WebRoot/themes/ThemeName/views/system`: ini adalah direktori tampilan `system`
+di bawah tema yang aktif saat ini.
+
+ 2. `WebRoot/protected/views/system`: ini adalah direktori tampilan `system` di
+bawah aplikasi.
+
+ 3. `yii/framework/views`: ini adalah direktori tampilan sistem standar yang
+disediakan oleh Yii framework.
+
+Oleh karena itu, jika kita ingin mengkustomisasi tampilan kesalahan, kita cukup membuat
+file tampilan kesalahan di bawah direktori tampilan sistem pada aplikasi atau tema Anda.
+Setiap file tampilan adalah naskah PHP normal yang berisi kode HTML.
+Untuk lebih jelasnya, silahkan merujuk ke file tampilan standar framework di bawah
+direktori `view`.
+
+Pencatatan Pesan
+----------------
+
+Pesan tingkat `error` akan selalu dicatat bila terjadi kesalahan. Jika kesalahan
+disebabkan oleh peringatan atau pemberitahuan PHP, pesan akan dicatat dengan
+kategori `php`; jika kesalahan disebabkan oleh eksepsi tidak tertangkap, kategori
+akan menjadi `exception.ExceptionClassName` (untuk [CHttpException]
+[statusCode|CHttpException::statusCode] juga akan ditambahkan ke
+kategori). Selanjutnya Anda dapat mengeksploitasi fitur [pencatatan](/doc/guide/topics.logging)
+untuk memonitor kesalahan yang terjadi selama eksekusi aplikasi.
+
+<div class="revision">$Id: topics.error.txt 772 2009-02-28 18:23:17Z qiang.xue $</div>
View
271 docs/guide/id/topics.i18n.txt
@@ -0,0 +1,271 @@
+Internasionalisasi
+==================
+
+Internasionalisasi (I18N) merujuk pada proses mendesain aplikasi software
+agar bisa diadaptasi ke berbagai bahasa dan wilayah tanpa perubahan
+proses pembuatannya. Untuk aplikasi Web, ini merupakan bagian penting karena
+potensi pengguna mungkin datang dari seluruh dunia.
+
+Yii menyediakan dukungan I18N dalam beberapa aspek.
+
+ - Menyediakan data lokal untuk setiap bahasa dan varian yang mungkin.
+ - Menyediakan layanan pesan dan file terjemahan.
+ - Menyediakan pembentukan tanggal dan jam dependen-lokal.
+ - Menyediakan pembentukan angka dependen-lokal.
+
+Dalam subseksi berikut, kita akan mengelaborasi setiap aspek di atas.
+
+Lokal dan Bahasa
+----------------
+
+Lokal adalah satu set parameter yang mendefinisikan bahasa pengguna, negara
+dan setiap preferensi varian khusus yang diinginkan pengguna melihatnya dalam
+antar muka mereka. Ini biasanya diidentifikasi dengan ID yang terdiri dari ID bahasa
+dan ID wilayah. Sebagai contoh, ID `en_US` singkatan dari lokal bahasa Inggris dan
+Amerika. Untuk konsistensi, semua ID lokal dalam Yii adalah dikanonikal
+guna membentuk `LanguageID` atau `LanguageID_RegionID`
+dalam huruf kecil (misalnya `en`, `en_us`).
+
+Data lokal disajikan sebagai turunan [CLocale]. Ia menyediakan informasi
+dependen-lokal, termasuk simbol kurs, simbol angka, format kurs,
+format angka, format tanggal dan jam, dan nama terkait=tanggal.
+Karena informasi bahasa sudah disatukan dalam ID lokal,
+ia tidak disediakan oleh [CLocale]. Untuk alasan yang sama, kita sering
+saling bertukar batasan lokal dan bahasa.
+
+Diperoleh ID lokal, Anda bisa mendapatkan turunan [CLocale] terkait dengan
+`CLocale::getInstance($localeID)` atau `CApplication::getLocale($localeID)`.
+
+> Info: Yii datang dengan data lokal untuk hampir semua bahasa dan wilayah.
+Data diperoleh dari [Repositori Data Lokal Umum](http://unicode.org/cldr/) (CLDR). Untuk setiap lokal, hanya
+subset data CLDR yang disediakan karena data aslinya berisi banyak dan informasinya
+jarang dipakai.
+
+Untuk aplikasi Yii, kita membedakan [target
+bahasa|CApplication::language] dari [sumber
+bahasa|CApplication::sourceLanguage]. Target bahasa adalah bahasa
+(lokal) pengguna yang aplikasinya ditargetkan baginya, sementara sumber bahasa
+merujuk ke bahasa (lokal) penulisan file sumber aplikasi.
+Internasionalisasi terjadi hanya ketika dua bahasa
+berbeda.
+
+Anda dapat mengkonfigurasi [target bahasa|CApplication::language] dalam
+[konfigurasi aplikasi](/doc/guide/basics.application#application-configuration), atau
+mengubahnya secara dinamis sebelum internasionalisasi terjadi.
+
+> Tip: Adakalanya kita mungkin ingin menyetel target bahasa seperti bahasa yang diinginkan
+oleh pengguna (ditetapkan dalam preferensi browser pengguna). Untuk melakukannya, kita
+dapat mengambil ID bahasa yang diinginkan pengguna menggunakan
+[CHttpRequest::preferredLanguage].
+
+Terjemahan
+----------
+
+Fitur I18N yang paling dibutuhkan barangkali adalah terjemahan, termasuk terjemahan
+pesan dan terjemahan tampilan. Terjemahan pesan menerjemahkan pesan teks ke bahasa
+yang diinginkan, sementara terjemahan tampilan menerjemahkan seluruh file ke bahasa
+yang dinginkan.
+
+Permintaan terjemahan terdiri dari obyek yang diterjemahkan, sumber
+bahasa di mana obyek itu berada, dan target bahasa ke mana obyek harus
+diterjemahkan. Dalam Yii, sumber bahasa distandarkan ke
+[sumber bahasa aplikasi|CApplication::sourceLanguage] sementara target bahasa
+distandarkan ke [bahasa aplikasi|CApplication::language].
+Jika sumber dan target bahasa sama, terjemahan tidak
+terjadi.
+
+### Terjemahan Pesan
+
+Terjemahan pesan dikerjakan dengan memanggil [Yii::t()|YiiBase::t]. Metode
+menerjemahkan pesan yang didapat dari [sumber
+bahasa|CApplication::sourceLanguage] ke [target
+bahasa|CApplication::language].
+
+Saat menerjemahkan pesan, kategorinya harus ditetapkan karena
+pesan mungkin diterjemahkan secara berbeda di bawah kategori
+(konteks) berbeda. Kategori `yii` terpakai untuk pesan yang digunakan oleh kode inti Yii
+framework.
+
+Pesan bisa berisi penampung parameter yang akan diganti dengan nilai parameter
+sebenarnya saat memanggil [Yii::t()|YiiBase::t]. Sebagai
+contoh, permintaan terjemahan pesan berikut akan mengganti penampung
+`{alias}` dalam pesan asli dengan nilai alias sebenarnya.
+
+~~~
+[php]
+Yii::t('yii', 'Path alias "{alias}" is redefined.',
+ array('{alias}'=>$alias))
+~~~
+
+> Note|Catatan: Pesan yang diterjemahkan harus berupa konstan string.
+Tidak boleh berisi variabel yang akan mengubah konten pesan (misalnya `"Invalid
+{$message} content."`). Gunakan penampung parameter jika pesan harus bervariasi
+berdasarkan pada beberapa parameter.
+
+Pesan yang diterjemahkan disimpan dalam sebuah repositori yang disebut *sumber
+pesan*. Sumber pesan disajikan sebagai turunan
+[CMessageSource] atau anak kelasnya. Ketika [Yii::t()|YiiBase::t] dipanggil,
+ia akan mencari pesan dalam sumber pesan dan mengembalikan versi terjemahan
+jika ditemukan.
+
+Yii datang dengan jenis sumber pesan berikut. Anda juga boleh memperluas
+[CMessageSource] untuk mengubah jenis sumber pesan Anda sendiri.
+
+ - [CPhpMessageSource]: terjemahan pesan disimpan sebagai pasangan kunci-nilai
+dalam array PHP. Pesan asli adalah kunci dan terjemahan pesan adalah nilai.
+Setiap array mewakili terjemahan untuk kategori pesan tertentu dan
+disimpan dalam file naskah PHP terpisah
+yang namanya adalah nama kategori. File terjemahan PHP untuk bahasa yang
+sama disimpan di bawah direktori yang sama dinamai sebagai ID lokal. Dan
+semua direktori ini ditempatkan di bawah direktori yang ditetapkan dalam
+[basePath|CPhpMessageSource::basePath].
+
+ - [CGettextMessageSource]: terjemahan pesan disimpan sebagai file [GNU
+Gettext](http://www.gnu.org/software/gettext/).
+
+ - [CDbMessageSource]: terjemahan pesan disimpan dalam tabel database.
+Untuk lebih jelasnya, lihat dokumentasi API untuk [CDbMessageSource].
+
+Sumber pesan diambil sebagai [komponen
+aplikasi](/doc/guide/basics.application#application-component). Pra-deklarasi
+komponen aplikasi Yii bernama [messages|CApplication::messages] untuk menyimpan
+pesan yang dipakai dalam aplikasi pengguna. Distandarkan, jenis sumber pesan ini
+adalah [CPhpMessageSource] dan path basis untuk penyimpanan file terjemahan PHP
+adalah `protected/messages`.
+
+Ringkasnya, untuk menggunakan terjemahan pesan, diperlukan langkah-langkah
+berikut:
+
+ 1. Panggil [Yii::t()|YiiBase::t] di tempat yang sesuai;
+
+ 2. Buat file terjemahan PHP sebagai
+`protected/messages/LocaleID/CategoryName.php`. Setiap file mengembalikan sebuah
+array terjemahan pesan. Catatan, ini anggapan bahwa Anda menggunakan
+[CPhpMessageSource] standar untuk menyimpan pesan yang diterjemahkan.
+
+ 3. Konfigurasi [CApplication::sourceLanguage] dan [CApplication::language].
+
+> Tip: Piranti `yiic` dalam Yii bisa dipakai untuk mengatur terjemahan pesan
+ketika [CPhpMessageSource] dipakai sebagai sumber pesan. Perintah `message` dapat
+secara otomatis mengurai pesan yang akan diterjemahkan dari file sumber yang dipilih
+dan menggabungnya dengan terjemahan yang sudah ada bila diperlukan.
+
+Sejak versi 1.0.2, Yii menambahkan dukungan untuk [choice format|CChoiceFormat]. Pilihan format
+merujuk ke pemilihan terjemahan berdasarkan nilai angka yang diberikan. Sebagai contoh,
+dalam bahasa Inggris, kata 'book' mungkin berupa bentuk tunggal atau bentuk plural tergantung
+pada jumlah buku, sementara dalam bahasa lain, kata mungkin tidak memiliki bentuk
+berbeda (misalnya Cina) atau memiliki aturan bentuk lebih kompleks
+(misalnya Rusia). Pilihan format memecahkan masalah ini dengan cara sederhana namun efektif.
+
+Untuk menggunakan pilihan format, pesan yang diterjemahkan harus terdiri dari pasangan
+urutan ekspresi-pesan dipisahkan dengan `|`, seperti terlihat di bawah ini:
+
+~~~
+[php]
+'expr1#message1|expr2#message2|expr3#message3'
+~~~
+
+di mana `exprN` merujuk ke ekspresi valid PHP yang mengevaluasi ke nilai boolean
+menunjukan apakah pesan terkait harus dikembalikan atau tidak. Hanya pesan
+terkait ke ekspresi pertama yang hasil evaluasinya true akan dikembalikan.
+Ekspresi bisa berisi variabel spesial bernama `n` (catatan, ini bukan `$n`)
+yang akan mengambil jumlah nilai yang dioper sebagai parameter pesan pertama. Sebagai contoh,
+menganggap pesan yang diterjemahkan adalah:
+
+~~~
+[php]
+'n==1#one book|n>1#many books'
+~~~
+
+dan kita mengoper nilai angka 2 dalam array parameter pesan saat
+memanggil [Yii::t()|YiiBase::t], kita akan memperoleh `many books` sebagai pesan
+yang diterjemahkan.
+
+Notasi jalan pintas, jika ekspresi adalah angka, ia akan diperlakukan sebagai
+`n==Number`. Oleh karena itu pesan yang diterjemahkan juga bisa ditulis seperti:
+
+~~~
+[php]
+'1#one book|n>1#many books'
+~~~
+
+
+### Terjemahan File
+
+Terjemahan file dilakukan dengan memanggil
+[CApplication::findLocalizedFile()]. Path file yang akan
+diterjemahkan, metode akan mencari file dengan nama yang sama di bawah
+subdirektori `LocaleID`. Jika ditemukan, path file yang akan dikembalikan;
+jika tidak, path file asli yang akan dikembalikan.
+
+Terjemahan file dipakai terutama saat membuat tampilan. Ketika memanggil salah satu
+metode render dalam kontroler atau widget, file tampilan akan diterjemahkan
+secara otomatis. Sebagai contoh, jika [target
+bahasa|CApplication::language] adalah `zh_cn` sementara [sumber
+bahasa|CApplication::sourceLanguage] adalah `en_us`, pembuatan tampilan bernama
+`edit` akan mencari file tampilan
+`protected/views/ControllerID/zh_cn/edit.php`. Jika file ditemukan, versi
+terjemahan ini yang dipakai untuk pembuatan; jika tidak, file
+`protected/views/ControllerID/edit.php` yang akan dibuat.
+
+Terjemahan file juga dapat dipakai untuk keperluan lain, misalnya
+menampilkan gambar terjemahan atau pengambilan file data dependen-lokal.
+
+Pembentukan Tanggal dan Jam
+---------------------------
+
+Tanggal dan jam sering berbeda bentuk di negara atau wilayah berbeda.
+Tugas pembentukan tanggal dan jam menghasilkan string tanggal dan jam
+yang sesuai dengan lokal yang ditetapkan. Yii menyediakan
+[CDateFormatter] untuk keperluan ini.
+
+Setiap turunan [CDateFormatter] dikaitkan dengan target lokal. Untuk mendapatkan
+pembentuk yang dikaitkan dengan target lokal pada seluruh aplikasi,
+kita cukup mengakses properti [dateFormatter|CApplication::dateFormatter]
+pada aplikasi.
+
+Kelas [CDateFormatter] menyediakan dua metode untuk membentuk UNIX
+timestamp.
+
+ - [format|CDateFormatter::format]: metode ini membentuk UNIX
+timestamp ke dalam string berdasarkan pola yang dikustomisasi (misalnya
+`$dateFormatter->format('yyyy-MM-dd',$timestamp)`).
+
+ - [formatDateTime|CDateFormatter::formatDateTime]: metode ini membentuk
+UNIX timestamp ke dalam string berdasarkan pola pradefinisi dalam data target
+lokal (misalnya format tanggal `short`, format waktu
+`long`).
+
+Pembentukan Angka
+-----------------
+
+Seperti tanggal dan jam, angka juga bisa dibentuk secara berbeda di
+negara atau wilayah yang berbeda. Pembentukan angka termasuk pembentukan desimal,
+pembentukan kurs dan pembentukan prosentase. Yii menyediakan
+[CNumberFormatter] untuk tugas-tugas ini.
+
+Untuk mendapatkan pembentuk angka terkait dengan target lokal pada seluruh
+aplikasi, kita dapat mengakses properti
+[numberFormatter|CApplication::numberFormatter] pada
+aplikasi.
+
+Metode berikut disediakan oleh [CNumberFormatter] untuk membentuk nilai
+integer atau double.
+
+ - [format|CNumberFormatter::format]: metode ini membentuk angka
+ke dalam string berdasarkan pada pola kustomisasi (misalnya
+`$numberFormatter->format('#,##0.00',$number)`).
+
+ - [formatDecimal|CNumberFormatter::formatDecimal]: metode ini membentuk angka
+menggunakan pola desimal pradefinisi dalam data lokal
+target.
+
+ - [formatCurrency|CNumberFormatter::formatCurrency]: metode ini
+membentuk angka dan kode kurs menggunakan pola kurs
+pradefinisi dalam data lokal target.
+
+ - [formatPercentage|CNumberFormatter::formatPercentage]: metode ini
+membentuk angka menggunakan pola prosentase pradefinisi dalam data lokal
+target.
+
+<div class="revision">$Id: topics.i18n.txt 772 2009-02-28 18:23:17Z qiang.xue $</div>
View
150 docs/guide/id/topics.logging.txt
@@ -0,0 +1,150 @@
+Pencatatan
+==========
+
+Yii menyediakan fitur pencatatan fleksibel dan bisa diperluas. Pencatatan pesan
+dapat diklasifikasikan berdasarkan tingkat log atau kategori pesan. Menggunakan
+filter tingkat dan kategori, pesan yang dipilih selanjutnya bisa dirutekan ke
+tujuan yang berbeda, misalnya file, email, jendela browser, dll.
+
+Pencatatan Pesan
+----------------
+
+Pesan dapat dicatat dengan memanggil [Yii::log] atau [Yii::trace]. Perbedaan
+diantara kedua metode ini adalah bahwa yang kedua hanya mencatat pesan
+saat aplikasi dalam [mode debug](/doc/guide/basics.entry#debug-mode).
+
+~~~
+[php]
+Yii::log($message, $level, $category);
+Yii::trace($message, $category);
+~~~
+
+Ketika mencatat pesan, kita harus menetapkan tingkat dan kategorinya.
+Kategori adalah string dalam bentuk `xxx.yyy.zzz` yang mirip dengan
+[alias path](/doc/guide/basics.namespace). Contoh, jika pesan dicatat
+dalam [CController], kita bisa menggunakan kategori `system.web.CController`.
+Tingkat pesan harus salah satu dari nilai berikut:
+
+ - `trace`: ini adalah tingkat yang dipakai oleh [Yii::trace]. kegunaannya untuk melacak
+alur eksekusi aplikasi selama pengembangan.
+
+ - `info`: ini untuk pencatatan informasi umum.
+
+ - `profile`: ini untuk profil performansi yang akan segera
+dijelaskan.
+
+ - `warning`: ini untuk pesan peringatan.
+
+ - `error`: ini untuk pesan kesalahan fatal.
+
+Pengiriman Pesan
+----------------
+
+Pesan yang dicatat menggunakan [Yii::log] or [Yii::trace] dipelihara dalam memori. Kita
+biasanya harus menampilkannya dalam jendela browser, atau menyimpannya dalam beberapa
+media penyimpan persisten seperti file, email. Ini disebut *mengirimkan
+pesan*, misalnya mengirimkan pesan ke tujuan yang berbeda.
+
+Dalam Yii, pengiriman pesan diatur oleh komponen aplikasi [CLogRouter].
+Ia mengatur satu set apa yang disebut *rute log*. Setiap rute log
+mewakili satu tujuan log. Pesan yang dikirimkan bersamaan dengan rute log
+bisa disaring berdasarkan pada tingkat dan kategorinya.
+
+Untuk menggunakan pengiriman pesan, kita harus menginstalasi dan mengaktifkan komponen
+aplikasi [CLogRouter]. Kita juga harus mengkonfigurasi properti
+[routes|CLogRouter::routes] dengan rute log yang kita inginkan. Berikut ini
+memperlihatkan contoh [konfigurasi
+aplikasi](/doc/guide/basics.application#application-configuration) yang dibutuhkan:
+
+~~~
+[php]
+array(
+ ......
+ 'preload'=>array('log'),
+ 'components'=>array(
+ ......
+ 'log'=>array(
+ 'class'=>'CLogRouter',
+ 'routes'=>array(
+ array(
+ 'class'=>'CFileLogRoute',
+ 'levels'=>'trace, info',
+ 'categories'=>'system.*',
+ ),
+ array(
+ 'class'=>'CEmailLogRoute',
+ 'levels'=>'error, warning',
+ 'emails'=>'admin@example.com',
+ ),
+ ),
+ ),
+ ),
+)
+~~~
+
+Dalam contoh di atas, kita memiliki dua rute log. Rute pertama adalah
+[CFileLogRoute] yang menyimpan pesan dalam sebuah file di bawah direktori
+runtime aplikasi. Hanya pesan-pesan yang tingkatnya adalah `trace` atau `info` dan
+kategorinya dimulai dengan `system.` yang disimpan. Rute kedua adalah
+[CEmailLogRoute] yang mengirimkan pesan ke alamat email yang sudah ditetapkan.
+Hanya pesan-pesan yang tingkatnya `error` atau `warning` yang dikirimkan.
+
+Rute log berikut tersedia dalam Yii:
+
+ - [CDbLogRoute]: menyimpan pesan dalam tabel database.
+ - [CEmailLogRoute]: mengirimkan pesan ke alamat email yang ditetapkan.
+ - [CFileLogRoute]: menyimpan pesan dalam sebuah file di bawah direktori runtime aplikasi.
+ - [CWebLogRoute]: menampilkan pesan diakhir halaman Web saat ini.
+ - [CProfileLogRoute]: menampilkan pesan profil di akhir halaman Web saat ini.
+
+> Info: Pengiriman pesan terjadi di akhir siklus permintaan saat ini
+saat event [onEndRequest|CApplication::onEndRequest] dimunculkan. Untuk mengakhiri
+pemrosesan permintaan saat ini secara eksplisit, panggil [CApplication::end()] daripada
+`die()` atau `exit()`, karena [CApplication::end()] akan memunculkan event
+[onEndRequest|CApplication::onEndRequest] dan pesan bisa dicatat
+dengan benar.
+
+### Penyaringan Pesan
+
+Seperti yang sudah disebutkan, pesan bisa disaring berdasarkan tingkat dan kategorinya
+sebelum mengirimkan rute log. Ini dikerjakan dengan menyetel
+properti [levels|CLogRoute::levels] dan [categories|CLogRoute::categories]
+pada rute log terkait. Multipel tingkat atau kategori
+harus diakhiri dengan koma.
+
+Karena kategori pesan dalam bentuk `xxx.yyy.zzz`, kita bisa memperlakukannya
+sebagai hirarki kategori. Bahkan, kita katakan `xxx` adalah leluhur
+`xxx.yyy` yang merupakan leluhur `xxx.yyy.zzz`. Selanjutnya kita bisa menggunakan
+`xxx.*` untuk mewakili kategori `xxx` dan semua anak dan cucu
+kategori.
+
+Pengukuran Performansi
+----------------------
+
+Pengukuran performansu adalah jenis pencatatan pesan khusus. Pengukuran
+performansi bisa dipakai guna mengukur waktu yang dibutuhkan untuk blok kode
+yang ditetapkan dan mencari tahu hambatan apa pada performansi.
+
+Untuk menggunakan pengukuran performansi, kita harus mengidentifikasi blok kode
+yang akan diukur. Kita tandai awal dan akhir setiap blok kode dengan menyisipkan
+metode berikut:
+
+~~~
+[php]
+Yii::beginProfile('blockID');
+...blok kode sedang diukur...
+Yii::endProfile('blockID');
+~~~
+
+di mana `blockID` adalah ID yang secara unik mengidentifikasi blok kode.
+
+Catatan, blok kode harus diulang dengan benar. Yakni, blok kode tidak bisa
+berseberangan dengan yang lain. Ia harus dalam tingkat paralel atau dikurung
+seluruhnya oleh blok kode lain.
+
+Untuk memperlihatkan hasil pengukuran, kita harus menginstalasi komponen aplikasi [CLogRouter]
+dengan rute log [CProfileLogRoute]. Ini sama seperti yang kita lakukan dengan
+pengiriman pesan biasa. Rute [CProfileLogRoute] akan menampilkan hasil
+pengukuran di akhir halaman saat ini.
+
+<div class="revision">$Id: topics.logging.txt 922 2009-04-05 21:36:33Z qiang.xue $</div>
View
160 docs/guide/id/topics.performance.txt
@@ -0,0 +1,160 @@
+Penyesuaian Performansi
+=======================
+
+Performansi aplikasi Web dipengaruhi oleh banyak faktor. Akses database,
+operasi sistem file, bandwidth jaringan adalah faktor pengaruh potensial.
+Yii sudah mencoba di setiap aspek guna mengurangi akibat performansi
+yang disebabkan oleh framework. Akan tetapi, masih ada banyak tempat dalam
+aplikasi pengguna yang bisa ditingkatkan untuk mempercepat performansi.
+
+Menghidupkan Ekstensi APC
+-------------------------
+
+Menghidupkan [ekstensi
+PHP APC](http://www.php.net/manual/en/book.apc.php) barangkali merupakan
+cara termudah untuk meningkatkan performansi aplikasi secara keseluruhan.
+ekstensi men-cache dan mengoptimasi kode menengah PHP dan menghindari waktu
+yang dipakai dalam penguraian naskah PHP untuk setiap permintaan yang masuk.
+
+Mematikan Mode Debug
+--------------------
+
+Mematikan mode debug adalah cara mudah lain guna meningkatkan performansi.
+Aplikasi Yii yang berjalan dalam mode debug jika konstan `YII_DEBUG` didefinisikan sebagai
+true. Mode debug berguna selama tahap pengembangan, tapi akan mempengaruhi
+performansi karena beberapa komponen menimbulkan banyak kode ekstra dalam debug mode.
+Sebagai contoh, pencatat pesan bisa merekam informasi debug tambahan untuk
+setiap pesan yang sedang dicatat.
+
+Menggunakan `yiilite.php`
+-------------------------
+
+Saat [ekstensi PHP APC](http://www.php.net/manual/en/book.apc.php) dihidupkan,
+kita dapat mengganti `yii.php` dengan file bootstrap Yii yang berbeda bernama
+`yiilite.php` untuk lebih meningkatkan performansi aplikasi berbasis-Yii.
+
+File `yiilite.php` ada debgab setiap rilis Yii. Ini adalah hasil penggabungan
+beberapa file kelas Yii yang umumnya dipakai. Baik komentar maupun pernyataan
+trace dibuang dari file gabungan. Oleh karena itu, menggunakan
+`yiilite.php` akan mengurangi jumlah file yang disertakan dan menghindari
+eksekusi pernyataan trace.
+
+Catatan, pemakaian `yiilite.php` tanpa APC sebenarnya dapata mengurangi performansi,
+karena `yiilite.php` berisi beberapa kelas yang tidak dipakai
+dalam setiap permintaan dan akan memerlukan waktu penguraian tambahan. Juga sudah diobservasi bahwa
+pemakaian `yiilite.php` lebih lambat pada beberapa konfigurasi server, bahkan saat
+APC dihidupkan. Cara terbaik untuk menilai apakah menggunakan `yiilite.php` atau tidak
+adalah dengan menjalankan benchmark menggunakan demo `hello world` yang disertakan.
+
+Menggunakan Teknik Cache
+------------------------
+
+Seperti dijelaskan dalam seksi [Caching](/doc/guide/caching.overview), Yii
+menyediakan beberapa solusi cache yang bisa meningkatkan performansi aplikasi
+Web secara signifikan. Jika pembuatan beberapa data memerlukan waktu lama,
+kita dapat menggunakan pendekatan [cache data](/doc/guide/caching.data) untuk
+mengurangi frekuensi pembuatan data; Jika bagian halaman relatif tetap satis,
+kita bisa menggunakan pendekatan [cache
+fragmen](/doc/guide/caching.fragment) untuk mengurangi frekuensi render;
+Jika seluruh halaman relatif statis, kita dapat menggunakan pendekatan [cache
+halaman](/doc/guide/caching.page) untuk menghemat waktu render seluruh
+halaman.
+
+Jika aplikasi menggunakan [Rekaman Aktif](/doc/guide/database.ar), kita harus
+menghidupkan cache skema untuk menghemat waktu penguraian skema database.
+Ini bisa dikerjakan dengan mengkonfigurasi properti
+[CDbConnection::schemaCachingDuration] ke nilai lebih besar dari 0.
+
+Selain teknik cache tingkat aplikasi ini, kita juga bisa menggunakan solusi
+cache tingkat server untuk meingkatkan performansi aplikasi. Sebenarnya,
+[Cache APC](/doc/guide/topics.performance#enabling-apc-extension) yang kita
+jelaskan sebelumnya masuk ke kategori ini. Ada teknik server lain, seperti
+[Zend Optimizer](http://Zend.com/ZendOptimizer),
+[eAccelerator](http://eaccelerator.net/),
+[Squid](http://www.squid-cache.org/), dan banyak lagi.
+
+Optimasi Database
+-----------------
+
+Pengambilan data dari database sering menjadi hambatan utama performansi dalam
+aplikasi Web. Meskipun menggunakan caching tetap dapat mengurangi performansi,
+ini tidak sepenuhnya memecahkan masalah. Ketika database berisi data yang salah
+dan data yang di-cache tidak benar, pengambilan besar data bisa sangat lambat
+tanpa desain database dan queri yang benar.
+
+Desain indeks dengan benar dalam database. Mengindeks bisa menjadikan queri `SELECT` jauh
+lebih cepat, tapi dapat memperlambat queri `INSERT`, `UPDATE` atau `DELETE`.
+
+Untuk queri yang kompleks, direkomendasikan membuat view database daripada
+menerbitkan queri di dalam kode PHP dan meminta DBMS untuk menguraikannya
+berulang kali.
+
+Jangan berlebihan menggunakan [Rekaman Aktif](/doc/guide/database.ar). Meskipun [Rekaman
+Aktif](/doc/guide/database.ar) baik pada pemodelan data dalam gaya OOP,
+sebenarnya menurunkan performansi karena ia harus membuat satu atau beberapa
+obyek untuk mewakili setiap baris dari hasil queri. Untuk aplikasi intensif
+data, penggunaan [DAO](/doc/guide/database.dao) atau
+API database di tingkat lebih rendah bisa menjadi pilihan yang lebih baik.
+
+Terakhir, gunakan `LIMIT` dalam queri `SELECT` Anda. Ini akan menghindari
+pengambilan data berlebihan dari database dan menhabiskan alokasi memori
+untuk PHP.
+
+Memperkecil File Naskah
+-----------------------
+
+Halaman yang kompleks sering harus menyertakan banyak file eksternal JavaScript dan CSS. Karena setiap file akan menyebabkan lalu lintas tambahan ke server dan sebaliknya, kita harus memperkecil jumlah file naskah dengan menggabungnya ke dalam file agar lebih sedikit jumlahnya. Kita juga harus mempertimbangkan pengurangan ukuran setiap file naskah guna mengurangi waktu transmisi jaringan. Ada banyak piranti untuk membantu dua aspek ini.
+
+Untuk halaman yang dibuat oleh Yii, kenyataannya bahwa beberapa file naskah dirender oleh komponen yang tidak ingin kita ubah (misalnya komponen inti Yii, komponen pihak ketiga). Untuk memperkecil file naskah ini, kita memerlukan dua langkah.
+
+> Note|Catatan: Fitur `scriptMap` yang dijelaskan berikut ini sudah tersedia sejak versi 1.0.3.
+
+Pertama, kita mendeklarasikan naskah yang diperkecil dengan mengkonfigurasi properti [scriptMap|CClientScript::scriptMap] pada komponen aplikasi [clientScript|CWebApplication::clientScript]. Ini bisa dikerjakan baik dalam konfigurasi aplikasi ataupun dalam kode. Sebagai contoh,
+
+~~~
+[php]
+$cs=Yii::app()->clientScript;
+$cs->scriptMap=array(
+ 'jquery.js'=>'/js/all.js',
+ 'jquery.ajaxqueue.js'=>'/js/all.js',
+ 'jquery.metadata.js'=>'/js/all.js',
+ ......
+);
+~~~
+
+Apa yang dilakukan kode di atas adalah bahwa ia memetakan file-file JavaScript ke URL `/js/all.js`. Jika ada file JavaScript harus disertakan oleh beberapa komponen, Yii akan menyertakan URL (sekali) daripada file naskah secara individual.
+
+Kedua, kita perlu menggunakan beberapa piranti untuk menggabung (dan mungkin memadatkan) file JavaScript ke dalam satu file dan menyimpannya sebagai `js/all.js`.
+
+Trik yang sama juga berlaku untuk file CSS.
+
+Kita juga dapat meningkatkan kecepatan pengambilan halaman dengan bantuan [Google AJAX Libraries API](http://code.google.com/apis/ajaxlibs/). Sebagai contoh, kita dapata menyertakan `jquery.js` dari server Google daripada server kita sendiri. Untuk melakukannya, pertama kita mengkonfigurasi `scriptMap` sebagai berikut,
+
+~~~
+[php]
+$cs=Yii::app()->clientScript;
+$cs->scriptMap=array(
+ 'jquery.js'=>false,
+ 'jquery.ajaxqueue.js'=>false,
+ 'jquery.metadata.js'=>false,
+ ......
+);
+~~~
+
+Dengan memetakan file naskah ini menjadi false, kita melarang Yii untuk membuat kode penyertaan file-file ini. Sebaliknya, kita menulis kode berikut dalam halaman kita u8ntuk secara eksplisit menyertakan file naskah dari Google,
+
+~~~
+[php]
+<head>
+<?php echo CGoogleApi::bootstrap(); ?>
+
+<?php echo CHtml::script(
+ CGoogleApi::load('jquery','1.3.2') . "\n" .
+ CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
+ CGoogleApi::load('jquery.metadata.js')
+); ?>
+......
+</head>
+~~~
+
+<div class="revision">$Id: topics.performance.txt 759 2009-02-26 21:23:53Z qiang.xue $</div>
View
181 docs/guide/id/topics.prado.txt
@@ -0,0 +1,181 @@
+Menggunakan Sintaks Template Alternatif
+=======================================
+
+Yii mengijinkan pengembang untuk menggunakan sintaks template favorit sendiri (misalnya
+Prado, Smarty) untuk menulis kontroler atau tampilan widget. Ini dilakukan dengan
+menulis dan menginstalasi komponen aplikasi [viewRenderer|CWebApplication::viewRenderer].
+Pembuat tampilan mengintersepsi penyertaan
+[CBaseController::renderFile], sesuai dengan file tampilan dengan sintaks
+template yang dikustomisasi, dan menampilkan hasil kompilasi.
+
+> Info: Direkomendasikan untuk menggunakan sintaks template dikustomisasi hanya saat
+menulis tampilan yang jarang dipakai ulang. Jika tidak, orang yang menggunakan
+kembali tampilan akan dipaksa untuk memakai sintaks template dikustomisasi
+yang sama dalam aplikasinya.
+
+Berikutnya kami perkenalkan bagaimana menggunakan [CPradoViewRenderer], pembuat
+tampilan yang mengijinkan para pengembang untuk memakai sintaks template mirip dengan
+[Prado framework](http://www.pradosoft.com/). Bagi orang yang ingin mengembangkan
+pembuat tampilan sendiri, [CPradoViewRenderer] adalah referensi yang baik.
+
+Menggunakan `CPradoViewRenderer`
+--------------------------
+
+Untuk menggunakan [CPradoViewRenderer], kita cukup mengkonfigurasi aplikasi
+seperti berikut:
+
+~~~
+[php]
+return array(
+ 'components'=>array(
+ ......,
+ 'viewRenderer'=>array(
+ 'class'=>'CPradoViewRenderer',
+ ),
+ ),
+);
+~~~
+
+Distandarkan, [CPradoViewRenderer] akan mengkompilasi file sumber tampilan dan
+menyimpan file hasil PHP di bawah direktori
+[runtime](/doc/guide/basics.convention#directory). Hanya saat file
+sumber tampilan diubah, file PHP akan dibuat ulang.
+Oleh karenanya, menggunakan [CPradoViewRenderer] hanya menyebabkan sedikit degradasi
+performansi.
+
+> Tip: Karena [CPradoViewRenderer] memperkenalkan beberapa tag template baru
+agar penulisan tampilan lebih mudah dan lebih cepat, Anda masih bisa menulis kode PHP seperti
+biasa dalam sumber tampilan.
+
+Berikutnya kami perkenalkan tag template yang didukung oleh
+[CPradoViewRenderer].
+
+### Tag PHP Pendek
+
+Tag PHP pendek adalah jalan pintas untuk menulis ekspresi dan pernyataan PHP dalam sebuah
+tampilan. Tag ekspresi `<%= expression %>` diterjemahkan ke dalam
+`<?php echo expression ?>`; sementara tag pernyataan `<% statement
+%>` menjadi `<?php statement ?>`. Sebagai contoh,
+
+~~~
+[php]
+<%= CHtml::textField($name,'value'); %>
+<% foreach($models as $model): %>
+~~~
+
+diubah menjadi
+
+~~~
+[php]
+<?php echo CHtml::textField($name,'value'); ?>
+<?php foreach($models as $model): ?>
+~~~
+
+### Tag Komponen
+
+Tag komponen dipakai untuk menyisipkan
+[widget](/doc/guide/basics.view#widget) dalam tampilan. Ia menggunakan sintaks
+berikut:
+
+~~~
+[php]
+<com:WidgetClass property1=value1 property2=value2 ...>
+ // konten untuk widget
+</com:WidgetClass>
+
+// widget tanpa konten
+<com:WidgetClass property1=value1 property2=value2 .../>
+~~~
+
+di mana `WidgetClass` menetapkan nama kelas widget atau kelas [alias
+path](/doc/guide/basics.namespace), dan nilai awal properti bisa berupa
+string bertanda kutip atau ekspresi PHP berkurung di dalam pasangan kurung kurawal.
+Sebagai contoh,
+
+~~~
+[php]
+<com:CCaptcha captchaAction="captcha" showRefreshButton={false} />
+~~~
+
+akan diubah menjadi
+
+~~~
+[php]
+<?php $this->widget('CCaptcha', array(
+ 'captchaAction'=>'captcha',
+ 'showRefreshButton'=>false)); ?>
+~~~
+
+> Note|Catatan: Nilai `showRefreshButton` ditetapkan sebagai `{false}`
+daripada `"false"` karena "false" berarti string daripada
+boolean.
+
+### Tag Cache
+
+Tag cache adalah jalan pintas menggunakan [cache
+fragmen](/doc/guide/caching.fragment). Sintaksnya seperti berikut,
+
+~~~
+[php]
+<cache:fragmentID property1=value1 property2=value2 ...>
+ // content being cached
+</cache:fragmentID >
+~~~
+
+di mana `fragmentID` harus berupa pembeda yang secara unik mengidentifikasi
+konten yang sedang di-cache, dan pasangan properti-nilai dipakai untuk mengkonfigurasi
+cache fragmen. Sebagai contoh,
+
+~~~
+[php]