Menulis kontrol baru sering diinginkan oleh para pemrogram tingkat lanjut, karena mereka ingin menggunakan ulang kode yang mereka tulis untuk menghadapi penyajian yang komples serta interaksi pengguna.
Secara umum, ada dua cara penulisan kontrol baru: komposisi kontrol yang sudah ada dan memperluas kontrol yang sudah ada. Semuanya memerlukan kontrol baru tersebut berasal dari TControl atau kelas anaknya.
Komposisi adalah cara termudah membuat kontrol baru. Ia melibatkan terutama penurunan kontrol yang sudah ada, mengkonfigurasinya dan menjadikannya unsur komponen. Properti dari unsur komponen diperlihatkan melalui subproperti.
Seseorang dapat menciptakan sebuah kontrol baru dalam dua cara. Pertama adalah memperluas TCompositeControl dan mengganti metode TControl::createChildControls(). Kedua adalah memperluas TTemplateControl (atau kelas anaknya) dan menulis template kontrol. Yang terakhir lebih mudah digunakan dan bisa mengatur tata letak unsur komponen lebih intuitif, sementara pembentuk lebih efisien karena ia tidak perlu menguraikan template.
Sebagai contoh, kami memperlihatkan bagaimana untuk membuat kotak teks berlabel yang disebut LabeledTextBox menggunakan dua pendekatan di atas. Kotak teks berlabel menampilkan label disamping kotak teks. Kami ingin menggunakan ulang TLabel dan TTextBox yang disediakan PRADO untuk menyelesaikan tugas ini.
Kita memerlukan dua file: sebuah file kelas kontrol bernama LabeledTextBox.php dan file template kontrol bernama LabeledTextBox.tpl. Keduanya harus berada di bawah direktori yang sama.
Seperti membuat halaman PRADO, kita dapat dengan mudah menuliskan konten dalam file template kontrol.
Template di atas menetapkan kontrol TLabel bernama Label dan kontrol TTextBox bernama TextBox. Kita ingin memperlihatkan kedua kontrol ini. Ini bisa dikerjakan dengan mendefinisikan properti untuk masing-masing kontrol dalam file kelas LabeledTextBox. Sebagai contoh, kita dapat mendefinisikan proper Label seperti berikut,
Dalam contoh di atas, metode memanggil ensureChildControls() memastikan bahwa kontrol label dan kotak teks sudah dibuat (dari template) ketika properti Label diakses. Properti TextBox dapat diimplementasikan dengan cara yang sama.
Untuk kontrol gabungan sesederhana LabeledTextBox, lebih baik membuatnya dengan memperluas TCompositeControl dan mengganti metode createChildControls(), karena ia tidak menggunakan template dan menghemat waktu penguraian template.
Kode lengkap untuk LabeledTextBox ditampilkan sebagai berikut,
Untuk menggunakan kontrol LabeledTextBox, pertama kita perlu menyertakan file kelas terkait. Kemudian dalam template halaman, kita dapat menuliskan baris seperti berikut,
Dalam contoh di atas, Label.Text adalah subproperti dari LabeledTextBox, yang merujuk ke properti Text dari properti Label. Untuk lebih jelasnya atas pemakaian LabeledTextBox, lihat contoh online di atas.
Memperluas kontrol yang sudah ada sama seperti penurunan kelas konvensional. Ia membolehkan para pengembang untuk mengkustomisasi kelas kontrol yang sudah ada dengan mengganti propertinya, metodenya, event, atau membuat yang baru.
Kesulitan tugas tergantung pada seberapa banyak kelas yang sudah ada dikustomisasi. Sebagai contoh, tugas sederhana bisa mengkustomisasi kontrol TLabel, agar ia menampilkan label merah sercara standarnya. Ini akan melibatkan setelan properti ForeColor ke "red" dalam konstruktornya. Tugas yang sulit adalah membuat kontrol yang menyediakan fungsional inovatif secara lengkap. Biasanya, ini memerlukan perluasan kontrol dari kelas kontrol "tingkat rendah", seperti misalnya TControl atau TWebControl.
Dalam bagian ini, sebagian besar kami memperkenalkan basis kelas kontrol TControl dan TWebControl, memperlihatkan bagaimana mereka bisa dikustomisasi. Kami juga memperkenalkan bagaimana untuk menulis kontrol dengan fungsionalitas khusus, seperti mengambil data post, memunculkan data post dan penyatuan data dengan sumber data.
TControl adalah basis kelas dari semua kelas kontrol. Dua metode adalah yang paling penting untuk kelas kontrol turunannya:
TWebControl dipakai terutama sebagai basis kelas untuk kontrol yang menyajikan elemen HTML. Ia menyediakan satu set properti yang umum diantara elemen HTML. Ia memisahkan TControl::render() ke dalam metode berikut yang lebih cocok untuk menyajikan elemen HTML:
Ketika menyajikan tag HTML pembuka, TWebControl memanggil getTagName() untuk mendapatkan nama tag. kelas turunannya dapat mengganti metode ini guna menyajikan nama tag yang berbeda.
Jika sebuah kontrol ingin merespon event sisi-klien dan menterjemahkannya ke dalam event sisi server (disebut event postback), seperti TButton, ia harus mengimplementasikan antarmuka IPostBackEventHandler.
Jika kontrol ingin bisa mengambil data post, seperti TTextBox, ia harus mengimplementasikan antarmuka IPostBackDataHandler.
Jika kontrol ingin mendapatkan data dari beberapa sumber data eksternal, ia harus memperluas TDataBoundControl. TDataBoundControl mengimplementasikan properti dasar yang diperlukan untuk mempopulasi data melalui databinding. Kenyataanya, kontrol seperti TListControl, TRepeater adalah TDataGrid semua berasal darinya.