From 151b2f7d102a5988b63255d27c9ad78202c16355 Mon Sep 17 00:00:00 2001
From: Fabio Bas
+
In the blog demo project, we need to create two Active Record classes, UserRecord and PostRecord, to represent data records in the users and posts tables, respectively. Active Record classes must extend from the base class ActiveRecord, and must define property names that matches with the field names of the corresponding table.
-+
To better organize our directories, we create a new directory protected/database to hold the class files. We also modify our application configuration by inserting the following lines. It is equivalent to adding the directory protected/database to PHP include_path, which allows us to use the classes without explicitly including them.
-+
At the prompt, enter the following two commands to create UserRecord and PostRecord classes:
@@ -135,7 +135,7 @@ At the prompt, enter the following two commands to create UserRecord an >> generate posts Application.database.PostRecord+
Here we used the namespace format again to specify the classes to be created. The path Application.database.UserRecord indicates that we want the UserRecord class file to be protected/database/UserRecord.php.
diff --git a/demos/quickstart/protected/pages/GettingStarted/Installation.page b/demos/quickstart/protected/pages/GettingStarted/Installation.page index 956f53c2..f59eed70 100755 --- a/demos/quickstart/protected/pages/GettingStarted/Installation.page +++ b/demos/quickstart/protected/pages/GettingStarted/Installation.page @@ -13,7 +13,7 @@ The minimum requirement by PRADO is that the Web server support PHP 5.3.3. PRADO PRADO can be installed as a standalone package or using composer@@ -17,7 +17,7 @@ We summarize in the following the most significant changes in v3.3 to help devel
The number one rule on writing jQuery javascript code is to read the jQuery documentation. Porting code from Prototype to jQuery needs some effort: here's a basic lookup table to port existing code:
@@ -168,7 +168,7 @@ The number one rule on writing jQuery javascript code is to read the PRADO specific code changesPRADO Porting prado to jQuery some method signatures has changed, or have been adapted: @@ -207,7 +207,7 @@ Porting prado to jQuery some method signatures has changed, or have been adapted -
Some Prado controls were based on specific extensions of the Prototype + Scriptaculous javascript framework, and they have been deprecated now that jQuery has become the primary js framework in PRADO.
PRADO 3.3 introduces jQuery-based counterpart for these controls and encourage everyone to port their code to the new controls, but the old controls are still supposed to work with some minor annoyance:
diff --git a/demos/quickstart/protected/pages/GettingStarted/Wsat.page b/demos/quickstart/protected/pages/GettingStarted/Wsat.page
index 3d07e6f2..a76ca163 100644
--- a/demos/quickstart/protected/pages/GettingStarted/Wsat.page
+++ b/demos/quickstart/protected/pages/GettingStarted/Wsat.page
@@ -1,5 +1,5 @@
Web Site Administration Tool (WSAT) is a development tool which allows you to perform several
tedious tasks of a PRADO project in a GUI fashion. Its inspired in both Asp.Net - Web Site Administration Tool and Yii's Gii.
@@ -12,12 +12,12 @@
To use WSAT, you need to add in your project configuration file: application.xml,
in the services section the wsat service like follows:
-
Then you are ready to go to: http://localhost/yoursite/index.php?wsat=TWsatLogin and doing so you should see
the following page:
@@ -36,7 +36,7 @@
is part of a basic security system to avoid undesirable persons to use this tool.
In order to generate AR classes you need to go to: http://localhost/divermania/index.php?wsat=TWsatGenerateAR
by clicking the proper links in the welcome page. Then you should see the following page:
--
cgit v1.2.3
From 654a9cae43358c7eecf3b522e9876aa7815e2453 Mon Sep 17 00:00:00 2001
From: Fabio Bas
-We have created a default page Home.page using the PRADO command line tool. The page is relatively static because it does not containt dynamic content. In this section, we will create an interactive page named Contact.
+We have created a default page Home.page using the PRADO command line tool. The page is relatively static because it does not containt dynamic content. In this section, we will create an interactive page named Contact.
@@ -17,7 +17,7 @@ To create the Contact page, we need two files under the pages
-We use template to organize the presentational layout of the feedback form. In the template, we use textboxes to collect user's name, email and feedback. And we use validators to ensure that the user provides all these information before submitting the feedback form. The whole template is as follows,
+We use template to organize the presentational layout of the feedback form. In the template, we use textboxes to collect user's name, email and feedback. And we use validators to ensure that the user provides all these information before submitting the feedback form. The whole template is as follows,
-As we can see that the template looks very similar to a normal HTML page. The main difference is that the template contains a few <com:> tags. Each <com:> tag refers to a control whose properties are being initialized with name-value pairs in the tag. For example, the <com:TButton> refers to the TButton control which displays a button that users can click on to submit the feedback form. For complete template syntax, please refer to the Quickstart Tutorial.
+As we can see that the template looks very similar to a normal HTML page. The main difference is that the template contains a few <com:> tags. Each <com:> tag refers to a control whose properties are being initialized with name-value pairs in the tag. For example, the <com:TButton> refers to the TButton control which displays a button that users can click on to submit the feedback form. For complete template syntax, please refer to the Quickstart Tutorial.
@@ -117,10 +117,10 @@ Below we summarize the controls that are used in the page template:
-We start by setting up the directories and the files that are required by most PRADO applications. We use the PRADO command line tool to achieve this goal.
+We start by setting up the directories and the files that are required by most PRADO applications. We use the PRADO command line tool to achieve this goal.
@@ -11,7 +11,7 @@ Assume blog is the name of the directory to hold the whole blog system,
-Under the blog directory, we run the PRADO command line tool with the following command (replace path/to with the actual path to the PRADO framework installation):
+Under the blog directory, we run the PRADO command line tool with the following command (replace path/to with the actual path to the PRADO framework installation):
-The optional XML file application.xml contains the application configuration. Its main purpose is to customize in a configurable fashion the application instance created in the entry script. For example, we may enable the logging feature for our blog system with the help of application configuration.
+The optional XML file application.xml contains the application configuration. Its main purpose is to customize in a configurable fashion the application instance created in the entry script. For example, we may enable the logging feature for our blog system with the help of application configuration.
@@ -71,11 +71,11 @@ The file application.xml we have now is nearly empty. In fact, we may s
-The homepage (also called default page) Home.page is the only page created by the PRADO command line tool. It is the content in this file that shows up in the browser when visiting the URL http://hostname/blog/index.php.
+The homepage (also called default page) Home.page is the only page created by the PRADO command line tool. It is the content in this file that shows up in the browser when visiting the URL http://hostname/blog/index.php.
-Content in the file Home.page uses the PRADO template format, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in Home.page we see the following pure HTML content:
+Content in the file Home.page uses the PRADO template format, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in Home.page we see the following pure HTML content:
-The pages directory is the root page directory holding all pages in a PRADO application. It bears an analogy to the htdocs directory for the Apache httpd Web server.
+The pages directory is the root page directory holding all pages in a PRADO application. It bears an analogy to the htdocs directory for the Apache httpd Web server.
diff --git a/demos/blog-tutorial/protected/pages/Day1/ShareLayout.page b/demos/blog-tutorial/protected/pages/Day1/ShareLayout.page
index 6115ef22..a8d4b5bd 100755
--- a/demos/blog-tutorial/protected/pages/Day1/ShareLayout.page
+++ b/demos/blog-tutorial/protected/pages/Day1/ShareLayout.page
@@ -3,11 +3,11 @@
-In this section, we will use the master/content feature of PRADO to share common layout among pages. Common layout refers to the area that is the same or largely the same for a set of pages. For example, in our blog system, all pages will share the same header, footer and side-bar containing shortcut links. A straightforward implementation is to repeat the common layout in every page. However, this approach is prone to error and is hard to maintain. The master/content feature allows us to treat the common layout as a control which centralizes the logic and presentation of the common layout for every page.
+In this section, we will use the master/content feature of PRADO to share common layout among pages. Common layout refers to the area that is the same or largely the same for a set of pages. For example, in our blog system, all pages will share the same header, footer and side-bar containing shortcut links. A straightforward implementation is to repeat the common layout in every page. However, this approach is prone to error and is hard to maintain. The master/content feature allows us to treat the common layout as a control which centralizes the logic and presentation of the common layout for every page.
@@ -69,7 +69,7 @@ class MainLayout extends TTemplateControl
-Besides <com:TContent>, we also see another new tag <%@ %> in the above, which is called template control tag. It contains name-value pairs which are used to initialize the corresponding properties for the template owner, namely, the Contact page.
+Besides <com:TContent>, we also see another new tag <%@ %> in the above, which is called template control tag. It contains name-value pairs which are used to initialize the corresponding properties for the template owner, namely, the Contact page.
-By setting MasterClass property as Application.layouts.MainLayout, we instruct the Contact page to use MainLayout as its master. Here, we are using the namespace format to refer to the MainLayout class.
+By setting MasterClass property as Application.layouts.MainLayout, we instruct the Contact page to use MainLayout as its master. Here, we are using the namespace format to refer to the MainLayout class.
-We can also specify master in application configuration or page configuration. The following shows the updated application configuration for our blog system:
+We can also specify master in application configuration or page configuration. The following shows the updated application configuration for our blog system:
-Nous avons créé une page par défaut Home.page en utilisant les outils en ligne de commande de PRADO. Cette page est relativement statique parce qu'elle ne contient que du contenu HTML. Dans cette session, nous allons créer une page dynamique dénommée Contact.
-
-Le but de cette page est de collecter les retours d'informations des utilisateurs Web concernant notre outil de blog. Pour atteindre ce but, nous envisageons d'utiliser un formulaire qui sera à remplir. Dans ce formulaire, nous demanderons le nom de l'utilisateur, son adresse email et son commentaire. Après que le formulaire ai été rempli et envoyé, un email avec le commentaire sera envoyé à l'administrateur.
-
-Pour créer la page Contact, nous avons besoin de 2 fichiers dans le dossier pages : le fichier de gabarit Contact.page et le fichier de classe PHP Contact.PHP.
-
-Nous allons premièrement créer le fichier gabarit de la page Contact.
-
-Nous utilisons un fichier gabarit pour organiser la présentation de notre formulaire. Dans notre gabarit, nous utilisons des champs de saisie pour collecter le nom de l'utilisateur, son email et son commentaire. D'autre part, nous utilisons des validateurs pour nous assurer que l'utilisateur a bien fourni les éléments avant d'envoyer le formulaire. Le contenu complet du gabarit est le suivant,
- Veuillez remplir le formulaire suivant pour me laisser vos impressions au sujet de mon blog. Merci !
-Comme vous pouvez le voir, un fichier gabarit ressemble énormément à un fichier HTML classique. La principale différence concerne le fichier gabarit qui contient quelques balises <com:>. Chaque balise <com:> fait référence à un contrôle dont les propriétés sont initialisées grâce aux paires nom-valeur de la balise. Par exemple, la balise <com:TButton> fait référence au contrôle TButton qui affiche un bouton permettant à l'utilisateur de soumettre le formulaire. Pour une syntaxe complète, veuillez vous référer au Tutoriel de démarrage rapide.
-
-
-Avant le contrôle TTextBox, le gabarit utilise aussi plusieurs validateurs qui permettent de s'assurer que les données saisies sont bien conformes à notre attente. Par exemple, pour nous assurer que l'adresse email est valide, nous utilisons les deux validateurs suivants,
-
-Ci-dessous, un résumé des contrôles utilisés dans le gabarit :
-
-Nous allons maintenant créer le fichier de classe PHP Contact.PHP. Ce fichier est nécessaire parce que nous devons agir après la soumission du formulaire.
-
-Notez les lignes dans le fichier gabarit. Elles indiquent que lorsque l'utilisateur soumet le formulaire, la méthode submitButtonClicked() doit être appelé. Ici, OnClick est le nom de l'évènement et la méthode correspondante doit être défini dans le fichier de classe PHP.
-
-Nous écrirons donc le fichier de classe suivant :
-
-Le code précédent est largement explicite. En fait, nous avons juste montré le principe d'un gestionnaire d'évènement. Dans le gestionnaire d'évènement submitButtonClicked(), nous récupérons les éléments saisies par l'utilisateur. Par exemple, $this->Name->Text retourne la valeur de la propriété Text du contrôle Name qui est un contrôle permettant la saisie du nom de l'utilisateur.
-
-Notre nouvelle page Contact peut être testée en naviguant à l'URL http://hostname/blog/index.PHP?page=Contact. Si vous cliquez sur le bouton "envoyer" sans avoir saisi de données, vous verrez apparaitre des messages d'erreurs à côté des champs de saisie. Si vous entrez toutes les informations nécessaires, la méthode mailFeedback() sera appelée.
-
-Une amélioration possible à notre page serait d'afficher un message de confirmation après que l'utilisateur ai envoyé le formulaire. Il serait aussi envisageable de rediriger le navigateur vers une adresse différente si toutes les informations ont été saisies correctement. Nous laisserons aux lecteurs la mise en place de ces fonctionnalités.
-
-Nous commencerons par la mise en place de la structure des dossiers et fichiers requis par la plupart des applications développées avec PRADO. Nous allons utiliser les outils en ligne de commande pour atteindre ce but.
- Nous partons du principe que le nom du dossier qui contiendra l'application est blog et que l'URL qui permet d'accéder à ce dossier est : http://hostname/blog/ (remplacer hostname par le nom de votre serveur).
- A l'intérieur du dossier blog, nous utilisons les outils en ligne de commande avec comme commande (remplacer path/to par le chemin d'installation du framework PRADO):
-
-L'utilisation de cette commande permet de créer la structure de dossier et fichiers suivante:
-
-Nous avons dorénavant, un squellette d'application PRADO accessible par l'URL http://hostname/blog/index.php et qui affiche une page contenant le message "Welcome to PRADO".
-
-Il est de notre intérêt d'en apprendre plus à propos des dossiers et fichiers que nous venons de créer.
-
-Toutes les applications PRADO ont un point d'entrée, habituellement nommé index.php. Dans la plupart des cas, c'est le seul script qui est directement accessible par les utilisateurs. Cela réduit les risques que les utilisateurs puissent lancer des scripts serveur auquels ils ne devraient pas avoir accès.
-
-Le but principal de ce script est d'initialiser l'environnement PRADO et de gérer toutes les requêtes utilisateurs. Ce script contient habituellement les commandes PHP suivantes,
-
-Le fichier optionnel XML application.xml contient la configuration de l'application. Son but principal est de permettre de configurer l'application qui sera créée par le script principal. Par exemple, nous pouvons activer le système de log pour notre application par le biais du fichier de configuration.
-
-Le fichier application.xml est pour le moment presque vide. De ce fait, nous pouvons le supprimer parce que l'application n'utilise pour le moment que des fonctionnalités de base. Au fur et à mesure que nous avancerons, nous ferons référence régulièrement au fichier application.xml et vous expliquerons comment configurer l'application.
-
-La page d'accueil Home.page (aussi dénommée page par défaut) est la seule page créée par les outils en ligne de commande de PRADO. C'est le contenu de ce fichier qui est affiché quand l'utilisateur navigue à l'adresse http://hostname/blog/index.php.
-
-Le contenu du fichier Home.page respecte le format de template qui pour la plupart du temps est du code HTML agrémenté de quelques balises spécifiques à PRADO. Par exemple, dans Home.page nous voyons du code HTML pur :
-
-Le dossier protected, aussi connu sous le nom chemin de base de l'application, est le dossier racine qui contient les pages, les gabarits, les fichiers de configuration, les données, etc. Le nom protected indique que ce dossier doit être masqué des personnes qui consultent le site, ceci parce que les fichiers dans ce dossier contiennent la plupart du temps des données sensibles.
-
-Les différents serveurs Web ont différents moyens de "protéger" un dossier. Pour Apache, le moyen le plus simple est de créer dans le dossier un fichier nommé .htaccess avec le contenu deny from all.
-
-Les dossiers protected/runtime et assets sont deux dossiers qui doivent avoir l'autorisation "en écriture" pour le serveur Web. Le dossier runtime contient des données sensibles (ie: fichier de configuration déjà analysé) générées à l'exécution de PRADO tandis que le dossier assets contient les ressources qui doivent être publiques (ie: les images, les fichiers javascript).
-
-The pages directory is the root page directory holding all pages in a PRADO application. It bears an analogy to the htdocs directory for the Apache httpd Web server.
-
-Nous avons déjà vu comment accéder la page d'accueil. Pour accéder à n'importe quelle page situé dans le dossier pages, il faut utiliser l'URL suivante http://hostname/blog/index.php?page=chemin.vers.NomdelaPage. En fonction de cette URL, PRADO recherche une page dénommée NomdelaPage dans le dossier pages/chemin/vers. L'URL que nous avons utilisée précédemment pour accéder à la page d'accueil correspond à http://hostname/blog/index.php?page=Home.
-
-
-
-Il est tout à fait possible de personnaliser le nom et l'emplacement des fichiers et dossiers décrit précédemment.
-
-Par exemple, pour améliorer la sécurité, certains pourraient désirer déplacer la totalité du dossier protected à un emplacement inaccessible par le Web. Pour faire cela, utilisez la commande PHP suivante pour initialiser l'instance de l'application PRADO dans le script principal :
-
-Pour changer l'emplacement du dossier racine des pages et le nom de la page d'accueil, il est possible de modifier le fichier de configuration application.xml de cette manière :
-
-En avançant dans l'apprentissage de PRADO, vous verrez que PRADO est très souple et qu'il est possible de personnaliser la plupart des comportements de base. Nous décrirons d'autres techniques au fur et à mesure de ce tutoriel.
-
-Dans cette section, nous allons utiliser la fonctionnalité gabarit principal/contenu de PRADO pour partager une mise en page commune sur tout notre site. Les mises en page communes font référence aux parties qui sont identiques ou presque pour un ensemble de pages. Par exemple, dans notre outil de blog, toutes les pages partagent le même entête, pied de page et la même barre latérale contenant les liens. La solution la plus radicale est de répéter sur chaque page les parties communes. Par contre, cette approche est une source d'erreurs et difficile à maintenir. La fonctionnalité gabarit principal/contenu nous permets de traiter les parties communes comme un contrôle qui centralise la logique applicative et la présentation de chaque page.
-
-Nous allons maintenant créer le gabarit principal MainLayout qui représente les parties communes partagées par toutes nos pages. Le contrôle MainLayout est un contrôle de gabarit qui hérite de TTemplateControl. Il a besoin d'un fichier de gabarit MainLayout.tpl et d'un fichier de classe MainLayout.php situés dans le même dossier. Pour faciliter la maintenance, nous allons créer le nouveau dossier protected/layouts pour les accueillir.
-
-Pour le moment, MainLayout contient seulement un entête simple et un pied de page, comme décrit ci-après. Plus tard, nous ajouterons une barre latérale. Les lecteurs sont encouragés à ajouter des fonctionnalités.
-
-Ci-dessus, le contenu du fichier de gabarit MainLayout.tpl. Trois nouvelles balises sont utilisées.
-
-Le fichier de classe MainLayout.php est très simple :
-
-Pour utiliser notre gabarit principal nouvellement créé, nous allons modifier nos fichiers Home.page et Contact.page. En particulier, nous devons supprimer les entêtes et pied de page parce que le gabarit principal a la responsabilité de les afficher ; par ailleurs, nous devons indiquer aux deux pages que leur gabarit principal est MainLayout.
-
-Ci-dessous, le contenu de Contact.page après les modifications :
- Veuillez remplir le formulaire suivant pour me laisser vos impressions au sujet de mon blog. Merci !
-Le contenu entre les balises <com:TContent> sera inséré dans l'emplacement réservé par <com:TContentPlaceHolder> dans le gabarit principal.
-
-A côté de la balise <com:TContent>, nous avons vu une nouvelle balise <%@ %>, qui est dénommé une balise de contrôle de gabarit. Elle contient des paires nom-valeur utilisées pour initialiser les propriétés correspondantes du propriétaire de gabarit, dans notre cas, la page Contact.
-
-En définissant la propriété MasterClass comme étant de type Application.layouts.MainLayout, nous avons indiqué à la page Contact d'utiliser MainLayout comme gabarit principal. Ici, nous avons utilisé un espace de noms pour nous référer à la classe MainLayout.
-
-Il y a plusieurs alternatives pour spécifier le gabarit principal.
-
-Vous pouvez définir le gabarit principal comme ci-dessous pour pouvoir en changer dynamiquement.
-
-Ci-dessus, nous indiquons d'utiliser le gabarit principal MasterClass dans la méthode onPreInit() qui est héritée de TPage. Cette méthode est appelé par PRADO juste après que l'instance de la page soit créée. Nous pouvons ainsi déclarer au moment où la page est requise quel gabarit principal utiliser. Par exemple, quand la page est requise par un utilisateur enregistré, nous pouvons utiliser le gabarit A, et le gabarit B si l'utilisateur qui demande la page est un invité.
-
-Nous pouvons aussi spécifier quel gabarit principal utiliser dans le fichier de configuration de l'application ou encore dans le fichier de configuration de la page. Ci-dessous, le fichier de configuration de l'application modifié pour notre blog.
-
-En faisant cela, nous évitons de définir le gabarit principal dans chaque page. Si nous décidons d'utiliser un autre gabarit principal, il nous suffit de changer le fichier de configuration de l'application. Pour cette raison, dans notre blog, nous utiliserons cette approche.
-
-Kita telah membuat halaman standar Home.page menggunakan piranti baris perintah PRADO. Halaman relatif statis karena ia tidak berisi konten dinamis. Dalam bagian ini, kita akan membuat halaman interaktif bernama Contact.
-
-Kegunaan dari halaman Contact adalah untuk mengumpulkan umpan balik dari para pengguna sistem blog kita. Untuk melaksanakan tujuan ini, kita merencanakan untuk menyajikan para pengguna dengan sebuah formulir umpan balik yang harus diisi. Dalam formulir ini, kita akan mengharuskan para pengguna untuk menyediakan namanya, alamat email, dan konten umpan balik. Setelah formulir diisi dan dikirimkan, email yang berisi umpan balik akan dikirimkan ke administrator situs.
-
-Untuk membuat halaman Contact, kita memerluka dua file di bawah direktori pages: file template halaman Contact.page dan file kelas halaman Contact.php.
-
-Pertama kita membuat file template untuk halaman Contact.
-
-Kita menggunakan template untuk menghatur tata letak penyajian terhadap formulir umpan balik. Dalam template, kita menggunakan kotak teks untuk mengumpulkan nama pengguna, email dan umpan balik. Dan kita menggunakan validator guna memastikan bahwa pengguna menyediakan semua informasi ini sebelum mengirimkan formulir umpan balik. Seluruh template adalah sebagai berikut,
- Please fill out the following form to let me know your feedback on my blog. Thanks!
-Seperti kita lihat bahwa template terlihat sangat mirip dengan halaman HTML normal. Perbedaan utamanya adalah bahwa template berisi beberapa tag <com:>. Setap tag <com:> merujuk ke sebuah kontrol yang propertinya diinisialisasi dengan pasangan nama-nilai dalam tag. Sebagai contoh, <com:TButton> merujuk ke kontrol TButton guna menampilkan sebuah tombol di mana pengguna dapat di klik pengguna untuk mengirimkan formulir umpan balik. Untuk sintaks lengkap template, silahkan rujuk Tutorial Cepat.
-
-Selain kontrol TTextBox, template juga menggunakan banyak kontrol validator yang memastikan input pengguna memuaskan aturan validasi spesifik. Sebagai contoh, untuk memastikan alamat email sah yang dilengkapi, kita menggunakan dua validator untuk memvalidasi kotak teks "email", seperti ditampilkan dalam kode berikut:
-
-Di bawah ini kita meringkas kontrol yang dipakai dalam template halaman:
-
-Sekarang kita membuat kelas halaman Contact.php. Alasan kita membutuhkan kelas halaman adalah karena kita perlu merespon umpan balik yang dikirimkan oleh pengguna.
-
-
-Perhatikan dalam template kita mempunyai baris berikut. Template secara esensi menyatakan bahwa saat pengguna mengklik tombol, ia harus memanggil metode submitButtonClicked(). Di sini OnClick adalah nama dari event yang diklik pengguna, dan metode harus didefinisikan dalam kelas halaman.
-
-Selanjutnya kita menuliskan kelas halaman seperti berikut:
-
-Kode di atas sebagian besar cukup jelas. Kenyataannya, kami hanya menampilkan skema pemrograman pengendalian-event. Dalam pengendali event submitButtonClicked(), kita mengambil input pengguna. Sebagai contoh, $this->Name->Text mengembalikan nilai properti Text dari kontrol Name yang merupakan kotak teks yang mengumpulkan informasi nama pengguna.
-
-Contact yang baru saja kita buat dapat kita uji dengan URL http://hostname/blog/index.php?page=Contact. Jika kita mengklik pada tombol submit tanpa memasukan informasi apapun, kita akan melihat pesan kesalahan muncil di sebelah kotak teks terkait. Jika kita memasukan semua informasi yang diperlukan, metode mailFeedback() akan dipanggil.
-
-Peningkatan berikutnya terhadap halaman ini adalah untuk menampilkan beberapa pesan konfirmasi pada halaman setelah pengguna mengirimkan umpan balik. Dan kemungkinan, browser akan dialihkan ke halaman lain jika pengiriman berhasil. Kita akan membiarkan tugas ini bagi para pembaca kita.
-
-Kita mulai dengan menyiapkan direktori dan file yang diperlukan oleh kebanyakan aplikasi PRADO. Kita menggunakan piranti baris perintah PRADO untuk melaksanakan tujuan ini.
-
-Anggap blog adalah nama direktori untuk menampung seluruh sistem blog, dan URL untuk mengakses folder ini adalah http://hostname/blog/ (ganti hostname dengan nama host sebenarnya).
-
-Di bawah direktori blog, kita menjalankan piranti baris perintah PRADO dengan perintah berikut (ganti path/ke dengan path sebenarnya ke instalasi kerangka kerja PRADO):
-
-Menjalankan perintah di atas akan membuat direktori dan file berikut:
-
-Sekarang kita mempunyai kerangka aplikasi PRADO yang dapat diakses melalui URL http://hostname/blog/index.php yang menampilkan halaman Web dengan tulisan "Welcome to PRADO".
-
-Sangat bermanfaat mempelajari lebih rinci mengenai direktori dan file yang baru saja kita buat.
-
-Setiap aplikasi PRADO mempunyai naskah entri, sering dinamakan sebagai index.php. Dalam kebanyakan kasus, ia hanya naskah PHP yang secara langsung dapat diakses oleh pengguna Web. Ini mengurangi resiko terhadap ijin para pengguna Web untuk menjalankan naskah yang tidak diinginkan pada server.
-
-Kegunaan utama dari naskah entri adalah untuk mengawali aplikasi PRADO dan membiarkan ia menangani permintaan pengguna. Naskah entri biasanya berisi pernyataan PHP berikut,
-
-File XML opsional application.xml berisi konfigurasi aplikasi. Kegunaan utamanya adalah untuk mengkustomisasi dalam cara yang bisa mengkonfigurasi turunan aplikasi yang dibuat dalam naskah entri. Sevagai contoh, kita dapat menghidupkan fitur pencatatan untuk sistem blog kita dengan bantuan konfigurasi aplikasi.
-
-File application.xml yang sekarang kita miliki hampir kosong. Sebenarnya kita dapat menghapusnya dengan aman karena aplikasi pada saat ini hanya menggunakan seting standar PRADO. Seiring kita ke depan, kita akan merujuk kembali secara kontan dan menampilkan bagaimana untuk mengkonfigurasi aplikasi kita dalam application.xml.
-
-Homepage (juga disebut halaman standar) Home.page adalah satu-satunya halaman yang dibuat oleh piranti baris perintah PRADO. Berisi konten dalam file ini yang muncul dalam browser saat mengunjungi URL http://hostname/blog/index.php.
-
-Konen dalam file Home.page menggunakan format template PRADO, yang kebanyakan mirip HTML dengan beberapa tag spesifik-PRADO. Sebagai contoh, dalam Home.page kita melihat konten murni HTML berikut:
-
-Direktori protected, juga dikenal sebagai path basis aplikasi, adalah direktori akar yang menampung halaman, template, konfigurasi, data, dll. Nama protected menunjukan bahwa direktori ini harus disembunyikan dari para pengguna Web, karena file di bawah direktori ini berisi data sensitif.
-
-Server Web berbeda mempunyai berbeda terhadap "melindungi" direktori. Untuk sever httpd Apache, cara termudah adalah untuk menempatkan file bernama .htaccess di bawah direktori dengan isi deny from all.
-
-Direktori protected/runtime dan assets adalah dua direktori yang harus disetel bisa ditulisi oleh proses server Web. Direktori runtime menyimpan data sensitif (misalnya konfigurasi aplikasi yang diuraikan) yang dibuat saat menjalankan aplikasi PRADO, karena direktori assets menyimpan sumber daya yang dipublikasikan (misalnya file gambar, file javascript).
-
-Direktori pages adalah akar direktori halaman yang menampung seluruh halaman dalam sebuah aplikasi PRADO. Ini mirip analogi terhadap direktori htdocs pada server Web httpd Apache.
-
-Kita sudah melihat bagaimana cara mengakses homepage. Untuk mengakses halaman yang ditempatkan di bawah pages, menggunakan URL http://hostname/blog/index.php?page=path.ke.NamaHalaman. Berdasarkan URL ini, PRADO akan melihar halaman bernama NamaHalaman di bawah direktori pages/path/ke. URL yang kita pakai untuk mengakses homepage sebelumnya sama dengan http://hostname/blog/index.php?page=Home.
-
-Dimungkinkan untuk mengkustomisasi nama dan lokasi terhadap file dan direktori yang dijelaskan di atas.
-
-Sebagai contoh, untuk meningkatkan keamanan, seseorang mungkin ingin memindahkan seluruh direktori protected ke tempat lain yang bukan folder Web. Untuk melakukannya, gunakan pernyataan PHP berikut untuk membuat turunan aplikasi dalam naskah entri:
-
-Untuk membuat lokasi akar direktori halaman dan mengubah nama homepage, seseorang dapat menetapkannya dalam konfigurasi aplikasi application.xml sebagai berikut:
-
-Setelah Anda mempelajari lebih jauh mengenai PRADO, Anda akan melihat bahwa PRADO adalah kerangka kerja fleksibel yang membolehkan Anda untuk mengkustomisasi hampir setiap aspeknya. Kami akan menjelaskan lebih lanjut teknik kustomisasi setelah kita melanjutkan tutorial kita.
-
-Dalam bagian ini, kita akan menggunakan fitur master/content PRADO untuk membagi tata letak umum diantara halaman. Tata letak merujuk ke area yang sama atay sebagian besar sama untuk setelan halaman. Sebagai contoh, dalam sistem blog kita, semua halaman akan berbagi header yang sama, footer dan bar-samping yang berisi link jalan pintas. Implementasi langsung adalah untuk mengulang tata letak umum dalam setiap halaman. Akan tetapi, pendekatan ini adalah cenderung salah dan sulit untuk dipelihara. Fitur master/content membolehkan kita untuk menggunakan tata letak umum sebagai sebuah kontrol yang memusatkan logika dan penyajian tata letak umum untuk setiap halaman.
-
-Sekarang kita membuat kontrol master MainLayout untuk mewakili tata letak umum berbagi dengan halaman blog kita. Kontrol MainLayout adalah kontrol template yang diperluas dari TTemplateControl. Ini mememerlukan file template MainLayout.tpl dan sebuah file kelas MainLayout.php yang ditempatkan di bawah direktori yang sama. Guna menjembatani pemeliharaan, kita membuat direktori baru protected/layouts untuk menampungnya.
-
-Untuk saat ini, MainLayout hanya berisi header dan footer sederhana, seperti ditampilkan berikut ini. Kedepan, kita akan menambahkan bar-samping. Para pembaca juga disarankan untuk meningkatkan tata letak dengan fitur yang lainnya.
-
-Contoh di atas memperlihatkan konten dalam file template MainLayout.tpl. Tiga tag baru ini dipakai:
-
-File kelas MainLayout.php sangat sederhana:
-
-Untuk menggunakan kontrol master yang baru saja dibuat, kita akan memodifikasi Home.page dan Contact.page. Dalam keadaan tertentu, kita perlu untuk menghapus header dan footer darinya karena kontrol master akan bertanggung jawab untuk menampilkannya; dan kita perlu memberitahu dua halaman di mana mereka harus menggunakan MainLayout sebagai masternya.
-
-Kode berikut memperlihatkan konten dalam Contact.page setelah perubahan:
- Please fill out the following form to let me know your feedback on my blog. Thanks!
-Konten yang dikurung di dalam tag <com:TContent> tag akan disisipkan ke dalam tempat yang disiapkan oleh <com:TContentPlaceHolder> pada template master.
-
-Selain <com:TContent>, kita juga melihat tag baru lain <%@ %> di atas, yang disebut tag kontrol template. Ia berisi pasangan nama-nilai yang dipakai untuk menginisialisasi properti terkait bagi pemilik template, yaitu, halaman Contact.
-
-Dengan menyetel properti MasterClass sebagai Application.layouts.MainLayout, kita menginstruksikan halaman Contact untuk menggunakan MainLayout sebagai masternya. Di sini, kita sedang menggunakan format namespace untuk merujuk ke kelas MainLayout.
-
-Ada beberapa cara tambahan untuk menetapkan kelas master untuk sebuah halaman.
-
-Kita dapat menetapkan master dalam kode seperti berikut untuk menghidupkan perubahan dinamis terhadap tata letak:
-
-Dalam contoh di atas, kita menetapkan MasterClass dalam metode onPreInit() yang diturunkan dari TPage. Metode dipanggil oleh PRADO langsung setelah turunan halaman dibuat. Selanjutnya kita dapat menentukan secara dinamis tata letak yang dipakai saat halaman diminta. Sebagai contoh, ketika halaman yang diminta oleh pengguna terdaftar kita memakai tata letak A, dan tata letak B dipakai jika pengguna tamu yang meminta halaman.
-
-Kita juga dapat menetapkan master dalam konfigurasi aplikasi atau konfigurasi halaman. Kode berikut memperlihatkan konfigurasi aplikasi yang dimutakhirkan untuk sistem blog kita:
-
-Dengan melakukan demikian, kita menghindari kesulitan pada penetapan master dalam setiap template halaman. Jika kita memutuskan untuk menggunakan master yang berbeda untuk halaman, kita hanya perlu mengubah konfigurasi aplikasi. Untuk alasan ini, dalam sistem blog kita, kita akan menggunakan pendekatan untuk menetapkan master.
-
-We are going to use Data Access Objects (DAO) to abstract our data access mechanisms. If in future we decide to use a different DBMS (e.g. PostgreSQL, Oracle) to store our blog data, we only need to change the database source name (DSN) and we can keep our PHP code intact.
+We are going to use Data Access Objects (DAO) to abstract our data access mechanisms. If in future we decide to use a different DBMS (e.g. PostgreSQL, Oracle) to store our blog data, we only need to change the database source name (DSN) and we can keep our PHP code intact.
-To further abstract the actual database tables, we will also use the Active Record (AR) feature. Each data record will be represented as an Active Record object which is capable of performing query, saving and deletion without writing SQL statements.
+To further abstract the actual database tables, we will also use the Active Record (AR) feature. Each data record will be represented as an Active Record object which is capable of performing query, saving and deletion without writing SQL statements.
@@ -36,11 +36,11 @@ We modify our application configuration file protected/application.xml
-The configuration above shows that we are adding two modules to our application. The TDataSourceConfig module is configured with the connection string sqlite:protected/data/blog.db which points to our SQLite database. This connection is used by the TActiveRecordConfig module which is required by Active Record.
+The configuration above shows that we are adding two modules to our application. The TDataSourceConfig module is configured with the connection string sqlite:protected/data/blog.db which points to our SQLite database. This connection is used by the TActiveRecordConfig module which is required by Active Record.
-We need to create two Active Record classes, UserRecord and PostRecord, to represent data records in the users and posts tables, respectively. Active Record classes must extend from the base class ActiveRecord, and must define property names that matches with the field names of the corresponding table.
+We need to create two Active Record classes, UserRecord and PostRecord, to represent data records in the users and posts tables, respectively. Active Record classes must extend from the base class ActiveRecord, and must define property names that matches with the field names of the corresponding table.
@@ -47,7 +47,7 @@ So we need to modify again our application configuration in the services section
- In the Output Folder field we used the namespace format again, the path Application.database indicates that we want to put our class's files in the protected/database/ folder.
+ In the Output Folder field we used the namespace format again, the path Application.database indicates that we want to put our class's files in the protected/database/ folder.
The * in the Table Name field means that we want to generate all AR classes, you can specify a table name instead if you want to generate just a specific AR class.
-Further detailed documentation can be found in the quickstart Active Record docs.
+Further detailed documentation can be found in the quickstart Active Record docs.
-Most Web applications use database to keep data. Our blog system is not an exception. In this section, we will describe how to write database-driven pages for our blog system. We will use techniques including database access object (DAO) and Active Record.
+Most Web applications use database to keep data. Our blog system is not an exception. In this section, we will describe how to write database-driven pages for our blog system. We will use techniques including database access object (DAO) and Active Record.
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page
deleted file mode 100755
index bc817c92..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page
+++ /dev/null
@@ -1,47 +0,0 @@
-
-Pour pouvoir utiliser la base de données que nous venons de créer, nous devons tout d'abord établir une connexion.
-
-Nous allons utiliser Data Access Objects (DAO) pour établir une couche d'abstraction. Si dans le futur nous décidions d'utiliser un autre SGBD (ie: PostgreSQl, Oracle, ...), il nous suffirait de modifier la chaine de connexion (DSN) et nous pourrions conserver notre code PHP intact.
-
-Pour une meilleure abstraction de notre base de données, nous utilisons aussi la fonctionnalité Active Record (AR). Chaque enregistrement est ainsi représenté par un objet qui a la possibilité d'exécuter des requêtes, de mettre à jour les données, de les supprimer et ceci sans écrire la moindre commande SQL.
-
-Nous modifions notre fichier de configuration de l'application protected/application.xml en insérant les lignes suivantes, qui indiquent à Active Record comment se connecter à notre base de données.
-
-Dans la configuration précédente, nous avons ajouté deux modules à notre application. Le module TDataSourceConfig est configuré avec la chaine de connexion sqlite:protected/data/blog.db qui pointe vers notre base de données. Cette connexion est utilisée par le module TActiveRecordConfig qui est requis pour l'utilisation d'Active Record.
-
-Nous avons besoin de définir deux classes Active Record, UserRecord et PostRecord, qui représentent respectivement les tables users et posts. Les classes Active Record doivent hériter de la classe ActiveRecord, et doivent définir les propriétés qui correspondent aux champs de la table correspondante.
-
-Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier protected/database qui contiendra nos deux classes. Nous modifions notre fichier de configuration de l'application en y insérant les lignes suivantes. Ceci est équivalent à inclure le dossier protected/database à notre chemin d'inclusion de PHP (include_path). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement.
-
-Au lieu de créer nos classes manuellement, nous allons utiliser les outils en ligne de commande de PRADO pour qu'il nous génère les classes.
-
-Dans le dossier blog, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande:
-
-Vous devriez voir
-
-A l'invite de commande, entrer les deux commandes suivantes pour créer les classes UserRecord et PostRecord.
-
-Ici, nous avons utilisés les espaces de noms pour indiquer où les classes seront créées. Le chemin Application.database.UserRecord indique que nous désirons que la classe soit insérée dans protected/database/UserRecord.php.
-
-Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier protected/database:
-
-Si vous consultez le fichier PostRecord, vous devriez voir le contenu suivant:
-
-Comme vous pouvez le constater, pour chaque champs de la table posts, la classe déclare un membre correspondant. La constante TABLE indique le nom de la table que gère la classe PostRecord. La méthode statique finder() permet d'effectuer des requêtes et de lire les données sous forme d'objets PostRecord.
-
-Vous pouvez utiliser l'outil en ligne de commande pour tester nos nouvelles classes. En restant dans le mode interactif de l'outil en ligne de commande, vous pouvez saisir les commandes PHP et voir ce qui suit. Vous pouvez tester des commandes telles que UserRecord::finder()->findAll().
-
-Rappellez-vous qu'il y a une relation entre les tables users et posts. Le diagramme des relations est indiqué ci-après.
-
-A partir de ce diagramme, nous voyons que la table posts contient un champ author_id. Le champ author_id est une clé étrangère qui référence la table users. En particulier, les valeurs du champ author_id doivent apparaitre dans dans le champ username de la table users. Une des conséquences de cette relation, en réfléchissant orienté objet, est que chaque "post" repose sur un "author" et qu'un "author" peut avoir plusieurs "posts".
-
-Nous pouvons modéliser les relations entre posts and users dans nos classes PostRecord and UserRecord en les modifiant comme ci-dessous :
-
-La propriété statique $RELATIONS de la classe PostRecord définit que la propriété $author fait référence à un UserRecord. Dans le tableau : array(self::BELONGS_TO, 'UserRecord'), le premier élément défini le type de relation, dans notre cas, self::BELONGS_TO. Le deuxième élément est le nom de l'objet en relation, dans notre cas UserRecord. La classe UserRecord est définie comme ci-dessous, la différence est que chaque objet UserRecord contient plusieurs PostRecord.
-
-Un tableau de UserRecord ainsi que les messages correspondants peuvent être lu de la manière suivante :
-
-Plus d'informations sont disponibles dans le manuel de démarrage rapide Active Record.
-
-La plupart des applications Web utilisent une base de données pour conserver les informations. Notre blog n'est pas une exception. Dans cette section, nous allons décrire comment écrire une application qui interagit avec une base de données. Nous allons utiliser les deux moyens suivants database access object (DAO) et Active Record.
-
-Pour ce tutoriel, nous avons simplifié les besoins, nous aurons juste à gérer les utilisateurs et les messages. Nous allons donc créer deux tables users et posts, comme décrit dans le diagramme ci-après.
-
-Nous utilisons une base de données SQLite 3 pour conserver nos données. La première étape est de convertir notre diagramme en commandes SQL et de l'enregistrer dans le fichier protected/schema.sql.
-
-Nous utilisons après ceci, les outils en ligne de commande SQLite pour créer la base de données. Nous avons créé un dossier protected/data qui contiendra le fichier de base de données. Nous lançons maintenant la ligne de commande suivante dans le dossier protected/data.
-
-La base de données est ainsi créée dans le fichier protected/data/blog.db et nous pouvons maintenant voir la l'arborescence suivante :
-
-Untuk menggunakan database yang baru saja kita buat, pertama kita perlu melaksanakan koneksinya.
-
-Kita akan menggunakan Data Access Objects (DAO) untuk memisahkan mekanisme akses data kita. Jika nanti kita menggunakan DBMS yang berbeda (misalnya PostgreSQL, Oracle) untuk menyimpan data blog, kita hanya perlu mengubah nama sumber database atau data source nama (DSN) dam kita dapat menjaga kode PHP kita tetap utuh.
-
-Selanjutnya untuk memisahkan tabel database sebenarnya, kita juga akan menggunakan fitur Rekaman Aktif (AR). Setiap rekaman data akan disajikan sebagai obyek Rekaman Aktif yang mampu melakukan query, menyimpan dan menghapus tanpa menulis pernyataan SQL.
-
-Kita memodifikasi file konfigurasi aplikasi kita protected/application.xml dengan menyisipkan baris berikut, yang memberitahu Rekaman Aktif bagaimana untuk menghubungkan ke database yang baru saja kita buat:
-
-Konfigurasi di atas memperlihatkan bahwa kita menambahkan dua modul pada aplikasi kita. Modul TDataSourceConfig dikonfigurasi dengan string koneksi sqlite:protected/data/blog.db yang mengarah ke SQLite database kita. Koneksi ini dipakai oleh modul TActiveRecordConfig yang dibutuhkan leh Rekaman Aktif.
-
-Kita perlu membuat dua kelas Rekaman Aktif, UserRecord dan PostRecord, masing-masing untuk mewakili rekaman data dalam tabel users dan posts. Kelas Rekaman Aktif harus diperluas dari kelas basis ActiveRecord, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait.
-
-Untuk mengatur lebih baik direktori, kita membuat direktori baru protected/database guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori protected/database ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya.
-
-Daripada menulis kelas secara manual, kita akan menggunakan piranti baris perintah PRADO lagi untuk membuat kelas bagi kita.
-
-Di bawah direktori blog, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah:
-
-Kita akan melihat
-
-Pada prompt, masukkan dua perintah berikut untuk membuat kelas UserRecord dan PostRecord:
-
-Di sini kita menggunakan format namespace lagi untuk menetapkan kelas yang dibuat. Path Application.database.UserRecord menunjukan bahwa kita ingin file kelas UserRecord menjadi protected/database/UserRecord.php.
-
-Kita akan melihat struktur direktori berikut dengan dua file baru di bawah protected/database:
-
-Jika kita memeriksa file kelas PostRecord, kita akan melihat konten berikut.
-
-Seperti kita lihat, untuk setiap field dalam tabel posts, kelas mempunyai anggota data terkait. Konstan TABLE menetapkan nama tabel untuk PostRecord. Metode statis finder() membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek PostRecord.
-
-Kita dapat menggunakan piranti baris perintah untuk melakukan beberapa pengujian dengan kelas Rekaman Aktif yang baru saja kita buat. Masih dalam mode interaktif pada piranti baris perintah, kita memasukan pernyataan PHP dan seharusnya melihat kode berikut. Para pembaca yang tertarik dapat mencoba pernyataan PHP laninnya, seperti misalnya UserRecord::finder()->findAll().
-
-Mengingat bahwa ada hubungan kunci asing antara tabel users dan posts. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan.
-
-Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel posts berisi field bernama author_id. Field author_id ini adalah kunci asing yang mereferensi tabel users. Dalam keadaan tertentu, nilai dalam field author_id seharusnya dari tabel users field username. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan".
-
-Kita dapat membuat model hubungan antara tabel posts dan users dalam Rekaman Aktif dengan memodifikasi kelas PostRecord dan UserRecord seperti berikut.
-
-Properti statis $RELATIONS pada PostRecord mendefinisikan bahwa properti $author dimiliki UserRecord. Dalam array(self::BELONGS_TO, 'UserRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini UserRecord. UserRecord didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak PostRecord.
-
-Sebuah array UserRecord dengan dan tulisan terkaitnya dapat diambil seperti berikut.
-
-Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart Rekaman Aktif.
-
-Banyak aplikasi Web menggunakan database untuk memelihara datanya. Sistem blog kita tidak terkecuali. Dalam bagian ini, kami akan menjelaskan bagaimana untuk menulis halaman kendali-database untuk sistem blog kita. Kita akan menggunakan teknik termasuk database access object (DAO) dan Rekaman Aktif.
-
-Untuk keperluan tutorial, kita menyederhanakan kebutuhan sistem blog kita agar hanya perlu berhadapan dengan pengguna dan data tulisan. Selanjutnya kita membuat dua tabel database, users dan posts, seperti diperlihatkan dalam duagram hubungan entitas atau entity-relationship (ER) di bawah ini.
-
-Kita menggunakan SQLite 3 database untuk menyimpan data kita. Pertama kita ubah diagram ER ke dalam pernyataan SQL berikut dan menyimpannya dalam file protected/schema.sql.
-
-Kemudian kita menggunakan piranti baris perintah SQLite untuk membuat SQLite database. Kita membuat sebuah direktori protected/data untuk menampung file database SQLite. Sekarang kita menjalankan perintah berikut di bawah direktori protected/data:
-
-Database sudah dibuat sebagai protected/data/blog.db dan kita akan melihat direktori dan file berikut:
-
-Before we set off to implement the user pages, we need to do some work to enable authentication and authorization.
+Before we set off to implement the user pages, we need to do some work to enable authentication and authorization.
@@ -26,11 +26,11 @@ We add two new modules to the application configuration as follows:
-The TAuthManager module manages the whole authentication and authorization workflow. It uses the users module as its user manager (see below). By specifying the LoginPage property, we inform the auth manager to redirect user's browser to the LoginUser page when an authorization fails. We will describe how to create LoginUser in the next subsection.
+The TAuthManager module manages the whole authentication and authorization workflow. It uses the users module as its user manager (see below). By specifying the LoginPage property, we inform the auth manager to redirect user's browser to the LoginUser page when an authorization fails. We will describe how to create LoginUser in the next subsection.
-The user module is of class TDbUserManager which is responsible to verify the validity of a user and keep basic user data in the PHP session. The UserClass property is initialized as Application.BlogUser, which indicates the user manager would look for a BlogUser class under the directory protected (remember the alias Application refers to the protected directory) and use it to keep user's session data.
+The user module is of class TDbUserManager which is responsible to verify the validity of a user and keep basic user data in the PHP session. The UserClass property is initialized as Application.BlogUser, which indicates the user manager would look for a BlogUser class under the directory protected (remember the alias Application refers to the protected directory) and use it to keep user's session data.
@@ -38,7 +38,7 @@ As we will see in later sections, in controls and pages, we can use $this->U
-Below is the implementation detail of BlogUser. Notice Active Record is used to perform DB query. For example, we use UserRecord::finder()->findByPk($username) to look for the primary key specified by $username in the users table.
+Below is the implementation detail of BlogUser. Notice Active Record is used to perform DB query. For example, we use UserRecord::finder()->findByPk($username) to look for the primary key specified by $username in the users table.
-We use TDataGrid to display the user accounts. Based on the above analysis, we configure the following four columns:
+We use TDataGrid to display the user accounts. Based on the above analysis, we configure the following four columns:
The complete page template is shown as follows:
-Below we show the template for LoginUser. As we see, the page mainly contains a text box for collecting username and a text box for password. The username input is required, which is ensured by the TRequiredFieldValidator. The correctness of the password input is ensured by the TCustomValidator which invokes the page's validateUser() method when validation is performed. The page also has "login" button which invokes the page's loginButtonClicked() when it is clicked.
+Below we show the template for LoginUser. As we see, the page mainly contains a text box for collecting username and a text box for password. The username input is required, which is ensured by the TRequiredFieldValidator. The correctness of the password input is ensured by the TCustomValidator which invokes the page's validateUser() method when validation is performed. The page also has "login" button which invokes the page's loginButtonClicked() when it is clicked.
-In the above, calling save() will insert a new row in the users table. This intuitive feature is enabled by Active Record.
+In the above, calling save() will insert a new row in the users table. This intuitive feature is enabled by Active Record.
-During testing, you may have asked: shouldn't the NewUser page be only accessible by the administrator user? Yes, this is called authorization. We now describe how we add this permission check to the NewUser page.
+During testing, you may have asked: shouldn't the NewUser page be only accessible by the administrator user? Yes, this is called authorization. We now describe how we add this permission check to the NewUser page.
@@ -182,7 +182,7 @@ A straightforward way of performing permission check is in the page class where
-PRADO offers a more systematic way of checking page access permissions. To do so, we need to use page configuration. Create a file protected/pages/users/config.xml with the content as follows:
+PRADO offers a more systematic way of checking page access permissions. To do so, we need to use page configuration. Create a file protected/pages/users/config.xml with the content as follows:
-Avant que nous n'implémentions la gestion des utilisateurs, nous devons activer les modules authentification et autorisation.
-
-Nous ajoutons deux nouveaux modules à notre fichier de configuration de l'application.
-
-Le module TAuthManager gère le processus d'authentification et d'autorisation. Il utilise le module users comme gestionnaire d'utilisateur (voir ci-après). En spécifiant la propriété LoginPage, nous indiquons au module d'authentification de rediriger vers la page LoginUser quand il est nécessaire de s'authentifier. Nous décrirons comment créer la page LoginUser ci-après.
-
-Le module user est une classe de type TDbUserManager qui est responsable de la vérification et de la validation des utilisateurs et qui enregistre dans une session PHP les données utilisateurs. La propriété UserClass est initialisée comme étant de type Application.BlogUser, ceci indique au module user de chercher une classe BlogUser dans le dossier protected (rappellez-vous que l'alias Application fait référence au dossier protected) et d'utiliser cette classe pour conserver les données utilisateurs dans une session.
-Le module user est une classe de type TDbUserManager qui est responsable de la vérification et de la validation des utilisateurs et qui enregistre dans une session PHP les données utilisateurs. La propriété UserClass est initialisée comme étant de type Application.BlogUser, ceci indique au module user de chercher une classe BlogUser dans le dossier protected (rappellez-vous que l'alias Application fait référence au dossier protected) et d'utilisez cette classe pour conserver les données utilisateurs dans une session.
-
-Comme vous pourrez le constater dans les sections suivantes, dans les différents contrôles et pages, nous pourrons utiliser $this->User pour accéder à l'objet qui contient les informations de l'utilisateur actuellement connecté.
-
-Ci-dessous les détails de l'implémentation de la classe BlogUser. Remarquez que les Active Record sont utilisés pour exécuter une requête. Par exemple, nous utilisons UserRecord::finder()->findByPk($username) pour chercher la valeur de $username dans la table users et ceci par la clé primaire.
-
-La page AdminUser affiche la liste de tous les comptes utilisateurs, ainsi l'administrateur peut effectuer les tâches de maintenance. Par simplification, les tâches administratives pour notre blog seront la mise à jour des utilisateurs et la suppression.
-
-Nous allons lister les utilisateurs dans une table HTML. Chaque ligne correspondra à un compte utilisateur, les colonnes suivantes seront affichées:
-
-Nous créons deux fichiers protected/pages/users/AdminUser.page et protected/pages/users/AdminUser.php qui contiendront respectivement le gabarit et la classe.
-
-Nous allons utiliser un contrôle TDataGrid pour afficher les données. Suivant l'analyse précédente, nous allons configurer quatre colonnes:
- Le gabarit complet est affiché ci-après:
-Dans le gabarit précédent, le bouton OnDeleteCommand déclenche l'évènement deleteButtonClicked() que nous devons implémenter dans le fichier de classe. De plus, la grille de données doit être renseignée avec les informations utilisateurs lorsque la page est initialisée. Nous écrivons donc notre fichier de classe comme ci-dessous :
-
-Dans le code précédent, la méthode deleteButtonClicked() est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété Item.ItemIndex du paramètre de l'évènement. Avec cet index, nous recherchons quelle est la clé primaire de la ligne grâce à la propriété DataKeys.
-Dans le code précédent, la méthode deleteButtonClicked() est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété Item.ItemIndex du paramètre de l'évènement. Avec cet index, nous recherchons quelle est la clé primaire de la ligne grâce à la propriété DataKeys.
-
-Pour tester notre page AdminUser, nous naviguons à l'adresse http://hostname/blog/index.php?page=users.AdminUser. Il peut vous être demandé de vous connecter en tant qu'administrateur auparavant si ce n'est déjà fait. Le résultat suivant apparaitra.
-
-La page EditUser ressemble beaucoup à la page NewUser. La différence principale est le fait que lorsque la page EditUser est requise, les champs sont renseignés avec les données de l'utilisateur en cours. Une autre différence est que la page EditUser est accessible à un utilisateur standard.
-
-Pour définir quels sont les comptes qui peuvent être modifiés, nous allons utiliser les règles suivantes :
-
-Nous créons deux fichiers protected/pages/users/EditUser.page et protected/pages/users/EditUser.php qui contiendront respectivement le gabarit et la classe.
-
-Comme vous avez pu le deviner, la page EditUser est fortement ressemblante à la page NewUser. En dehors du titre de la page et du bouton "envoyer", il y a trois différences principales.
-
-En suivant les indications du gabarit, nous devons écrire une page de classe qui initialise les champs avec les données de l'utilisateur. De plus, la classe doit implémenter la méthode saveButtonClicked() appelée par l'évènement OnClick du bouton "Enregistrer".
-
-Pour rendre la page EditUser accessible également par les utilisateurs authentifiés (users="@"), nous devons modifier le fichier de configuration protected/pages/users/config.xml.
-
-Pour tester la page EditUser, rendons-nous à l'URL http://hostname/blog/index.php?page=users.EditUser&username=demo. Il vous sera peut-être demandé de vous authentifier auparavant si vous n'êtes pas déjà connecté. Essayez de vous connecter avec différents comptes (ie: admin/demo, demo/demo) et remarquez comment la page évolue différemment.
-
-La page LoginUser affiche un formulaire et gère l'authentification de l'utilisateur. Comme décrit dans authentification et autorisation, le navigateur est automatiquement redirigé vers la page LoginUser quand un utilisateur essaye d'accéder à une page protégée, telle que la page d'administration des utilisateurs.
-
-Le processus de la page LoginUser est similaire à celui de la page Contact:
-
-Nous créons les deux fichiers protected/pages/users/LoginUser.page et protected/pages/users/LoginUser.php qui enregistre le gabarit et la classe respectivement.
-
-Ci-après est affiché le gabarit pour LoginUser. Comme vous pouvez le constater, la page contient un champ de saisie pour le nom de l'utilisateur et un autre pour le mot de passe. Le nom de l'utilisateur est requis, ce que le validateur TRequiredFieldValidator contrôle. La validité du mot de passe est assurée par le validateur TCustomValidator qui fait un appel à la méthode validateUser() de la classe. La page contient aussi un bouton "envoyer" qui fait un appel à loginButtonClicked() quand il est activé.
-
-Tout comme la page Contact, la page LoginUser a aussi besoin d'un fichier de classe qui implémente les évènements générés dans le fichier gabarit. Ici, nous avons besoin de deux méthodes : validateUser() et loginButtonClicked(). Dans validateUser(), nous utilisons le gestionnaire d'authentification pour vérifier si le nom d'utilisateur et le mot de passe sont valides. Si c'est le cas, le gestionnaire d'authentification créé automatiquement une session utilisateur avec les données correspondantes.
-
-Nous avons donc créé la page LoginUser. Nous pouvons la tester en naviguant à l'URL http://hostname/blog/index.php?page=users.LoginUser. Rappellez-vous que la dans la section Création de la base, nous avons déjà créé deux comptes utilisateurs (nom d'utilisateur/mot de passe) admin/demo et demo/demo. Nous pouvons donc les utiliser pour tester notre page de connexion.
-
-Pour permettre à l'utilisateur d'accéder directement aux pages de connexion/déconnexion, nous modifions le gabarit principal MainLayout. En particulier, nous ajoutons un lien vers la page LoginUser. Nous ajoutons aussi un lien "se déconnecter" qui permet à l'utilisateur de se déconnecter.
-
-Nous modifions le pied de page de notre gabarit principal MainLayout. La visibilité des liens vers "se connecter" et "se déconnecter" dépend du statut de l'utilisateur. Si l'utilisateur n'est pas encore connecté, ie: $this->User->IsGuest est vrai, alors le lien "se connecter" est visible tandis que le lien "se déconnecter" ne l'est pas et inversement s'il est connecté.
-
-Vu que le lien "se déconnecter" génère l'évènement OnClick avec comme nom d'évènement logoutButtonClicked(), nous devons modifier le fichier de classe de MainLayout comme ci-dessous :
-
-Maintenant si nous visitons n'importe quelle page de notre blog, nous verrons apparaitre un lien en pied de page. Le lien affiche "se connecter" si nous ne sommes pas connectés et "se déconnecter" dans le cas contraire. Si nous cliquons sur le lien "se déconnecter", nous sommes redirigés vers la page d'accueil et le lien "se connecter" apparait indiquant que nous ne sommes plus connectés.
-
-La page NewUser est fournie à l'administrateur pour créer des nouveaux comptes utilisateurs. Elle doit afficher un formulaire qui permet la saisie des informations d'un nouveau compte. Tel que défini dans la base de données, nous devons prévoir la saisie des informations suivantes :
-
-Nous créons deux fichiers, protected/pages/users/NewUser.page et protected/pages/users/NewUser.php qui contiendront respectivement le gabarit et la classe.
-
-En fonction de l'analyse précédente, nous créons le gabarit comme ci-dessous :
-
-Le gabarit est très proche du gabarit de la page Contact et de la page LoginUser. Il consiste principalement en deux champs de saisie et de plusieurs validateurs. Certains champs de saisie sont associés à plusieurs validateurs vu qu'il est nécessaire de vérifier plusieurs règles.
-
-En fonction du gabarit précédent, nous constatons que nous avons besoin d'une classe qui implémente deux gestionnaires d'évènements : checkUsername() (appellé par le premier validateur dans l'évènement OnServerValidate) et createButtonClicked() (appellé par l'évènement OnClick du bouton "create"). ainsi, nous écrirons la classe comme ci-dessous :
-
-Dans le code précédent, l'appel à la méthode save() insère un enregistrement dans la table users. Cette fonctionnalité est fournie par l'objet Active Record.
-
-Pour tester la page NewUser, il suffit de naviguer à l'URL http://hostname/blog/index.php?page=users.NewUser. vous devriez voir apparaitre la page suivante. Essayez de saisir différentes informations et remarquez comment les données sont validées. Si toutes les règles sont valides, nous devrions avoir inséré un nouvel utilisateur et être redirigés vers la page d'accueil.
-
-Durant le test, vous vous êtes peut-être demandé : Est-ce que la page NewUser ne devrait être accessible qu'aux administrateurs ? Oui, ceci est dénommé autorisation. Nous allons maintenant décrire comment ajouter cette vérification d'accès à la page NewUser.
-
-Une façon simple serait de vérifier dans le code de la classe si $this->User->IsAdmin est vrai, dans le cas contraire, une redirection vers la page de connexion LoginUser serait faite.
-
-PRADO propose une approche complémentaire de vérification des droits. Pour ce faire, nous devons utiliser un fichier de configuration de page. Créer un fichier protected/pages/users/config.xml avec le contenu suivant :
-
-Le fichier de configuration de page contient les règles d'accès aux pages contenues dans le dossier protected/pages/users. Ce fichier indique que les utilisateurs dont le rôle est "admin" (concernant le mot "admin" voir BlogUser.createUser()) peuvent accéder à toutes les pages du dossier. Tous les autres utilisateurs (users="*") ne sont pas autorisés à accéder à ces pages, excepté à la page LoginUser qui, par convention, peut toujours être chargée.
-
-Dorénavant, si nous naviguons à la page NewUser en tant qu'anonyme, nous serons redirigés vers la page LoginUser. Si notre connexion est acceptée, nous serons redirigés en retour vers la page NewUser
-
-Dans cette section, nous allons créer les pages concernant la gestion des utilisateurs. En particulier, nous allons implémenter les fonctionnalités suivantes: connexion/déconnexion des utilisateurs, création d'un utilisateur, mise à jour/suppression des utilisateurs.
-
-En accord avec les buts à atteindre, nous devons créer les pages suivantes. Pour une meilleure organisation de notre code, ces pages seront créées dans le dossier protected/pages/users.
-
-Après avoir fini cette section, nous devrions obtenir l'arborescence suivante :
-
-Sebelum kita siap mengimplementasikan halaman pengguna, kita perlu melakukan beberapa pekerjaan guna menghidupkan otentikasi dan otorisasi.
-
-Kita menambah dua modul ke konfigurasi aplikasi seperti berikut:
-
-Modul TAuthManager mengatur seluruh alur kerja otentikasi dan otorisasi. Ia menggunakan modul users sebagai manajer penggunanya (lihat di bawah). Dengan menetapkan properti LoginPage, kita menginformasikan manajer otentikasi untuk mengalihkan browser pengguna ke halaman LoginUser saat otorisasi gagal. Kami akan menjelaskan bagaimana untuk membuat LoginUser dalam subbagian berikutnya.
-
-Modul user adalah kelas TDbUserManager yang bertanggung jawab untuk memverifikasi keabsahan pengguna dan memelihara data dasar dalam sesi PHP. Properti UserClass diinisialisasi sebagai Application.BlogUser, yang menunjukan bahwa manajer pengguna akan melihar kelas BlogUser di bawah direktori protected (ingat alias Application merujuk ke direktori protected) dan menggunakannya untuk memelihara data sesi pengguna.
-
-Seperti yang akan kita lihat dalam bagian nanti, dalam kontrol dan halaman, kita dapat menggunakan $this->User untuk memperoleh obyek BlogUser yang berisi informasi pengguna yang saat ini mengakses siistem.
-
-Di bawah ini adalah rincian implementasi dari BlogUser. Perhatikan, Rekaman Aktif digunakan untuk melakukan query DB. Sebagai contoh, kita menggunakan UserRecord::finder()->findByPk($username) untuk mencari kunci primer yang ditetapkan oleh $username dalam tabel users.
-
-Halaman AdminUser menampilkan semua akun pengguna dalam sebuah daftar agar administrator dapat melakukan beberapa pekerjaan administratif. Demi kemudahan, pekerjaan administratif sistem blog kita mendukung termasuk mengedit dan menghapus akun pengguna.
-
-Kita akan menampilkan daftar pengguna dalam sebuah tabel. Setiap baris tabel mewakili satu akun pengguna, dan kolom berikut ditampilkan:
-
-Kita membuat dua file protected/pages/users/AdminUser.page dan protected/pages/users/AdminUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Kita menggunakan TDataGrid untuk menampilkan akun pengguna. Berdasarkan pada analisis di atas, kita mengkonfigurasi empat kolom berikut:
- Template halaman lengkap ditampilkan seperti berikut:
-Dalam template halaman di atas, event OnDeleteCommand datagrid dengan metode deleteButtonClicked() akan kita implementasikan dalam kelas halaman. Sebagai tambahan, datagrid perlu dipopulasi dengan data akun pengguna saat halaman diinisialisasi. Oleh karena itu, kita menulis kelas halaman seperti berikut:
-
-Dalam kode di atas, metode deleteButtonClicked() dipanggil kapan saja tombol "Delete" diklik. untuk menentukan baris mana pada tombol yang diklik, kita memeriksa properti Item.ItemIndex pada parameter event. Untuk selanjutnya mengidentifikasi akun pengguna mana yang akan dihapus, kita mengambil nilai kunci primer (username) melalui properti DataKeys pada DataGrid.
-
-Untuk menguji halaman AdminUser, kunjungi URL http://hostname/blog/index.php?page=users.AdminUser. Anda mungkin perlu masuk sebagai administrator lebih dahulu jika Anda belum melakukannya. Kita akan melihat hasil seperti berikut.
-
-Halaman EditUser sangat mirip dengan NewUser. Perbedaan utamanya adalah bahwa saat EditUser awalnya diminta, field input harus diinisialisasi dengan informasi pengguna yang sudah ada. Sedikit perbedaan lainnya adalah bahwa EditUser juga bisa diakses oleh pengguna normal.
-
-Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut:
-
-Kita membuat dua file protected/pages/users/EditUser.page dan protected/pages/users/EditUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Seperti yang telah Anda tebak, template halaman EditUser sebagian besar sama seperti pada NewUser. Selain perbedaan dalam judul halaman dan judul tombol submit, ada tiga perbedaan utama.
-
-Berdasarkan pada deskripsi di atas dan template, kita perlu menulis kelas halaman yang mengawali input dengan informasi pengguna yang sudah ada. Sebagai tambahan, kelas halaman juga perlu untuk mengimplementasikan metode saveButtonClicked() yang disertakan pada event tombol "save" OnClick.
-
-Agar halaman EditUser juga bisa diakses oleh para pengguna (users="@"), kita juga perlu menyesuaikan file konfigurasi halaman protected/pages/users/config.xml.
-
-Untuk menguji halaman EditUser, kunjungi URL http://hostname/blog/index.php?page=users.EditUser&username=demo. Anda mungkin perlu masuk lebih dulu jika Anda belum melakukannya. Coba masuk dengan akun berbeda (e.g. admin/demo, demo/demo) dan lihat bagaimana halaman ditampilkan secara berbeda.
-
-Halaman LoginUser menampilkan formulir masuk dan mengotentikasi pengguna yang mencoba untuk masuk. Seperti dijelaskan dalam otentikasi dan otorisasi, browser pengguna secara otomatis dialihkan ke halaman LoginUser ketika pengguna mencoba untuk mengakses halaman istimewa, seperti misalhnya halaman admin pengguna.
-
-Alur kerja LoginUser sangat mirip dengan halaman Contact:
-
-Kita membuat dua file protected/pages/users/LoginUser.page dan protected/pages/users/LoginUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Di bawah ini kita menampilkan template untuk LoginUser. Seperti kita lihat, halaman sebagian besar berisi kotak teks untuk mengumpulkan nama pengguna dan kotak teks untuk kata sandi. Input nama pengguna diperlukan, yang dipastikan oleh TRequiredFieldValidator. Kebenaran dari input kata sandi dipastikan oleh TCustomValidator yang memanggil metode validateUser() halaman ketika validasi dilakukan. Halaman juga mempunyai tombol "login" yang memanggil loginButtonClicked() halaman ketika itu diklik.
-
-Seperti halaman Contact, halaman LoginUser juga memerlukan file kelas yang sebagian besar berisi implementasi pengendali event yang disertakan dalam template halaman. Di sini, kita perlu mengimplementasikan dua metode: validateUser() dan loginButtonClicked(). Dalam validateUser(), kita menggunakan manajer otentikasi untuk memverifikasi apakan nama pengguna serta kata sandinya sudah benar. Jika benar, manajer otentikasi akan secara otomatis membuat sesi pengguna dengan informasi identitas pengguna terkait.
-
-Kita telah membuat halaman LoginUser. Kita dapat mengujinya dengan mengunjungi URL http://hostname/blog/index.php?page=users.LoginUser. Ingat dalam subbagian Membuat Database, kita sudah membuat dua akun pengguna (username/password): admin/demo dan demo/demo. Kita dapat menggunakannya untuk menguji halaman masuk kita.
-
-Guna melengkapi cara langsung bagi pengguna untuk masuk dan keluar, kita memodifikasi sedikit kontrol master MainLayout. Dalam keadaan tertentu, kita menambahkan hiperlink "login" yang mengaitkan halaman LoginUser. Kita juga menambahkan tombol link "logout" yang mengeluarkan pengguna saat ia diklik.
-
-Kita memodifikasi bagian footer dari template MainLayout sebagai berikut. Penampakan "login" dan "logout" ditentukan berdasarkan status pengguna. Jika pengguna belum masuk, misalnya $this->User->IsGuest adalah true, link "login" terlihat sementara link "logout" tidak; dan begitu sebaliknya.
-
-Karena tombol "logout" menempelkan event OnClick dengan metode yang dipanggil logoutButtonClicked(), kita juga perlu mengubah file kelas MainLayout.
-
-Sekarang jika kita mengunjungi setiap halaman pada sistem blog kita, kita akah melihat apakah ada link di bawah halaman. Link menampilkan "Login" jika kita belum masuk dan "Logout" jika telah masuk. Jika kita mengklik pada "Logout", browser akan mengalihkannya ke homepage dan "Login" ditampilkan yang berarti kita sudah dikeluarkan.
-
-Halaman NewUser disediakan untuk pengguna administrator guna membuat akun pengguna baru. Ini perlu menampilkan sebuah formulir yang mengumpulkan informasi mengenai akun pengguna baru. Berdasarkan definisi database, kita akan perlu mengumpulkan informasi berikut:
-
-Kita membuat dua file protected/pages/users/NewUser.page dan protected/pages/users/NewUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Berdasarkan pada analisis di atas, kita menulis template halaman seperti berikut:
-
-Template tidak jauh berbeda dari template Contact dan halaman LoginUser. Sebagian besar terdiri dari kotak teks dan validator. Beberapa kotak teks, seperti nama pengguna, dikaitkan dengan dua validator karena keterlibatan aturan multipel validasi.
-
-Dari template halaman di atas, kita melihat bahwa kita perlu untuk menulis sebuah kelas halaman yang mengimplementasikan dua pengendali event: checkUsername() (disertakan ke event validator kustom OnServerValidate) dan createButtonClicked() (disertakan ke event tombol "create" OnClick). Oleh karena itu, kita menulis kelas halaman seperti berikut:
-
-Dalam kode di atas, memanggil save() akan menyisipkan baris baru dalam tabel users. Fitur intuitif ini dihidupkan oleh Rekaman Aktif.
-
-Untuk menguji halaman NewUser, kunjungi URL http://hostname/blog/index.php?page=users.NewUser. Kita akan melihat output halaman berikut. Coba masukan informasi berbeda ke dalam formulir dan lihat bagaimana input divalidasi. Jika semua aturan validasi memuaskan, kita akan mengharapkan akun pengguna dibuat dan browser dialihkan ke homepage.
-
-Selama pengujian, Anda mungkin bertanya: apakah halaman NewUser seharusnya hanya bisa diakses oleh pengguna administrator? Ya, ini disebut otorisasi. Sekarang kami menjelaskan bagaimana kita menambahkan pemeriksaan perijinan ini ke halaman NewUser.
-
-Cara langsung pada pemeriksaan perijinan adalah dalam kelas halaman di mana kita memeriksa apakah $this->User->IsAdmin adalah true, dan jika tidak, kita mengalihkan browser ke halaman LoginUser.
-
-PRADO menawarkan cara lebih sistematis terhadap pemeriksaan perijinan akses halaman. Untuk melakukannyaTo , kita perlu menggunakan konfigurasi halaman. Membuat sebuah file protected/pages/users/config.xml dengan konten seperti berikut:
-
-Konfigurasi halaman berisi aturan otorisasi yang berlaku untuk halaman di bawah direktori protected/pages/users. Konfigurasi di atas terbaca bahwa para pengguna dalam role admin dapat mengakses semua halaman (lihat BlogUser.createUser() untuk mengapa harus kata "admin"). Untuk saat ini semua para pengguna lain (users="*") ditolak untuk mengakses halaman dalam direktori ini - kecuali untuk halaman LoginUser yang seharusnya selalu bisa diakses.
-
-Sekarang jika kita mengunjungi halaman NewUser sebagai seorang tamu, kita akan dialihkan ke halaman LoginUser terlebih dahulu. Jika kita masuk dengan sukses, kita akan mengalihkan kembali ke halamanNewUser.
-
-Dalam bagian ini, kita membuat halaman yang terkait dengan manajemen pengguna. Dalam keadaan tertentu, kita mengimplementasikan fitur yang dibutuhkan ini: pengguna masuk/keluar, membuat akun pengguna baru dan memutakhirkan/menghapus akun pengguna.
-
-Berdasarkan kebutuhan, kita perlu membuat halaman berikut. Guna mengatur lebih baik kode kita, halaman terkait-pengguna ini akan dibuat di bawah direktori baru protected/pages/users.
-
-Setelah menyelesaikan bagian ini, kita mengharapkan bisa melihat direktori dan file berikut:
-
diff --git a/demos/blog-tutorial/protected/pages/Day4/CreateNewPost.page b/demos/blog-tutorial/protected/pages/Day4/CreateNewPost.page
index 7797efaa..fe36b3ff 100755
--- a/demos/blog-tutorial/protected/pages/Day4/CreateNewPost.page
+++ b/demos/blog-tutorial/protected/pages/Day4/CreateNewPost.page
@@ -51,7 +51,7 @@ We now create two files protected/pages/posts/NewPost.page and prot
-The NewPost page template contains a TTextBox to collect the post title and a THtmlArea to collect the post content. The latter is a WYSIWYG HTML editor. To ensure the user input is valid, we associate validators with these input controls.
+The NewPost page template contains a TTextBox to collect the post title and a THtmlArea to collect the post content. The latter is a WYSIWYG HTML editor. To ensure the user input is valid, we associate validators with these input controls.
-La page EditPost est fournie aux auteurs et administrateurs pour modifier les messages. Comme la page NewPost, elle affiche un formulaire permettant de modifier les données d'un message.
-
-Nous créons deux fichiers protected/pages/posts/EditPost.page et protected/pages/posts/EditPost.php contenant respectivement le gabarit et la classe de notre page.
-
-Le gabarit de la page EditPost est très proche de celui de la page NewPost template. Seul le titre et le texte du bouton sont différents.
-
-La classe de EditPage est un peu plus complexe que celle de la page NewPage parce qu'elle doit lire les informations auparavant. Elle doit aussi vérifier les autorisations. En particulier, elle doit s'assurer que le message ne puisse être modifié que par l'auteur ou par un administrateur. Ces vérifications d'autorisation ne sont pas fournies par PRADO.
-
-Pour tester notre page EditPost, authentifiez-vous auparavant et allez à l'URL http://hostname/blog/index.php?page=EditPost&id=1. Cette URL peut aussi être atteinte par le bouton Modifier de notre page de détail.
-
-La page ListPost affiche les derniers messages sous forme de liste. S'il y a trop de messages, ils seront affichés dans différentes pages.
-
-Avant que nous ne passions à l'implémentation, nous voudrions que notre page d'accueil pointe vers la page à venir ListPost, ceci dans le but d'afficher la liste des derniers messages dès qu'un utilisateur se connecte au site. Pour cela, nous allons modifier le fichier de configuration de l'application protected/application.xml de cette manière.
-
-Nous alons maintenant créer le gabarit et le fichier de classe pour notre page ListPost : protected/pages/posts/ListPost.page et protected/pages/posts/ListPost.php.
-
-Pour satisfaire les fonctionnalités de notre page ListPost, nous allons utiliser deux contrôles dans notre gabarit.
-
-Ci-dessous le contenu du gabarit :
-
-Dans la partie répétée TRepeater, nous indiquons que l'affichage du contenu est délégué à l'élément PostRenderer que nous allons créer après. Pour permettre à PRADO de trouver cette classe, nous fournissons l'espace de noms complet Application.pages.posts.PostRenderer, qui correspond au fichier protected/pages/posts/PostRenderer.php.
-
-Nous définissons aussi quelques propriétés complémentaires du TRepeater pour activer la pagination. Et nous définissons la propriété ControlToPaginate du TPager afin qu'il sache quelle est la zone répetée à paginer.
-
-En fonction du gabarit précédent, nous pouvons voir que notre fichier de classe doit implémenter un gestionnaire d'évènement pour pageChanged() (déclenché par OnPageIndexChanged du TPager). Nous devons aussi remplir les données qui apparaitront dans le TRepeater. Ci-dessous le source complet du fichier de classe :
-
-Nous devons toujours créer la classe PostRenderer. Elle définit la manière dont sera affichée chaque ligne de notre TRepeater. Nous la créons en tant que gabarit de contrôle, ce qui nous permet d'utiliser notre système de gabarit. Le fichier de gabarit ainsi que notre fichier de classe seront sauvegardés respectivement sous PostRenderer.tpl et PostRenderer.php dans le dossier protected/pages/posts.
-
-Le gabarit définit la présentation des différentes informations d'un message : titre, nom, heure, contenu. Nous lions le titre à la page ReadPost qui affiche le détail du message.
-
-L'expression $this->Data fait référence aux données provenant du TRepeater. Dans notre cas, c'est un objet de type PostRecord. Remarquez comment nous accédons au nom de l'auteur du message par $this->Data->author->username.
-
-Auteur:
-<com:TLiteral Text="<%# $this->Data->author->username %>" />
-<com:TLiteral Text="<%# $this->Data->content %>" />
-
-Notre classe est très simple, elle hérite de TRepeaterItemRenderer et ne contient aucun autre code.
-
-Pour tester la page ListPost, naviguons à l'URL http://hostname/blog/index.php (rappellez-vous, nous avons défini ListPost comme étant notre page d'accueil). Nous devrions obtenir le résultat suivant. vu que nous n'avons qu'un seul message pour le moment, le contrôle de pagination n'apparait pas. Plus tard, quand nous aurons fini la page NewPost, nous pourrons ajouter des messages et revenir ici pour tester notre contrôle de pagination.
-
-La page NewPost permet aux utilisateurs authentifiés de créer des nouveaux messages. Elle doit afficher un formulaire permettant la saisie des informations du message.
-
-Parce que la page NewPost ne peut être vue que par les utilisateurs authentifiés, nous ajoutons un fichier de configuration de page config.xml dans le dossier protected/pages/posts. Ce fichier indique que seuls les utilisateurs authentifiés peuvent voir les pages NewPost et EditPost qui sera implémentée dans la section suivante. Tous les autres utilisateurs n'ont accès qu'aux pages ListPost et ReadPost.
-
-Vu le nombre grandissant de pages, nous allons modifier le pied de page de notre gabarit principal pour qu'il inclus des liens vers : la page d'accueil, la page nouvel utilisateur NewUser (visible seulement par les administrateurs), et la page à venir : nouveau message NewPost (visible seulement par les utilisateurs authentifiés).
-
-Nous allons maintenant créer deux fichiers protected/pages/posts/NewPost.page et protected/pages/posts/NewPost.php contenant respectivement le gabarit et la classe de notre page.
-
-Le gabarit de NewPost contient une référence à un TTextBox pour saisir le titre de notre message et à un THtmlArea pour saisir le contenu. Ce dernier est un éditeur WYSIWYG HTML. Pour contrôler les valeurs saisies, nous associons des validateurs aux contrôles précédents.
-
-Dans le gabarit précédent, nous voyons que la fonction principale de notre page est l'appel de la méthode createButtonClicked() implémenté par un évènement OnClick attaché au bouton Ajouter.
-
-Pour tester notre page NewPost, identifiez-vous auparavant et cliquez sur le lien Nouveau message dans le pied de page. Le navigateur affiche le résultat suivant avec comme URL http://hostname/blog/index.php?page=NewPost.
-
-La page ReadPost affiche le détail d'un message. Pour les utilisateurs autorisés, un lien sera disponible permettant de modifier ou de supprimer le message.
-
-Nous créons deux fichiers protected/pages/posts/ReadPost.page et protected/pages/posts/ReadPost.php qui contiendront respectivement notre gabarit et notre classe.
-
-Le gabarit de ReadPost est très proche du gabarit de PostRenderer, chacun d'eux affiche le détail d'un message. La différence est que la page ReadPost doit afficher deux boutons, permettant aux utilisateurs autorisés de modifier ou supprimer le message.
-
-Auteur:
-<com:TLiteral Text="<%= $this->Post->author->username %>" />
-<com:TLiteral Text="<%= $this->Post->content %>" />
-
-Plusieurs expressions PHP sont utilisées dans le gabarit. L'expression $this->Post fait référence à la propriété définie dans la classe de ReadPost. Elle représente l'objet PostRecord correspondant au message actuel.
-
-Nous pouvons aussi remarquer dans le gabarit précédent, que, nos deux boutons sont entourés d'un TControl dont la propriété 'visible' est déterminée par l'expression $this->canEdit(). Pour le bouton Supprimer, nous utilisons une boite de dialogue javascript pour confirmer la suppression du message.
-Nous pouvons aussi remarquer dans le gabarit précédent, que, nos deux boutons sont entourés d'un TControl dont la propriété 'visible' est déterminée par l'expression $this->canEdit(). Pour le bouton Supprimer, nous utilisons une boite de dialogue javascript pour confirmer la suppression du message.
-
-Dans le gabarit précédent, nous voyons que notre classe doit implémenter le gestionnaire d'évènement deletePost() (attaché à l'évènement Onclick de notre bouton Supprimer). Nous devons aussi lire les données du message dont l'ID est passé par un paramètre GET.
-Pour tester notre page ReadPost, allons à l'URL http://hostname/blog/index.php et cliquons sur le titre du seul message affiché. Notre navigateur devrait afficher le résultat suivant avec l'URL http://hostname/blog/index.php?page=ReadPost&id=1. Notez que si vous n'êtes pas connecté, les deux boutons ne sont pas visibles.
-
-Dans cette section, nous allons créer les pages correspondantes à la gestion des messages. En particulier, nous mettrons en place les quatre opérations de base (Création-Lecture-Modification-Suppression) (CRUD:Create-Retrieve-Update-Delete).
-
-Nous allons créer les nouvelles pages dans le dossier protected/pages/posts créé à cet effet.
-
-Après avoir fini cette section, nous devrions obtenir l'arborescence suivante :
-
-Halaman EditPost disediakan bagi para pembuat dan administrator untuk mengedit tulisan blog yang sudah ada. Seperti halaman NewPost , ia menampilkan sebuah formulir untuk mengumpulkan perubahan terhadap judul dan konten tulisan.
-
-Kita membuat dua file protected/pages/posts/EditPost.page dan protected/pages/posts/EditPost.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Template halaman EditPost sangat mirip dengan template NewPost. Hanya judul halaman dan tombol yang berbeda.
-
-Kelas halaman EditPage lebih kompleks dibanding NewPage karena ia perlu mengambil data tulisan yang ditetapkan terlebih dulu. Ia juga perlu melakukan pemeriksaan otorisasi tambahan. Ada kalanya ia perlu memastikan bahwa tulisan hanya bisa diedit oleh pembuat atau administrator. Pemeriksaan otorisasi sudah disediakan oleh PRADO.
-
-Untuk menguji halaman EditPost, masuk lebih dulu dan kemudian kunjungi URL berikut: http://hostname/blog/index.php?page=EditPost&id=1. URL ini juga bisa dijangkau dengan mengklik link Edit pada halaman rician tulisan.
-
-Halaman ListPost menampilkan tulisan blog terakhir dalam sebuah daftar. Jika di sana terlalu banyak tulisan, maka akan ditampilkan dalam beberapa lembar halaman.
-
-Sebelum kita berlanjut dengan implementasi, kita ingin mengarahkan homepage kita ke halaman ListPage mendatang, karena kita ingin para pengguna melihat tulisan terakhir saat mereka menyentuh website. Untuk melakukannya, kita mengubah konfigurasi aplikasi protected/application.xml sebagai berikut,
-
-Sekarang kita membuat file template dan kelas untuk halaman ListPost: protected/pages/posts/ListPost.page dan protected/pages/posts/ListPost.php.
-
-Berdasarkan pada kebutuhan fungsionalitas halaman ListPost, kita akan menggunakan dua kontrol dalam template halaman:
-
-Di bawah ini adalah konten dalam template halaman:
-
-Dalam pengulang, kita menetapkan bahwa konten yang diulang ditampilkan menggunakan penyaji item PostRenderer yang akan kita buat nantinya. Agar PRADO bisa menemukan kelas ini, kita memberikan namespace Application.pages.posts.PostRenderer, berarti file kelasnya adalah protected/pages/posts/PostRenderer.php.
-
-Kita juga menyetel beberapa properti lain pada pengulang untuk menghidupkan lembaran halaman. Dan kita menyetel properti ControlToPaginate pada lembaran agar ia mengetahui konten mana yang diulang harus dibuat lembaran.
-
-Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: pageChanged() (ditempelkan ke event lembaran OnPageIndexChanged). Kita juga perlu mempopulasikan data tulisan ke dalam pengulang berdasarkan pada setelan lembaran saat ini. Berikut ini adalah kode sumber lengkap kelas halaman:
-
-Kita masih perlu untuk membuat kelas penyaji item PostRenderer. Ia mendefinisikan bagaimana setiap tulisan harus ditampilkan dalam pengulang. Kita membuatnya sebagai kontrol template yang membolehkan kita untuk menetapkan penyajian tulisan menggunakan sintaks template fleksibel kita. Template dan file kelas masing-masing disimpan sebagai PostRenderer.tpl dan PostRenderer.php di bawah direktori protected/pages/posts.
-
-Template penyaji menetapkan penyajian berbagai field dalam sebuah tulisan, termasuk judul, nama pembuat, waktu penulisan dan kontennya. Kita me-link judul tulisan ke ReadPost yang menampilkan lebih rinci atas tulisan yang dipilih.
-
-Ekspresi $this->Data merujuk ke item data yang dikirimkan ke pengulang. Dalam kasus kita, ia adalah obyek PostRecord. Perhatikan bagaimana kita mengambil nama pembuat pada tulisan dengan $this->Data->author->username.
-
-Author:
-<com:TLiteral Text="<%# $this->Data->author->username %>" />
-<com:TLiteral Text="<%# $this->Data->content %>" />
-
-Kelas penyaji sangat sederhana. Ia diperluas dari TRepeaterItemRenderer dan tidak berisi kode apapun.
-
-Untuk menguji halaman ListPost, kunjungi URL http://hostname/blog/index.php (ingat kita telah menyetel ListPost sebagai homepage baru kita). Kita akan melihat hasil seperti berikut. Karena kita hanya mempunyai satu tulisan saat ini, lembaran tidak akan muncul. Nantinya ketika menyelesaikan NewPost, kita dapat menambah tulisan lebih banyak dan datang kembali untuk menguji lembaran halaman lagi.
-
-Halaman NewPost disediakan untuk mengotentikasi pengguna untuk pembuatan tulisan blog baru. Ia perlu untuk menampilkan formulir yang mengumpulkan informasi mengenai tulisan baru, termasuk judul tulisan dan konten badan tulisan.
-
-Karena NewPost hanya bisa diakses oleh pengguna terotentikasi, kita menambahkan file konfigurasi config.xml di bawah direktori protected/pages/posts. Konfigurasi menetapkan bahwa para pengguna tidak bisa mengakses NewPost dan EditPost yang akan diperkenalkan dalam bagian berikutnya. Semua pengguna lainnya hanya memiliki akses ke ListPost dan ReadPost
-
-Karena jumlah halaman kita berkembang, kita ingin memodifikasi MainLayout agar dalam footer pada halaman blog kita ada link ke berbagai halaman, termasuk homepage, halaman NewUser (hanya terlihat oleh administrator), dan halaman NewPost mendatang (hanya terlihat oleh pengguna terotentikasi).
-
-Sekarang kita membuat dua file protected/pages/posts/NewPost.page dan protected/pages/posts/NewPost.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Template halaman NewPost berisi TTextBox untuk mengumpulkan judul tulisan dan THtmlArea untuk mengumpulkan konten tulisan. Yang terakhir adalah editor HTML WYSIWYG. Guna memastikan bahwa input pengguna sudah benar, kita mengaitkan validator dengan kontrol input ini.
-
-Dari template halaman di atas, kita melihat bahwa sebagian besar kita perlu menulis sebuah kelas halaman yang mengimplementasikan pengendali event: createButtonClicked() (ditempelkan ke tombo Create dalam event OnClick).
-
-Untuk menguji halaman NewPost, masuk lebih dulu dan klik pada link tombol New Post dalam footer pada homepage. Browser kita akan menampilkan hasil berikut dengan URL http://hostname/blog/index.php?page=NewPost.
-
-Halaman ReadPost menampilkan rincian konten tulisan blog. Untuk para pengguna yang diotorisasi, akan ditampilkan tombol link yang membolehkan mereka untuk mengedit atau menghapus tulisan.
-
-Kita membuat dua file protected/pages/posts/ReadPost.page dan protected/pages/posts/ReadPost.php masing-masing untuk menyimpan template halaman dan kelas halaman.
-
-Template halaman ReadPost sangat mirip dengan template PostRenderer, keduanya menyajikan konten tulisan. Perbedaannya adalah bahwa ReadPost perlu menampilkan dua tombol link ketika pengguna saat ini diotorisasi untuk mengedit atau menghapus tulisan.
-
-Author:
-<com:TLiteral Text="<%= $this->Post->author->username %>" />
-<com:TLiteral Text="<%= $this->Post->content %>" />
-
-Banyak ekspresi PHP dipakai dalam template di atas. Ekspresi $this->Post merujuk ke properti yang didefinisikan dalam kelas halaman ReadPost. Ia mewakili obyek PostRecord yang terkait dengan tulisan yang saat ini sedang dilihat.
-
-Kita juga mencatatan dalam template di atas bahwa dua link tombol dikurung di dalam TControl yang penampakannya ditentukan oleh ekspresi $this->canEdit(). Untuk link tombol Delete, kita menggunakan dialog konfirmasi javascript untuk memperoleh konfirmasi pengguna saat ia mengklik untuk menghapus tulisan.
-
-Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: deletePost() (ditempelkan ke tombol Delete dalam event OnClick). Kita juga perlu untuk mengambil data tulisan yang ditetapkan oleh ID tulisan melalui parameter GET id.
-Untuk menguji halaman ReadPost, kunjungi URL http://hostname/blog/index.php dan klik pada judul tulisan. Browser kita akan menampilkan hasil berikut dengan URL http://hostname/blog/index.php?page=ReadPost&id=1. Catatan, jika kita tidak masuk, dua tombol link tidak akan terlihat.
-
-Pada bagian ini, kita membuat halaman yang terkait dengan manajemen tulisan. Dalam keadaan tertentu, kita mengimplementasikan operasi CRUD (Create-Retrieve-Update-Delete) dengan memperhatikan tulisan blog.
-
-Berdasarkan pada kebutuhan, kita perlu membuat halaman berikut yang diatur di bawah direktori baru protected/pages/posts.
-
-Setelah menyelesaikan bagian ini, kita akan mengharapkan untuk melihat direktori dan file berikut:
-
-For a page that is relatively stable yet frequently accessed, output caching should be considered. Output caching caches the HTML output of selected portions of a page. This may improve the performance of the cached pages significantly.
+For a page that is relatively stable yet frequently accessed, output caching should be considered. Output caching caches the HTML output of selected portions of a page. This may improve the performance of the cached pages significantly.
diff --git a/demos/blog-tutorial/protected/pages/Day5/UseTheme.page b/demos/blog-tutorial/protected/pages/Day5/UseTheme.page
index 21bc9d81..395c8511 100755
--- a/demos/blog-tutorial/protected/pages/Day5/UseTheme.page
+++ b/demos/blog-tutorial/protected/pages/Day5/UseTheme.page
@@ -3,7 +3,7 @@
-PRADO has intrinsic support for themes. By using themes, we can better separate logic and presentation, and we can also change the overall appearance of our blog system more easily.
+PRADO has intrinsic support for themes. By using themes, we can better separate logic and presentation, and we can also change the overall appearance of our blog system more easily.
-Si vous tentez de naviguez à l'URL http://hostname/blog/index.php?page=EditPost&id=100, vous verrez la page d'erreur suivante parce que le message avec l'ID 100 n'existe pas pour le moment. Nous voudrions personnaliser cette page d'erreur de manière à ce qu'elle garde la présentation générale du site. Nous voudrions aussi journaliser cette erreur pour étudier le comportement des utilisateurs. Dans cette section, nous allons mettre en place ces deux fonctionnalités.
-
-PRADO charge de manière implicite un module de gestion d'erreurs. Nous voulons personnaliser ce module pour qu'il affiche une page spécifique pour les erreurs causées par les utilisateurs. Nous modifions donc notre application comme ci-dessous :
-
-La classe BlogErrorHandler comme spécifiée ci-dessus est un nouveau gestionnaire d'erreur que nous allons créer après. Il étend et remplace le module par défaut TErrorHandler.
-
-Nous créons un fichier nommé protected/BlogErrorHandler.php avec le contenu suivant. La classe BlogErrorHandler surcharge deux méthodes de TErrorHandler :
-
-Dans le code précédent, nous spécifions que lorsqu'une exception de type BlogException est générée, nous utilisons le gabarit protected/error.html pour afficher l'erreur. Par ailleurs, nous devons créer la classe BlogException et remplacer toutes les occurrences de THttpException dans notre code (par exemple dans les pages EditUser et ReadPost). Nous devons aussi créer le gabarit protected/error.html. La classe BlogException hérite de THttpException et est vide. Le fichier de classe est enregistré sous protected/BlogException.php.
-
-Ci-dessous le contenu du gabarit protected/error.html. Remarquez que ce gabarit n'est pas un gabarit PRADO, ceci parce qu'il ne reconnait qu'un nombre limité de mots clés, par exemple %%ErrorMessage%%, %%ServerAdmin%%.
- %%ErrorMessage%%
-Une erreur est apparue lors du traitement de votre demande.
-
-Si vous pensez que c'est une erreur de notre serveur, veuillez contacter webmaster.
-
-Dans la méthode handleExternalError() de BlogErrorHandler, nous appelons Prado::log() pour journaliser l'erreur si elle est de type BlogException. L'erreur est stockée en mémoire. Pour enregistrer le journal d'erreur sur un support non volatil, tel que le disque dur ou une base de données, nous devons indiquer à PRADO comment procéder. Ceci est fait par la configuration d'application suivante :
-
-Dans le code ci-dessus, nous ajoutons une "route" pour enregistrer le journal d'erreur dans un fichier. Nous spécifions aussi le filtre de catégorie BlogApplication, de manière à ce que seules les erreurs de type BlogApplication soient sauvegardées. Cette possibilité permet de réduire la taille du journal et d'en améliorer la lisibilité.
-
-Pour voir comme notre blog se comporte suite à une demande invalide, nous naviguons à l'URL http://hostname/blog/index.php?page=posts.ReadPost&id=100. Nous devrions voir la page suivante qui est différente de celle vue précédemment.
-
-Si nous regardons dans le dossier protected/runtime, nous devrions y trouver un fichier nommé prado.log. C'est le journal d'erreur que nous venons juste de paramétrer. Le fichier pourrait contenir quelque chose comme :
-
-Avant le déploiement de notre blog, nous voudrions améliorer les performances.
-
-Une application PRADO peut-être configurée pour fonctionner suivant différents modes. Par défaut, elle fonctionne en mode Debug, mode qui génère beaucoup de message de journalisation et qui, en cas d'erreurs, affiche la pile des appels et l'emplacement de l'erreur. Ce comportement est préférable en cours de développement, mais pas en production. Pour changer le mode de fonctionnement de Debug à Normal ( qui signifie "en production"), nous devons modifier le fichier de configuration de l'application comme ci-dessous :
-
-There are a lot of parsing work involved in a PRADO application: configuration XMLs, templates, theme skins, etc. For every user request, PRADO needs to redo the parsing. To save this effort, we can enable caching. To do so, we modify the application configuration as follows,
-
-Maintenant, après avoir requis n'importe quelle page de notre blog, nous devrions trouver un fichier nommé sqlite3.cache. C'est un fichier de base de données qui mémorise les éléments analysés : gabarits, configurations, etc.
-
-Afficher une page PRADO requiert des dizaines de fichiers PHP, ce qui est une cause de perte de temps. Ces fichiers comportent aussi beaucoup de commentaires qui permettent de générer la documentation des API. Dans le but de réduire ce coût, nous modifions notre fichier index.php et remplaçons prado.php par pradolite.php. Ce dernier est un gros fichier incluant les fichiers PHP nécessaires et dont on a retiré les commentaires.
-
-D'autres techniques sont disponibles pour améliorer les performances d'une application PRADO. D'après notre expérience, un des goulets d'étranglement dans une application Web, est l'accès aux bases de données. Les requêtes en base de données prennent souvent du temps, ce qui dégrade le temps d'affichage d'une page. Le cache est la principale solution à ce problème. Le module de cache activé dans notre fichier de configuration d'application peut aussi être utilisé dans ce but.
-
-Pour une page relativement stable et souvent consultée, le cache de sortie doit être envisagé. Le cache de sortie met en cache les parties sélectionnées d'une page. Ceci peut améliorer les performances des pages mises en cache de manière significative.
-
-Il a été prouvé que les solutions de cache côté serveur étaient très efficaces pour améliorer les performances d'une application PRADO. Par exemple, nous avons observé qu'en utilisant le Zend Optimizer, le RPS (requêtes par seconde) peut être multiplié par 10. Bien sûr, ceci au risque d'avoir des pages périmées, tandis que les solutions de cache de PRADO garantissent la validité des pages fournies.
-
-Nous pouvons finalement déployer notre blog. Pour cela, nous devons juste copier le dossier blog complet vers le dossier du serveur Web. Nous pourrions avoir besoin de modifier index.php pour qu'il puisse trouver le chemin vers l'emplacement où a été installé le framework PRADO.
-
-Nous avons donc fini notre blog. Le processus peut paraitre complexe vu que nous avons passé pas loin de cinq jours pour y arriver. Toutefois, comme nous l'avions dit au début, le but de ce tutoriel est d'aider les développeurs PRADO à appréhender les principales techniques de PRADO.Le tutoriel n'avais pas pour but de finir un blog en cinq minutes, sinon nous n'aurions rien appris.
-
-En résumé, développer une application de gestion de base de données PRADO nécessite les étapes suivantes :
-
-Contrairement à l'ordre de notre tutoriel, la gestion d'erreur et la création des thèmes sont placées au début du processus. Ceci est dû au fait que des changements d'ordre généraux sont la plupart du temps requis. Par exemple, nous avons dû remplacer THttpException par BlogException dans notre tutoriel. Si vous définissez vos feuilles de styles plus tôt, vous pourrez plus facilement les utiliser au cours de la création des gabarits de pages.
-
-Un dernier conseil, essayez de penser orienté objet pendant la phase d'analyse et d'implémentation. Utilisez l'héritage le plus souvent, et vous trouverez que le projet est plus facile à développer en équipe. Il vous sera aussi plus facile de réutiliser votre code et ainsi vos futurs projets seront finis plus rapidement.
- Traduction (laborieuse) par Eric.M, nous pouvez me contacter par message privé ou par email sur le forum PRADO.
-PRADO propose un support intrinsèque des thèmes. En utilisant les thèmes, nous pouvons mieux séparer la logique applicative de la présentation et nous pouvons aussi changer facilement la présentation générale de notre blog.
-
-Nous devons auparavant créer un dossier themes. C'est le dossier parent de tous les thèmes pour une application de PRADO. Chaque sous-dossier devient ainsi un thème dont le nom est le nom du sous-dossier.
-
-Pour créer un thème nommé Basic, nous créons un sous-dossier theme/Basic. Dans ce dossier, nous pouvons mettre des feuilles de styles dépendantes du thème, des fichiers Javascript, des images et des fichiers skins.
-
-Dans le dossier themes/Basic, nous créons un fichier CSS nommé style.css. Quand une page utilise ce thème, PRADO importe automatiquement la feuille de style dans cette page. Le même traitement est appliqué aux fichiers Javascript.
-
-Le contenu du fichier CSS est le suivant :
-
-Nous utilisons des skin pour initialiser les propriétés des contrôles PRADO. Les fichiers skin sont enregistrés avec une extension .skin dans le dossier du thème. Chaque fichier skin peut contenir plusieurs modèles pour un ou plusieurs types de contrôles.
-
-Pour notre test, nous allons créer un fichier skin qui changera la couleur de fond de nos liens dans le pied de page. Nous créons un fichier nommé button.skin dans le dossier du thème themes/Basic.
-
-Le fichier button.skin contient une seule définition pour les contrôles de type THyperLink dont la propriété SkinID est MainMenu. La définition applique une couleur vert-clair comme couleur de fond du contrôle.
-
-En accord avec cette définition, nous modifions notre fichier protected/common/MainLayout.tpl pour appliquer aux liens du pied de page la valeur MainMenu à la propriété SkinID.
-
-Pour utiliser le thème que nous venons juste de créer, nous modifions notre fichier de configuration de l'application comme ci-après. Comme vous pouvez le voir, nous affectons la valeur Basic (le nom du thème) à la priorité Theme pour toutes les pages.
-
-Pour voir la nouvelle présentation de notre site, allons à l'URL http://hostname/blog/index.php. Nous pouvons constater que la mise en page, les polices, les bordures sont modifiées. De même, la couleur de fond des liens en pied de page est vert-clair.
-
-Jika kita mencoba mengakses URL http://hostname/blog/index.php?page=EditPost&id=100, kita akan melihat halaman kesalahan berikut karena tulisan dengan ID 100 belum ada dalam sistem blog kita. Kita ingin mengkustomisasi halaman kesalahan ini agar ia terlihat lebih konsisten dengan tata letak halaman blog lain. Kita juga ingin mencatat jenis kesalahan ini untuk mempelajari kebiasaan pengguna. Dalam bagian ini, kita akan melaksanakan dua tugas ini.
-
-PRADO secara implisit mengambil modul TErrorHandler untuk menangani kesalahan. Kita ingin mengkustomisasi modul ini agar sistem blog kita dapat menampilkan halaman terkustomisasi untuk kesalahan yang disebabkan oleh pengguna-akhir. Selanjutnya memodifikasi konfigurasi aplikasi seperti berikut:
-
-Kelas BlogErrorHandler seperti ditetapkan di atas adalah modul pengendali kesalahan baru as yang akan dibuat berikutnya. Ia memperluas dan mengganti modul standar TErrorHandler.
-
-Kita membuat sebuah file bernama protected/BlogErrorHandler.php seperti berikut. Kelas BlogErrorHandler mengganti dua metode TErrorHandler:
-
-Dalam kode di atas, kita menetapkan bahwa saat BlogException dikeluarkan, kita menggunakan template baru protected/error.html untuk menampilkan kesalahan. Oleh karena itu, kita perlu membuat kelas BlogException dan mengganti semua THttpException yang ada dalam kode kita (seperti misalnya EditUser dan halaman ReadPost). Kita juga perlu membuat template kesalahan protected/error.html. Kelas BlogException memperluas THttpException dan kosong. File kelas disimpan sebagai protected/BlogException.php.
-
-
-Di bawah ini konten dalam template kesalahan kita protected/error.html. Catatan, template bukan template PRADO karena ia hanya mengenal jumlah token yang sangat terbatas, seperti %%ErrorMessage%%, %%ServerAdmin%%.
- %%ErrorMessage%%
-The above error happened when the server was processing your request.
-
-If you think this is a server error, please contact the webmaster.
-
-Dalam metode handleExternalError() pada BlogErrorHandler, kita memanggil Prado::log() untuk mencatat kesalahan jika tipenya adalah BlogException. Kesalahan dicatat dalam memori. Untuk menyimpan catatan ke dalam medium permanen seperti file atau database, kita perlu menghidupkan rute pencatatan kesalahan yang sesuai. Ini dikerjakan dalam konfigurasi aplikasi seperti berikut:
-
-Dalam konfigurasi di atas, kita menambahkan rute log yang menyimpan catatan ke dalam sebuah file. Kita juga menetapkan filter kategori sebagai BlogApplication agar hanya mencatat pesan pada kategori yang dipilih yang disimpan. Ini membantu mengurangi ukuran file catatan dan juga meningkatkan pembacaannya.
-
-Untuk melihat bagaimana sistem blog kita merespon permintaan tidak benar dari pengguna, kita menguji URL http://hostname/blog/index.php?page=posts.ReadPost&id=100. Kita akan melihat halaman kesalahan berikut yang berbeda dari apa yang telah kita lihat sebelumnya.
-
-Jika kita mencari di bawah direktori protected/runtime, kita akan menemukan file bernama prado.log. Ini adalah file log yang baru dikonfigurasi untuk menyimpan pesan kesalahan. File dapat berisi konten seperti berikut,
-
-Sebelum kita menyebarkan sistem blog, kita ingin menyesuaikan performansi sistem.
-
-Aplikasi PRADO dapat dikonfigurasi untuk berjalan dalam mode berbeda. Standarnya, ia berjalan dalam mode debug yang membuat banyak catatan pesan dan seandainya ada kesalahan, menampilkan pangilan stack lengkap atas tempat kesalahan. Perilaku demikian lebih disukai selama pengembangan, tapi tidak jika sistem sudah dalam produksi. Untuk mengubah mode aplikasi dari Debug ke Normal (berarti mode produksi), kita memodifikasi konfigurasi aplikasi seperti berikut:
-
-Ada banyak pekerjaan penguraian terkait dalam sebuah aplikasi PRADO: konfigurasi XML, template, tema, skin, dll. Untuk setiap permintaan pengguna, PRADO perlu melakukan ulang penguraian. Untuk menghemat usaha ini, kita dapat menghidupkan cache. Untuk melakukannya, kita mengubah konfigurasi aplikasi seperti berikut,
-
-Sekarang setelah mengakses setiap halaman dalam sistem blog kita, kita akan dapat menemukan file bernama sqlite3.cache. Ini adalah file database yang memelihara template halaman yang diuraikan, konfigurasi, dll.
-
-Menjalankan halaman PRADO melibatkan puluhan file PHP, yang dapat menghabiskan waktu. File-file ini juga membawa banyak komentar untuk membuat dokumentasi APU ramah-pengguna. Untuk mengurangi beban ini, kita memodifikasi index.php dan mengganti inklusi prado.php dengan pradolite.php. Yang kedua adalah file besar yang dibuat dengan menggabung file kode tertentu dan membuang komentar. Selanjutnya kita bisa mengubah index.php seperti berikut,
-
-Ada teknik lain untuk meningkatkan performansi lebih lanjut terhadap aplikasi PRADO. Berdasarkan pengalaman kami, salah satu lubang botol dalam aplikasi Web adalah database tier. Query database seringkali membutuhkan waktu lama untuk menyelesaikannya, yang memperlambat waktu respon terhadap permintaan sebuah halaman. Cache adalah solusi utama untuk masalah ini. Modul cache yang dihidupkan dalam konfigurasi aplikasi kita juga bisa dipakai untuk keperluan ini.
-
-Untuk halaman yang relatif stabil dan jarang diakses, output caching bisa dipertimbangkan. Output caching melakukan cache output HTML dari bagian yang dipilih pada sebuah halaman. Ini dapat meningkatkan performansi dari halaman yang di-cache secara signifikan.
-
-Teknik cache server terbukti sangat efektif dalam meningkatkan performansi atas aplikasi PRADO. Sebagai contoh, kita telah mengamati bahwa dengan menggunakan Zend Optimizer, RPS (request per second) dari aplikasi PRADO bisa ditingkatkan lebih dari sepuluh kali lipat. Tentu saja, ini pada beban dari output lama, sementara teknik cache PRADO selalu memastikan kebenaran dari output.
-
-Akhirnya kita dapat menyebarkan sistem blog kita. Untuk melakukannya, kita hanya perlu meng-copy seluruh direktori blog directory ke direktori Web sasaran. Kita perlu untuk memodifikasi index.php agar ia dapat mencari path yang benar di mana kerangka kerja PRADO diinstalasi.
-
-Dengan demikian kita telah menyelesaikan sistem blog kita. Proses terlihat tidak gampang karena ia memerlukan hampir lima hari untuk sampai di sini. Akan tetapi, karena kita memulainya dari awal, tujuan utama dari tutorial ini adalah untuk membantu para pengembang PRADO terbiasa dengan teknik yang umum digunakan dalam PRADO. Tutorial tidak berarti menyelesaikan sistem blog dalam waktu lima menit dan selanjutnya tidak mempelajari apapun.
-
-Secara ringkas, mengembangkan aplikasi PRADO dengan kendali-DB melibatkan langkah-langkah berikut:
-
-Tidak seperti urutan dalam tutorial kita, pengendalian kesalahan dan pembuatan tema dikerjakan lebih awal dalam proses di atas. Ini dikarenakan seringkali diperlukan perubahan besar dalam kode kelas dan template. Sebagai contoh, kita perlu mengganti THttpException dengan BlogException dalam tutorial kita. Jika kita mendefinisikan kelas stylesheet lebih awal, kita dapat dengan mudah menggunakannya saat membuat template halaman.
-
-Sebagai tips terakhir, coba untuk berpikir dalam cara terorientasi-obyek selama mendesain dan mengimplementasikan. Gunakan turunan kelas dan komposisi secara luas, dan Anda akan menemukan seluruh proyek lebih mudah dikembangkan secara paralel oleh multipel pengembang. Kode juga lebih banya memiliki kesempatan dipakai ulang agar proyek mendatang dapat diselesaikan dalam waktu yang lebih cepat.
-
-PRADO memiliki dukungan dasar untuk tema. Dengan menggunakan tema, kita dapat memisahkan logika dan penyajian secara lebih baik, dan kita juga bisa mengubah penampilan keseluruhan pada sistem blog kita jauh lebih mudah.
-
-Pertama kita buat direktori baru bernama themes. Ini adalah direktori leluhur bagi semua tema terkait aplikasi PRADO tertentu. Setiap subdirektori di bawah direktori ini yang nama temanya adalah nama subdirektori.
-
-Untuk membuat tema bernama Basic, kita membuat subdirektori theme/Basic. Di bawah direktori ini, kita dapat menempatkan file stylesheet dependen-tema, file Javascript, gambar, dan file skin.
-
-Di bawah direktori themes/Basic, kita membuat sebuah file CSS stylesheet bernama style.css. ketika sebuah halaman menggunakan tema ini, PRADO secara otomatis akan mengimpor stylesheet ini ke halaman. Hal yang sama terjadi untuk file Javascript.
-
-File CSS ditampilkan seperti berikut.
-
-Kita menggunakan skin untuk menginisialisasi properti kontrol PRADO. Skin disimpan sebagai file skin (nama berakhiran .skin) di bawah direktori tema. Setiap file skin bisa berisi multipel skin untuk satu atau beberapa tipe kontrol.
-
-Sebagai pengujian, kita akan mencoba membuat sebuah skin yang mengubah warna latar belakang link tombol dalam footer halaman. Kita membuat sebuah file bernama button.skin di bawah direktori tema themes/Basic.
-
-File skin button.skin hanya berisi satu skin untuk kontrol THyperLink yang properti SkinID-nya adalah MainMenu. Skin menyetel warna latar belakang kontrol ke hijau-terang.
-
-Sejalan dengan itu, kita perlu memodifikasi protected/common/MainLayout.tpl agar link tombol dalam footer menggunakan MainMenu sebagai SkinID-nya.
-
-Untuk menggunakan tema yang baru kita buat, kita memodifikasi konfigurasi aplikasi seperti berikut. Seperti kita lihat, properti Theme untuk semua halaman disetel sebagai Basic, nama tema yang baru saja kita buat.
-
-Untuk melihat bagaimana halaman blog terlihat, kunjungi URL http://hostname/blog/index.php. Kita akan melihat font, tata letak, bingkai beruah dalam halaman. Juga, link tombol dalam footer mempunyai latar belakang hijau terang.
-
-The purpose of this tutorial is to provide new PRADO users a step-by-step guidance on how to develop a blog system using PRADO. Readers of this tutorial are not required to have prior knowledge about PRADO. However, readers should have basic knowledge of object-oriented programming (OOP) and database programming. For a more definitive guidance about PRADO, readers may refer to the Quickstart Tutorial.
+The purpose of this tutorial is to provide new PRADO users a step-by-step guidance on how to develop a blog system using PRADO. Readers of this tutorial are not required to have prior knowledge about PRADO. However, readers should have basic knowledge of object-oriented programming (OOP) and database programming. For a more definitive guidance about PRADO, readers may refer to the Quickstart Tutorial.
@@ -11,7 +11,7 @@ This tutorial is organized in a day-by-day fashion. Each day new PRADO concepts
-In order to follow the tutorial to create and run the day-by-day examples, readers should have access to a Web server installed with PHP 5.1.0+ and PRADO 3.1+. Instructions for installing PRADO can be found at pradosoft.com.
+In order to follow the tutorial to create and run the day-by-day examples, readers should have access to a Web server installed with PHP 5.1.0+ and PRADO 3.1+. Instructions for installing PRADO can be found at project website.
-Le but de ce tutoriel est de fournir aux nouveaux utilisateurs de PRADO, un guide pas à pas sur la façon de développer avec PRADO. Les lecteurs de ce tutoriel n'ont besoin d'aucune connaissance au sujet de PRADO. Par contre, les lecteurs doivent avoir des connaissances de base concernant la programmation orientée objet (POO) et les bases de données. Pour un guide plus exhaustif de PRADO, les lecteurs peuvent se référer au document Quickstart Tutorial.
-
-Ce tutoriel est organisé sous la forme de journées. Chaque journée, des concepts et des techniques nouvelles de PRADO sont abordés et de nouvelles fonctionnalités sont mises en place. A la fin, nous obtiendrons un moteur de Blog simple mettant en place les fonctionnalités suivantes buts à atteindre.
-
-Pour pouvoir suivre ce tutoriel et créer les exemples pas à pas, les lecteurs doivent avoir accès à un serveur Web qui implémente PHP 5.1.0+ et PRADO 3.1+. Les instructions pour installer PRADO peuvent être trouvées ici : pradosoft.com.
-
-Cette page décrit les buts que nous allons nous fixer et développer avec PRADO. Nous n'allons pas mettre en place toutes les fonctionnalités d'un blog (ie : commentaires, organisation des messages, calendrier, etc.), parce que nous voulons garder ce tutoriel aussi court que possible et que nous espérons que ces fonctionnalités seront faciles à mettre en place après avoir fini ce tutoriel.
-
-En général, les blog permettent aux utilisateurs de lire les messages et aux utilisateurs authentifiés de publier des messages. L'outil doit séparer la logique applicative de la couche présentation et il doit supporter le changement de thèmes graphiques.
-
-Tujuan tutorial ini disediakan untuk para pengguna pemula PRADO dengan bimbingan langkah demi langkah terhadap bagaimana untuk mengembangkan sebuah sistem blog menggunakan PRADO. Para pembaca tutorial ini tidak harus memiliki pengetahuan sebelumnya mengenai PRADO. Akan tetapi, para pembaca harus mengetahui dasar dari pemrograman obyek-terorientasi (OOP) dan pemrograman database. Untuk bimbingan definitif mengenai PRADO, para pembaca dapat merujuk ke Tutorial Cepat.
-
-Tutorial ini diatur dengan cara hari demi hari. Setiap haru konsep baru PRADO dan teknik diperkenalkan, dan fitur baru dari sistem blog diimplementasikan. Di akhir, kita akan melengkapi aplikasi blog sederhana yang sesuai dengan daftar persyaratan awal.
-
-Untuk mengikuti tutorial dalam membuat dan menjalankan contoh hari-demi-hari, para pembaca harus mempunyai akses ke server Web yang diinstalasi dengan PHP 5.1.0+ dan PRADO 3.1+. Instruksi untuk menginstalasi PRADO dapat ditemukan di pradosoft.com.
-
-Halaman ini menampilkan persyaratan untuk sistem blog yang akan kami kembangkan dalam tutorial ini menggunakan PRADO. Kami tidak menyertakan beberapa fitur blog populer di sini (misalnya mengkomentari, mengatur tulisan, kalender, dll), karena kami ingin menjaga tutorial cukup pendek dan kami percaya fitur-fitur ini mudah untuk ditambahkan setelah Anda selesai membaca tutorial ini.
-
-Secara umum, sistem blog harus membolehkan para pengguna untuk membaca blog dan pengguna terotentikasi mempublikasikan blog. Ini harus memisahkan penyajian dan logika, dan harus mendukung penggantian tema.
- Benötigt Prado Version <%= $this->Version %> oder neuer. Se requiere la versión de PRADO <%= $this->Version %> o superior. Disponible desde la versión de PRADO <%= $this->Version %>en adelante. Memerlukan Prado versi <%= $this->Version %> atau lebih baru. Tersedia mulai dari Prado versi <%= $this->Version %> dan selanjutnya. Wymaga PRADO w wersji <%= $this->Version %> lub wyższej. Dostępny(a) w PRADO od wersji <%= $this->Version %> i dalej. TActiveButton adalah kontrol aktif selain
-TButton.
-Ketika TActiveButton diklik pada permintaan postback normal, permintaan callback yang diinisiasi. Event OnCallback dimunculkan selama permintaan callback dan dimunculkan setelah event OnClick.
- Ketika properti ActiveControl.EnableUpdate adalah true,
-mengubah properti Text selama permintaan callback akan memutakhirkan
-judul tombol pada sisi-klien. Karena event OnCallback hanya dimunculkan selama permintaan callback, pengendali event OnCallback bisa dipakai untuk menangani logika terutama yang terkait dengan permintaan callback. Pengendali event OnClick dimunculkan kapan saja tombol diklik, meskipun javascript dimatikan. Contoh berikut menggunakan kedua event OnClick dan OnCallback dari TActiveButton. Diagram kelas untuk TActiveButton diilustrasikan dalam gambar berikut.
-Banyak kontrol aktif yang melakukan permintaan callback mempunyai struktur yang mirip.
- TActiveButton adalah ekstensi dari TButton dan mengimplementasikan dua antarmuka tambahan ICallbackEventHandler dan
-IActiveControl. TActiveButton berisi turunan dari
-TBaseActiveCallbackControl
-yang tersedia melalui properti ActiveControl dari TActiveButton.
-Contoh berikut menyetel parameter callback atas TActiveButton saat
-permintaan callback ditampung.
- Dalam metode pengendali event OnCallback, CallbackParameter tersedua di dalam obyek $param. Di dalam properti ActiveControl adalah turunan dari
-TCallbackClientSide yang tersedia sebagai ClientSide dari TActiveButton.
-Properti ClientSide berisi sub-properti, serperti RequestTimeOut, dan pengendali event javascript sisi-klien, seperti OnLoading, dipakai oleh sisi-klien saat membuat permitaan callback.
-Contoh berikut mendemonstrasikan menghidup matikan indikator "loading" saat sisi-klien
-membuat permintaan callback.
- Contoh ini mengambil librari javascript "effects" menggunakan komponen
-TClientScript.
-Nilai properti ClientSide.OnLoading berisi pernyataan javascript yang menggunakan librari "effects" untuk menampilkan tag span "Loading...". Hal yang mirip, nilai properti ClientSide.OnComplete berisi pernyataan javascript yang menyembunyikan tag span "Loading...".
-Lihat TCallbackClientSide untuk rincian lebih jelas pada detil properti sisi-klien.
-
-TActiveCheckBox adalah kontrol aktif selain
-TCheckbox. Properti AutoPostBack
- dari TActiveCheckBox standarnya disetel true.
- Selanjutnya, saat kotak centang diklik, event OnCallback muncul setelah event OnCheckedChanged.
-
- Properti Text dan Checked dari TActiveCheckBox
- bisa diubah selama permintaan callback. Properti TextAlign dari
- TActiveCheckBox tidak bisa diubah saat permintaan
- callback.
- Melakukan validasi kustom hanya menggunakan event validasi OnServerValidate
- sisi-server. Sisi-klien menggunakan callback untuk memunculkan event
- onServerValidate. Properti ClientValidationFunction dimatikan
- dan akan mengeluarkan eksepsi jika mencoba untuk menyetel properti ini.
- Harap berhati-hati onServerValidate dapat
-dimunculkan saat kontrol yang divalidasi pada sisi klien mengubah nilai,
-yaitu validasi server mungkin dipanggil berkali-kali.
-
-Setelah callback atau postback, {@link onServerValidate onServerValidate}
-dimunculkan hanya sekali. Properti IsCallback dari kelas TPage
-menjadi true ketika validasi dibuat selama permintaan callback.
-
-Kontrol aktif selain komponen THyperLink.
-Saat permintaan callback, perubahan terhadap properti Text, ImageUrl,
-NavigateUrl dan Target pada sisi server juga akan
-mengubah atribut serta konten terkait di sisi-klien.
-
-TActivePager membuat halaman yang menyediakan UI untuk pengguna-akhir secara interaktif menetapkan halaman data mana yang di render dalam kontrol turunan TDataBoundControl, seperti TDataList, TRepeater, TCheckBoxList, dll.
-Target kontrol data-bound ditetapkan dengan properti ControlToPaginate, yang harus berupa path ID dari kontrol target yang diambil dari kontainer penamaan halaman. Target-databound harus berada di dalam TActivePanel agar dapat di render ulang selama callback
-
-Catatan, kontrol target data-bound harus disetel true pada AllowPaging. Sebaliknya halaman tidak akan terlihat. Juga, dalam hal ketika hanya satu halaman data yang tersedia, halaman juga tidak akan terlihat.
-
-TActivePager dapat menampilkan salah satu dari tiga jenis antarmuka, ditetapkan melalui properti Mode:
-
-Antar muka pengguna ini selanjutnya dikustomisasi dengan mengkonfigurasi properti berikut
-
-TActivePager memunculkan event OnPageIndexChanged ketika pengguna-akhir berinteraksi dengannya dan menetapkan halaman baru (misalnya dengan mengklik pada tombol halaman berikutnya yang akan membawa ke halaman berikutnya.) Para pengembang dapat menulis pengendali untuk merespon indeks halaman baru ini dan mendapatkan indeks halaman baru yang diinginkan dari properti parameter event NewPageIndex. Menggunakan indeks halaman baru ini, seseorang dapat memask halaman baru data ke kontrol data-bound terkait.
-Sebagai tambahan, TActivePager memunculkan OnCallback setelah OnPageIndexChanged.
- Lihat Pengenalan
-untuk tinjauan cepat terhadap konsep di belakang kontrol aktif (kontrol AJAX-dihidupkan).
-Banyak kontrol aktif memiliki properti
-ActiveControl dan
-sub-properti ClientSide
-yang menyediakan banyak properti untuk mengkustomisasi kontrol. Properti
-CallbackClient dari kelas
-TPage menyediakan metode untuk memutakhirkan dan mengubah konten sisi-klien
-saat permintaan callback. Kontrol aktif bergantung pada koleksi
-kelas javascript.
- Untuk demo cepat atas kontrol aktif, coba kontrol
-TActiveButton. Lihat juga bagian akhir dari tutorial Pengubah Kurs untuk contoh lebih mendalam.
- * tutorial untuk kontrol ini belum lengkap. Tabel berikut memperlihatkan Kontrol Aktif yang dapat memicu event callback dan menentukan apakah kontrol akan memunculkan event PostBack atau tidak jika Javascript dimatikan pada browser sisi-klien. Kelas berikut menyediakan kelas infrastruktur dasar yang diperlukan guna merealisasikan kontrol aktif. Demo ini memperlihatkan komponen dasar yang tersedia dalam PRADO untuk memproses Internasionalisasi dan Lokalisasi aplikasi web. Halam ini memanfaatkan template siap multipel lokal (atau kultur) untuk memperlihatkan halaman terlokalisasi yang tersedia. Untuk melihat versi dilokalisasi yang berbeda, silahkan ganti setelan bahasa dalam browser Anda.
-Saat ini kultur Anda adalah <%= $this->Page->CurrentCulture %>.
-
- Sebagai tambahan ke template siap kultur. Teks dapat dilokalisasi menggunakan banyak sumber terjemanan yang berbeda. PRADO menyediakan wadah gettext, XML, SQLite, dan MySQL untuk menyimpan terjemahan pesan. Contoh dalam link berikut mendemonstrasikan bagaimana teks dapat dilokalisasi menggunakan komponen TTranslate.
- Mengembangkan dan memelihara situs multi-bahasa adalah masalah umum bagi para pengembang web. Fitur berikut didukung oleh PRADO: 本演示將介紹如何用PRADO中的一些部件對您的Web應用進行國際化和本地化。
- 本网頁的顯示是根据您的當地設置從多個不同語言的模板中選擇進行的。
- 如果你想查看其它語言版本,請更改瀏覽器的語言設置。
- 您目前的語言設置是
- <%= $this->Page->CurrentCulture %>.
-
- 除了能自動偵知語言設置的模板外,文本也可以使用不同的翻譯源進行本地化。
- PRADO提供了gettext,XML,SQLite以及MySQL等手段用于存放消息的各种翻譯。
- 下面連接所指向的例子展示了如何使用TTranslate部件對文本進行本地化。
- 開發和維護多語言的站點對Web開發者而言是一個很常見的問題。 PRADO支持以下功能:
-Assets are resource files (such as images, sounds, videos, CSS stylesheets, javascripts, etc.) that belong to specific component classes. Assets are meant to be provided to Web users. For better reusability and easier deployment of the corresponding component classes, assets should reside together with the component class files . For example, a toggle button may use two images, stored in file down.gif and up.gif, to show different toggle states. If we require the image files be stored under images directory under the Web server document root, it would be inconvenient for the users of the toggle button component, because each time they develop or deploy a new application, they would have to manually copy the image files to that specific directory. To eliminate this requirement, a directory relative to the component class file should be used for storing the image files. A common strategy is to use the directory containing the component class file to store the asset files.
-
-Because directories containing component class files are normally inaccessible by Web users, PRADO implements an asset publishing scheme to make available the assets to Web users. An asset, after being published, will have a URL by which Web users can retrieve the asset file.
-
-PRADO provides several methods for publishing assets or directories containing assets:
-
-BE AWARE: Be very careful with assets publishing, because it gives Web users access to files that were previously inaccessible to them. Make sure that you do not publish files that do not want Web users to see.
-
-Asset publishing is managed by the System.Web.TAssetManager module. By default, all published asset files are stored under the [AppEntryPath]/assets directory, where AppEntryPath refers to the directory containing the application entry script. Make sure the assets directory is writable by the Web server process. You may change this directory to another by configuring the BasePath and BaseUrl properties of the TAssetManager module in application configuration,
-
-PRADO uses caching techniques to ensure the efficiency of asset publishing. Publishing an asset essentially requires file copy operation, which is expensive. To save unnecessary file copy operations, System.Web.TAssetManager only publishes an asset when it has a newer file modification time than the published file. When an application runs under the Performance mode, such timestamp checking is also omitted.
-
-ADVISORY: Do not overuse asset publishing. The asset concept is mainly used to help better reuse and redistribute component classes. Normally, you should not use asset publishing for resources that are not bound to any component in an application. For example, you should not use asset publishing for images that are mainly used as design elements (e.g. logos, background images, etc.) Let Web server to directly serve these images will help improve the performance of your application.
-
-We now use the toggle button example to explain the usage of assets. The control uses two image files up.gif and down.gif, which are stored under the directory containing the control class file. When the button is in Up state, we would like to show the up.gif image. This can be done as follows,
-
-In the above, the call $this->getAsset('up.gif') will publish the up.gif image file and return a URL for the published image file. The URL is then rendered as the src attribute of the HTML image tag.
-
-To redistribute ToggleButton, simply pack together the class file and the image files. Users of ToggleButton merely need to unpack the file, and they can use it right away, without worrying about where to copy the image files to.
-
-Autenticación es un proceso de verificacion de alguna persona cuando esta dice ser quien es. Usualmente se utiliza para esto un nombre de usuario y un contraseña, pero podría incluir otros métodos para demostrar su identidad, tales como tarjetas inteligentes, huellas digitales, etc.
-
-Autorización es el proceso de saber si la persona, una vez indetificada, esta permitida a manipular recursos especificos. Esto es comunmente determinado conociendo si la persona tiene un rol especifico que le da acceso a los recursos solicitados.
-
-PRADO proporciona una capa extensible de autenticacion/autirizacion. Como esta descrito en el Ciclo de vida de una aplicacion PRADO, TApplication reserva diversos modulos del ciclo de vida, responsables de la autenticacion y la autorizacion. PRADO proporciona el modulo TAuthManager para este propósito. Los desarrolladores pueden incorporar sus propios modulos de autenticacion/autorizacion (auth) facilmente.
-TAuthManager esta diseñado para ser usado en conjunto con el modulo TUserManager, el cual implementa una base de datos de usuarios de solo lectura (read-only).
-
-When a page request occurs, TAuthManager will try to restore user information from session. If no user information is found, the user is considered as an anonymous or guest user. To facilitate user identity verification, TAuthManager provides two commonly used methods: login() and logout(). A user is logged in (verified) if his username and password entries match a record in the user database managed by TUserManager. A user is logged out if his user information is cleared from session and he needs to re-login if he makes new page requests.
-
-During Authorization application lifecycle, which occurs after Autenticación lifecycle, TAuthManager will verify if the current user has access to the requested page according to a set of authorization rules. The authorization is role-based, i.e., a user has access to a page if 1) the page explicitly states that the user has access; 2) or the user is of a particular role that has access to the page. If the user does not have access to the page, TAuthManager will redirect user browser to the login page which is specified by LoginPage property.
-
-To enable PRADO auth framework, add the TAuthManager module and TUserManager module to application configuration,
-
-In the above, the UserManager property of TAuthManager is set to the users module which is TUserManager. Developers may replace it with a different user management module that is derived from TUserManager.
-
-Authorization rules for pages are specified in page configurations as follows,
-
-An authorization rule can be either an allow rule or a deny rule. Each rule consists of four optional properties:
-
-When a page request is being processed, a list of authorization rules may be available. However, only the first effective rule matching the current user will render the authorization result.
-
-In the above example, anonymous users will be denied from posting to PageID1 and PageID2, while User1 and User2 and all users of role Role1 can access the two pages (in both get and post methods).
-
-Since version 3.1.1, the pages attribute in the authorization rules can take relative page paths with wildcard '*'. For example, pages="admin.Home" refers to the Home page under the admin directory, and pages="admin.*" would refer to all pages under the admin directory and subdirectories.
-
-Also introduced in version 3.1.1 are IP rules. They are specified by a new attribute ips in authorization rules. The IP rules are used to determine if an authorization rule aplies to an end-user according to his IP address. One can list a few IPs together, separated by comma ','. Wildcard '*' can be used in the rules. For example, ips="192.168.0.2, 192.168.1.*" means the rule applies to users whose IP address is 192.168.0.2 or 192.168.1.*. The latter matches any host in the subnet 192.168.1. If the attribute 'ips' is empty, not set or wildcard '*', the corresponding rule will apply to requests coming from any host address.
-
-As aforementioned, TUserManager implements a read-only user database. The user information are specified in either application configuration or an external XML file.
-
-We have seen in the above example that two users are specified in the application configuration. Complete syntax of specifying the user and role information is as follows,
-
-where the roles attribute in user element is optional. User roles can be specified in either the user element or in a separate role element.
-
-TDbUserManager is introduced in v3.1.0. Its main purpose is to simplify the task of managing user accounts that are stored in a database. It requires developers to write a user class that represents the necessary information for a user account. The user class must extend from TDbUser.
-
-To use TDbUserManager, configure it in the application configuration like following:
-
-In the above, UserClass specifies what class will be used to create user instance. The class must extend from TDbUser. ConnectionID refers to the ID of a TDataSourceConfig module which specifies how to establish database connection to retrieve user information.
-
-The user class has to implement the two abstract methods in TDbUser: validateUser() and createUser(). Since user account information is stored in a database, the user class may make use of its DbConnection property to reach the database.
-
-Since 3.1.1, TAuthManager provides support to allow remembering login by setting AllowAutoLogin to true. Accordingly, TDbUser adds two methods to facilitate the implementation of this feature. In particular, two new methods are introduced: createUserFromCookie() and saveUserToCookie(). Developers should implement these two methods if remembering login is needed. Below is a sample implementation:
-
-Collection is a basic data structure in programming. In traditional PHP programming, array is used widely to represent collection data structure. A PHP array is a mix of cardinal-indexed array and hash table.
-
-To enable object-oriented manipulation of collections, PRADO provides a set of powerful collection classes. Among them, the TList and TMap are the most fundamental and usually serve as the base classes for other collection classes. Since many PRADO components have properties that are of collection type, it is very important for developers to master the usage of PRADO collection classes.
-
-A TList object represents a cardinal-indexed array, i.e., an array (object) with the index 0, 1, 2, ...
-
-TList may be used like a PHP array. For example,
-
-To obtain the number of items in the list, use the Count property. Note, do not use count($list), as it always returns 1.
-
-In addition, TList implements a few commonly used convenient methods for manipulating the data in a list. These include
-
-As aforementioned, many PRADO component properties are based on TList or TList-derived collection classes. These properties all share the above usages.
-
-For example, TControl (the base class for all PRADO controls) has a property called Controls which represents the collection of child controls. The type of Controls is TControlCollection which extends TList. Therefore, to append a new child control, we can use the following,
-
-To traverse through the child controls, we can use,
-
-Another example is the Items property, available in list controls, TRepeater, TDataList and TDataGrid. In these controls, the ancestor class of Items is TList.
-
-Often, we want to extend TList to perform additional operations for each addition or removal of an item. The only methods that the child class needs to override are insertAt() and removeAt(). For example, to ensure the list only contains items that are of TControl type, we can override insertAt() as follows,
-
-A TMap object represents a hash table (or we say string-indexed array).
-
-Similar to TList, TMap may be used like an array,
-
-The Count property gives the number of items in the map while the Keys property returns a list of keys used in the map.
-
-The following methods are provided by TMap for convenience,
-
-TAttributeCollection is a special class extending from TMap. It is mainly used by the Attributes property of TControl.
-
-Note, in the above $collection does NOT have a Label property.
-
-Unlike TMap, keys in TAttributeCollection are case-insensitive. Therefore, $collection->Label is equivalent to $collection->LABEL.
-
-Because of the above new features, when dealing with the Attributes property of controls, we may take advantage of the subproperty concept and configure control attribute values in a template as follows,
-
-which adds an attribute named onclick to the TButton control.
-
-PRADO provides a complete error handling and reporting framework based on the PHP 5 exception mechanism.
-
-Errors occur in a PRADO application may be classified into three categories: those caused by PHP script parsing, those caused by wrong code (such as calling an undefined function, setting an unknown property), and those caused by improper use of the Web application by client users (such as attempting to access restricted pages). PRADO is unable to deal with the first category of errors because they cannot be caught in PHP code. PRADO provides an exception hierarchy to deal with the second and third categories.
-
-All errors in PRADO applications are represented as exceptions. The base class for all PRADO exceptions is TException. It provides the message internationalization functionality to all system exceptions. An error message may be translated into different languages according to the user browser's language preference.
-
-Exceptions raised due to improper usage of the PRADO framework inherit from TSystemException, which can be one of the following exception classes:
-
-Errors due to improper usage of the Web application by client users inherit from TApplicationException.
-
-Raising exceptions in PRADO has no difference than raising a normal PHP exception. The only thing matters is to raise the right exception. In general, exceptions meant to be shown to application users should use THttpException, while exceptions shown to developers should use other exception classes.
-
-Exceptions raised during the runtime of PRADO applications are captured by System.Exceptions.TErrorHandler module. Different output templates are used to display the captured exceptions. THttpException is assumed to contain error messages that are meant for application end users and thus uses a specific group of templates. For all other exceptions, a common template shown as follows is used for presenting the exceptions.
-
-Developers can customize the presentation of exception messages. By default, all error output templates are stored under framework/Exceptions/templates. The location can be changed by configuring TErrorHandler in application configuration,
-
-THttpException uses a set of templates that are differentiated according to different StatusCode property value of THttpException. StatusCode has the same meaning as the status code in HTTP protocol. For example, a status code equal to 404 means the requested URL is not found on the server. The StatusCode value is used to select which output template to use. The output template files use the following naming convention:
-
-where status code refers to the StatusCode property value of THttpException, and language code must be a valid language such as en, zh, fr, etc. When a THttpException is raised, PRADO will select an appropriate template for displaying the exception message. PRADO will first locate a template file whose name contains the status code and whose language is preferred by the client browser window. If such a template is not present, it will look for a template that has the same status code but without language code.
-
-The naming convention for the template files used for all other exceptions is as follows,
-
-Again, if the preferred language is not found, PRADO will try to use exception.html, instead.
- Many web application built with PHP will not have internationalization in mind when it was first written. It may be that it was not intended for use in languages and cultures. Internationalization is an important aspect due to the increase adoption of the Internet in many non-English speaking countries. The process of internationalization and localization will contain difficulties. Below are some general guidelines to internationalize an existing application. Identify and separate data that varies with culture. The most obvious are text/string/message. Other type of data should also be considered. The following list categorize some examples of culture sensitive data
- If possible all manner of text should be isolated and store in a persistence format. These text include, application error messages, hard coded strings in PHP files, emails, static HTML text, and text on form elements (e.g. buttons). To enable the localization features in PRADO, you need to add a few configuration options in your application configuration.
-First you need to include the System.I18N.* namespace to your paths.
- Then, if you wish to translate some text in your application, you need to add one translation message data source. Where source in translation is the dot path to a directory
-where you are going to store your translate message catalogue. The autosave
-attribute if enabled, saves untranslated messages back into the message catalogue.
-With cache enabled, translated messages are saved in the application runtime/i18n directory.
-The marker value is used to surround any untranslated text.
- With the configuration complete, we can now start to localize your application. If you have autosave enabled, after running your application with some localization activity (i.e. translating some text), you will see a directory and a messages.xml created within your source directory. The translation message catalogue file, if using type="XLIFF", is a standardized translation message interchange XML format. You can edit the XML file using any UTF-8 aware editor. The format of the XML is something like the following. Once globalization is enabled, you can access the globalization settings, such as, Culture, Charset, etc, using You also change the way the culture is determined by changing the class attribute in the module configuration. For example, to set the culture that depends on the browser settings, you can use the TGlobalizationAutoDetect class.
- You may also provide your own globalization class to change how the application culture is set.
-Lastly, you can change the globalization settings on page by page basis using template control tags. For example, changing the Culture to "zh". The localize function searches for a translated string that matches original from your translation source. First, you need to locate all the hard coded text in PHP that are displayed or sent to the end user. The following example localizes the text of the $sender (assuming, say, the sender is a button). The original code before localization is as follows.
- The hard coded message "Hello, world!" is to be localized using the localize function. Compound messages can contain variable data. For example, in the message "There are 12 users online.", the integer 12 may change depending on some data in your application. This is difficult to translate because the position of the variable data may be difference for different languages. In addition, different languages have their own rules for plurals (if any) and/or quantifiers. The following example can not be easily translated, because the sentence structure is fixed by hard coding the variable data within message. Where the second parameter in localize takes an associative array with the key as the substitution to find in the text and replaced it with the associated value.
-The localize function does not solve the problem of localizing languages that have plural forms, the solution is to use TChoiceFormat. The following sample demonstrates the basics of localization in PRADO. Messages and strings can be localized in PHP or in templates.
-To translate a message or string in the template, use TTranslate. TTranslate can also perform string substitution.
-The Parameters property can be use to add name values pairs for substitution. Substrings in the translation enclosed with "{" and "}" are consider as the
- parameter names during substitution lookup. The following example will substitute the substring "{time}" with the value of the parameter attribute "Parameters.time=<%= time() %>".
- A short for TTranslate is also provided using the following syntax. where string will be translated to different languages according to the end-user's language preference. This syntax can be used with attribute values as well. Formatting localized date and time is straight forward. The Pattern property accepts 4 predefined localized date patterns and 4 predefined localized time patterns.
-The predefined can be used in any combination. If using a combined predefined pattern,
-the first pattern must be the date, followed by a space, and lastly the time pattern.
-For example, full date pattern with short time pattern. The actual ordering of the
-date-time and the actual pattern will be determine automatically from locale data specified
-by the Culture property. You can also specify a custom pattern using the following sub-patterns.
-The date/time format is specified by means of a string time pattern. In this pattern, all ASCII letters are reserved as pattern letters, which are defined as the following:
- The count of pattern letters determine the format. (Text): 4 letters uses full form, less than 4, use short or abbreviated form
-if it exists. (e.g., "EEEE" produces "Monday", "EEE" produces "Mon") (Number): the minimum number of digits. Shorter numbers are zero-padded
- to this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is
- handled specially; that is, if the count of 'y' is 2, the Year will be
- truncated to 2 digits. (e.g., if "yyyy" produces "1997", "yy" produces "97".)
- Unlike other fields, fractional seconds are padded on the right with zero. (Text and Number): 3 or over, use text, otherwise use number. (e.g.,
-"M" produces "1", "MM" produces "01", "MMM" produces "Jan", and "MMMM"
-produces "January".) Any characters in the pattern that are not in the ranges of ['a'..'z']
-and ['A'..'Z'] will be treated as quoted text. For instance, characters
-like ':', '.', ' ', and '@' will appear in the resulting time text
-even they are not embraced within single quotes. Examples using the US locale:
-
- If the Value property is not specified, the current date and time is used. PRADO's Internationalization framework provide localized currency formatting and number formatting. Please note that the TNumberFormat component provides formatting only, it does not perform current conversion or exchange. Numbers can be formatted as currency, percentage, decimal or scientific
-numbers by specifying the Type attribute. The valid types are: Culture and Currency properties may be specified to format locale specific numbers. If someone from US want to see sales figures from a store in
-Germany (say using the EURO currency), formatted using the german
- currency, you would need to use the attribute Culture="de_DE" to get
-the currency right, e.g. 100,00$. The decimal and grouping separator is
-then also from the de_DE locale. This may lead to some confusion because
-people from US uses the "," (comma) as thousand separator. Therefore a Currency
-attribute is available, so that the output from the following example results in $100.00
- The Pattern property determines the number of digits, thousand grouping
-positions, the number of decimal points and the decimal position. The actual characters that
-are used to represent the decimal points and thousand points are culture specific
-and will change automatically according to the Culture property. The valid
-Pattern characters are:
-For example, consider the Value="1234567.12345" and
-with Culture="en_US" (which uses "," for thousand point separator and "." for decimal separators).
- Compound messages, i.e., string substitution, can be accomplished with TTranslateParameter.
-In the following example, the strings "{greeting}" and "{name}" will be replace
-with the values of "Hello" and "World", respectively.The substitution string must be enclose with "{" and "}". The parameters can be further translated by using TTranslate.
-
- Using the localize function or TTranslate component to translate messages does not inform the translator the cardinality of the data required to determine the correct plural structure to use. It only informs them that there is a variable data, the data could be anything. Thus, the translator will be unable to determine with respect to the substitution data the correct plural, language structure or phrase to use . E.g. in English, to translate the sentence, "There are {number} of apples.", the resulting translation should be different depending on the number of apples. The TChoiceFormat component performs message/string choice translation. The following example demonstrated a simple 2 choice message translation. In the above example, the Value "1" (one), thus the translated string
-is "One Apple". If the Value was "2", then it will show "Two Apples". The message/string choices are separated by the pipe "|" followed by a set notation of the form. Any non-empty combinations of the delimiters of square and round brackets are acceptable.
-The string chosen for display depends on the Value property. The Value is evaluated for each set until the Value is found to belong to a particular set.
-PRADO provides a highly flexible and extensible logging functionality. Messages logged can be classified according to log levels and message categories. Using level and category filters, the messages can be further routed to different destinations, such as files, emails, browser windows, etc. The following diagram shows the basic architecture of PRADO logging mechanism,
-
-The following two methods are provided for logging messages in PRADO,
-
-The difference between Prado::log() and Prado::trace() is that the latter automatically selects the log level according to the application mode. If the application is in Debug mode, stack trace information is appended to the messages. Prado::trace() is widely used in the core code of the PRADO framework.
-
-Messages logged using the above two functions are kept in memory. To make use of the messages, developers need to route them to specific destinations, such as files, emails, or browser windows. The message routing is managed by System.Util.TLogRouter module. When plugged into an application, it can route the messages to different destination in parallel. Currently, PRADO provides three types of routes:
-
-To enable message routing, plug in and configure the TLogRouter module in application configuration,
-
-In the above, the Levels and Categories specify the log and category filters to selectively retrieve the messages to the corresponding destinations.
-
-Messages can be filtered according to their log levels and categories. Each log message is associated with a log level and a category. With levels and categories, developers can selectively retrieve messages that they are interested on.
-
-Log levels defined in System.Util.TLogger include : DEBUG, INFO, NOTICE, WARNING, ERROR, ALERT, FATAL. Messages can be filtered according log level criteria. For example, if a filter specifies WARNING and ERROR levels, then only those messages that are of WARNING and ERROR will be returned.
-
-Message categories are hierarchical. A category whose name is the prefix of another is said to be the ancestor category of the other category. For example, System.Web category is the ancestor of System.Web.UI and System.Web.UI.WebControls categories. Messages can be selectively retrieved using such hierarchical category filters. For example, if the category filter is System.Web, then all messages in the System.Web are returned. In addition, messages in the child categories, such as System.Web.UI.WebControls, are also returned.
-
-By convention, the messages logged in the core code of PRADO are categorized according to the namespace of the corresponding classes. For example, messages logged in TPage will be of category System.Web.UI.TPage.
-
-Pages in a Web application often share common portions. For example, all pages of this tutorial application share the same header and footer portions. If we repeatedly put header and footer in every page source file, it will be a maintenance headache if in future we want to something in the header or footer. To solve this problem, PRADO introduces the concept of master and content. It is essentially a decorator pattern, with content being decorated by master.
-
-Master and content only apply to template controls (controls extending TTemplateControl or its child classes). A template control can have at most one master control and one or several contents (each represented by a TContent control). Contents will be inserted into the master control at places reserved by TContentPlaceHolder controls. And the presentation of the template control is that of the master control with TContentPlaceHolder replaced by TContent.
-
-For example, assume a template control has the following template:
-
-which uses MasterControl as its master control. The master control has the following template,
-
-Then, the contents are inserted into the master control according to the following diagram, while the resulting parent-child relationship can be shown in the next diagram. Note, the template control discards everything in the template other than the contents, while the master control keeps everything and replaces the content placeholders with the contents according to ID matching.
-
-Master is very similar to external templates which are introduced since version 3.0.5. A special include tag is used to include an external template file into a base template.
-
-Both master and external template can be used to share common contents among pages. A master is a template control whose template contains the common content and whose class file contains the logic associated with the master. An external template, on the other hand, is a pure template file without any class files.
-
-Therefore, use master control if the common content has to be associated with some logic, such as a page header with search box or login box. A master control allows you to specify how the common content should interact with end users. If you use external templates, you will have to put the needed logic in the page or control class who owns the base template.
-
-Performancewise, external template is lighter than master as the latter is a self-contained control participating the page lifecycles, while the former is used only when the template is being parsed.
-
-Performance of Web applications is affected by many factors. Database access, file system operations, network bandwidth are all potential affecting factors. PRADO tries in every effort to reduce the performance impact caused by the framework.
-
-PRADO provides a generic caching technique used by in several core parts of the framework. For example, when caching is enabled, TTemplateManager will save parsed templates in cache and reuse them in the following requests, which saves time for parsing templates. The TThemeManager adopts the similar strategy to deal with theme parsing.
-
-Enabling caching is very easy. Simply add the cache module in the application configuration, and PRADO takes care of the rest.
-
-Developers can also take advantage of the caching technique in their applications. The Cache property of TApplication returns the plugged-in cache module when it is available. To save and retrieve a data item in cache, use the following commands,
-
-where $keyName should be a string that uniquely identifies the data item stored in cache.
-
-Since v3.1.0, a new control called TOutputCache has been introduced. This control allows users to selectively cache parts of a page's output. When used appropriately, this technique can significant improve pages' performance because the underlying controls are not created at all if the cached versions are hit.
-
-Including many PHP script files may impact application performance significantly. PRADO classes are stored in different files and when processing a page request, it may require including tens of class files.To alleviate this problem, in each PRADO release, a file named pradolite.php is also included. The file is a merge of all core PRADO class files with comments being stripped off and message logging removed.
-
-To use pradolite.php, in your application entry script, replace the inclusion of prado.php with pradolite.php.
-
-Application mode also affects application performance. A PRADO application can be in one of the following modes: Off, Debug, Normal and Performance. The Debug mode should mainly be used during application development, while Normal mode is usually used in early stage after an application is deployed to ensure everything works correctly. After the application is proved to work stably for some period, the mode can be switched to Performance to further improve the performance.
-
-The difference between Debug, Normal and Performance modes is that under Debug mode, application logs will contain debug information, and under Performance mode, timestamp checking is not performed for cached templates and published assets. Therefore, under Performance mode, application may not run properly if templates or assets are modified. Since Performance mode is mainly used when an application is stable, change of templates or assets are not likely.
-
-To switch application mode, configure it in application configuration:
-
-By default, PRADO stores page state in hidden fields of the HTML output. The page state could be very large in size if complex controls, such as TDataGrid, is used. To reduce the size of the network transmitted page size, two strategies can be used.
-
-First, you may disable viewstate by setting EnableViewState to false for the page or some controls on the page if they do not need user interactions. Viewstate is mainly used to keep track of page state when a user interacts with that page/control.
-
-Second, you may use a different page state storage. For example, page state may be stored in session, which essentially stores page state on the server side and thus saves the network transmission time. The StatePersisterClass property of the page determines which state persistence class to use. By default, it uses System.Web.UI.TPageStatePersister to store persistent state in hidden fields. You may modify this property to a persister class of your own, as long as the new persister class implements the IPageStatePersister interface. You may configure this property in several places, such as application configuration or page configuration using <pages> or <page> tags,
-
-Note, in the above the SpecialPage will use MyPersister2 as its persister class, while the rest pages will use MyPersister1. Therefore, you can have different state persister strategies for different pages.
-
-Server caching techniques are proven to be very effective in improving the performance of PRADO applications. For example, we have observed that by using Zend Optimizer, the RPS (request per second) of a PRADO application can be increased by more than ten times. Of course, this is at the cost of stale output, while PRADO's caching techniques always ensure the correctness of the output.
-
- If you are a web developer and come from the same place I do, you have probably
- used quite a bit of Javascript in your web pages, mostly as UI glue.
-
-
- Until recently, I knew that Javascript had more OO capabilities than I was employing,
- but I did not feel like I needed to use it. As the browsers started to support a more
- standardized featureset of Javascript and the DOM, it became viable to write more
- complex and functional code to run on the client. That helped giving birth to the
- AJAX phenomena.
-
- As we all start to learn what it takes to write our cool, AJAX applications, we begin
- to notice that the Javascript we used to know was really just the tip of the iceberg.
- We now see Javascript being used beyond simple UI chores like input validation and frivolous
- tasks. The client code now is far more advanced and layered, much like a real desktop
- application or a client-server thick client. We see class libraries, object models,
- hierarchies, patterns, and many other things we got used to seeing only in our server
- side code.
-
- In many ways we can say that suddenly the bar was put much higher than before. It takes
- a heck lot more proficiency to write applications for the new Web and we need to improve
- our Javascript skills to get there.
- If you try to use many of the existing javascript libraries out there, like
- Prototype.js,
- Scriptaculous,
- moo.fx,
- Behaviour,
- YUI,
- etc you'll eventually find yourself reading the JS code. Maybe because you want
- to learn how they do it, or because you're curious, or more often because that's the
- only way to figure out how to use it, since documentation does not seem to be highly
- regarded with most of these libraries. Whatever the case may be, you'll face some
- kung-fu techniques that will be foreign and scary if you haven't seen anything like
- that before.
-
- The purpose of this article is precisely explaining the types of constructs that
- many of us are not familiar with yet.
-
- JavaScript Object Notation (JSON,) is one of the new
- buzzwords popping up around the AJAX theme. JSON, simply put, is a way of
- declaring an object in Javascript. Let's see an example right away and note
- how simple it is.
-
- Let's just add little bit of formatting so it looks more like how we usually find out there:
-
- Here we created a reference to an object with two properties (color
- and legCount) and a method (communicate.)
- It's not hard to figure out that the object's properties and methods
- are defined as a comma delimited list. Each of the members is introduced by name, followed
- by a colon and then the definition. In the case of the properties it is easy, just the value
- of the property. The methods are created by assigning an anonymous function, which we will
- explain better down the line.
- After the object is created and assigned to the variable myPet,
- we can use it like this:
-
- You'll see JSON used pretty much everywhere in JS these days, as arguments to functions,
- as return values, as server responses (in strings,) etc.
-
- This might be unusual to developers that never thought about that, but in JS a function is
- also an object. You can pass a function around as an argument to another function just like
- you can pass a string, for example. This is extensively used and very handy.
-
- Take a look at this example. We will pass functions to another function that will use them.
-
- Note that we pass myDog.bark and myCat.meow without appending parenthesis
- "()" to them. If we did that we would not be passing
- the function, rather we would be calling the method and passing the return value,
- undefined in both cases here.
-
- If you want to make my lazy cat start barking, you can easily do this:
-
- The following two lines in JS do the same thing.
-
- As I'm sure you already know, you can access individual items in an array
- by using the square brackets:
-
-
- But you are not limited to numeric indices. You can access any member of a JS
- object by using its name, in a string. The following example creates an empty
- object, and adds some members by name.
-
- The above code has identical effect as the following:
-
- In many ways, the idea of objects and associative arrays (hashes) in JS are not
- distiguishable. The following two lines do the same thing too.
-
-
- The great power of object oriented programming languages derive from the use
- of classes. I don't think I would have guessed how classes are defined in JS
- using only my previous experience with other languages. Judge for yourself.
-
- Let's see how we add a method to our Pet class. We will be using the
- prototype property that all classes have. The prototype
- property is an object that contains all the members that any object of the class will have.
- Even the default JS classes, like String, Number,
- and Date have a prototype object that we
- can add methods and properties to and make any object of that class automatically gain this new member.
-
- That's when a library like prototype.js comes in
- handy. If we are using prototype.js, we can make our code look cleaner (at least in my opinion.)
-
- If you have never worked with languages that support closures
- you may find the following idiom too funky.
-
-
- Whoa! Let's explain what is going on here before you decide I've gone too
- far and navigate to a better article than this one.
-
- First of all, in the above example we are using the prototype.js library, which
- adds the each function to the Array class. The each function accepts one
- argument that is a function object. This function, in turn, will be called once
- for each item in the array, passing two arguments when called, the item and the index
- for the current item. Let's call this function our iterator function.
- We could have also written the code like this.
-
- But then we would not be doing like all the cool kids in school, right?
- More seriously, though, this last format is simpler to understand but causes
- us to jump around in the code looking for the myIterator function. It's nice
- to have the logic of the iterator function right there in the same place
- it's called. Also, in this case, we will not need the iterator function anywhere
- else in our code, so we can transform it into an anonymous function without penalty.
-
-
- One of the most common troubles we have with JS when we start writing our code
- it the use of the this keyword. It could be a real
- tripwire.
-
- As we mentioned before, a function is also an object in JS, and sometimes we
- do not notice that we are passing a function around.
-
- Take this code snippet as an example.
-
- Because the buttonClicked function is defined outside any object we may tend to
- think the this keyword will contain a reference to
- the window or document
- object (assuming this code is in the middle of an HTML page viewed in a browser.)
-
- But when we run this code we see that it works as intended and displays the id of
- the clicked button. What happened here is that we made the onclick method of each button contain the
- buttonClicked object reference, replacing whatever was there before. Now
- whenever the button is clicked, the browser will execute something similar to the following line.
-
-
- That isn't so confusing afterall, is it? But see what happens you start having other
- objects to deal with and you want to act on these object upon events like the button's click.
-
- So you think, nice, now I can click the Clear button on my page and those three text boxes
- will be emptied. Then you try clicking the button only to get a runtime error. The error
- will be related to (guess what?) the this keyword.
- The problem is that this.formFields is not defined if
- this contains a referece to the button, which is
- precisely what's happening. One quick solution would be to rewrite our last line of code.
-
- That way we create a brand new function that calls our helper method within the helper object's context.
- The javascript libraries distributed with Prado can be found in the
-framework/Web/Javascripts/source directory. The packages.php
-file in that directory defines a list of available package names available
-to be loaded. They can be loaded as follows.
- The dependencies for each library are automatically resolved. Components
-that require a particular library will also automatically load the necessary libraries.
-For example, if you add a TDatePicker component on the page, the datepicker
-and its dependencies will be automatically included on the page. See TClientScript for options of adding
- your custom Javascript code to the page.
-Viewstate lies at the heart of PRADO. Viewstate represents data that can be used to restore pages to the state that is last seen by end users before making the current request. By default, PRADO uses hidden fields to store viewstate information.
-
-It is extremely important to ensure that viewstate is not tampered by end users. Without protection, malicious users may inject harmful code into viewstate and unwanted instructions may be performed when page state is being restored on server side.
-
-To prevent viewstate from being tampered, PRADO enforces viewstate HMAC (Keyed-Hashing for Message Authentication) check before restoring viewstate. Such a check can detect if the viewstate has been tampered or not by end users. Should the viewstate is modified, PRADO will stop restoring the viewstate and return an error message.
-
-HMAC check requires a private key that should be secret to end users. Developers can either manually specify a key or let PRADO automatically generate a key. Manually specified key is useful when the application runs on a server farm. To do so, configure TSecurityManager in application configuration,
-
-HMAC check does not prevent end users from reading the viewstate content. An added security measure is to encrypt the viewstate information so that end users cannot decipher it. To enable viewstate encryption, set the EnableStateEncryption of pages to true. This can be done in page configurations or in page code. Note, encrypting viewstate may degrade the application performance. A better strategy is to store viewstate on the server side, rather than the default hidden field.
-
-Cross site scripting (also known as XSS) occurs when a web application gathers malicious data from a user. Often attackers will inject JavaScript, VBScript, ActiveX, HTML, or Flash into a vulnerable application to fool other application users and gather data from them. For example, a poorly design forum system may display user input in forum posts without any checking. An attacker can then inject a piece of malicious JavaScript code into a post so that when other users read this post, the JavaScript runs unexpectedly on their computers.
-
-One of the most important measures to prevent XSS attacks is to check user input before displaying them. One can do HTML-encoding with the user input to achieve this goal. However, in some situations, HTML-encoding may not be preferable because it disables all HTML tags.
-
-PRADO incorporates the work of SafeHTML and provides developers with a useful component called TSafeHtml. By enclosing content within a TSafeHtml component tag, the enclosed content are ensured to be safe to end users. In addition, the commonly used TTextBox has a SafeText property which contains user input that are ensured to be safe if displayed directly to end users.
-
-Protecting cookies from being attacked is of extreme important, as session IDs are commonly stored in cookies. If one gets hold of a session ID, he essentially owns all relevant session information.
-
-There are several countermeasures to prevent cookies from being attacked.
-
-PRADO implements a cookie validation scheme that prevents cookies from being modified. In particular, it does HMAC check for the cookie values if cookie validation is enable.
-
-Cookie validation is disabled by default. To enable it, configure the THttpRequest module as follows,
-
-To make use of cookie validation scheme provided by PRADO, you also need to retrieve cookies through the Cookies collection of THttpRequest by using the following PHP statements,
-
-To send cookie data encoded with validation information, create new THttpCookie objects and add them to the Cookies collection of THttpResponse,
-
-Web applications often need to remember what an end user has done in previous page requests so that the new page request can be served accordingly. State persistence is to address this problem. Traditionally, if a page needs to keep track of user interactions, it will resort to session, cookie, or hidden fields. PRADO provides a new line of state persistence schemes, including view state, control state, and application state.
-
-View state lies at the heart of PRADO. With view state, Web pages become stateful and are capable of restoring pages to the state that end users interacted with before the current page request. Web programming thus resembles to Windows GUI programming, and developers can think continuously without worrying about the round trips between end users and the Web server. For example, with view state, a textbox control is able to detect if the user input changes the content in the textbox.
-
-View state is only available to controls. View state of a control can be disabled by setting its EnableViewState property to false. To store a variable in view state, call the following,
-
-where $this refers to the control object, Caption is a unique key identifying the $caption variable stored in viewstate. To retrieve the variable back from view state, call the following,
-
-Control state is like view state in every aspect except that control state cannot be disabled. Control state is intended to be used for storing crucial state information without which a page or control may not work properly.
-
-To store and retrieve a variable in control state, use the following commands,
-
-Application state refers to data that is persistent across user sessions and page requests. A typical example of application state is the user visit counter. The counter value is persistent even if the current user session terminates. Note, view state and control state are lost if the user requests for a different page, while session state is lost if the user session terminates.
-
-To store and retrieve a variable in application state, use the following commands,
-
-PRADO encapsulates the traditional session management in THttpSession module. The module can be accessed from within any component by using $this->Session, where $this refers to the component object.
-
-Themes in PRADO provide a way for developers to provide a consistent look-and-feel across an entire web application. A theme contains a list of initial values for properties of various control types. When applying a theme to a page, all controls on that page will receive the corresponding initial property values from the theme. This allows themes to interact with the rich property sets of the various PRADO controls, meaning that themes can be used to specify a large range of presentational properties that other theming methods (e.g. CSS) cannot. For example, themes could be used to specify the default page size of all data grids across an application by specifying a default value for the PageSize property of the TDataGrid control.
-
-A theme is a directory consists of skin files, javascript files and CSS files. Any javascript or CSS files contained in a theme will be registered with the page that the theme is applied to. A skin is a set of initial property values for a particular control type. A control type may have one or several skins, each identified by a unique SkinID. When applying a theme to a page, a skin is applied to a control if the control type and the SkinID value both match to those of the skin. Note, if a skin has an empty SkinID value, it will apply to all controls of the particular type whose SkinID is not set or empty. A skin file consists of one or several skins, for one or several control types. A theme is the union of skins defined in all skin files.
-
-To use a theme, you need to set the Theme property of the page with the theme name, which is the theme directory name. You may set it in either page configurations or in the constructor or onPreInit() method of the page. You cannot set the property after onPreInit() because by that time, child controls of the page are already created (skins must be applied to controls right after they are created.)
-
-To use a particular skin in the theme for a control, set SkinID property of the control in template like following,
-
-This will apply the 'Blue' skin to the button. Note, the initial property values specified by the 'Blue' skin will overwrite any existing property values of the button. Use stylesheet theme if you do not want them to be overwritten. To use stylesheet theme, set the StyleSheetTheme property of the page instead of Theme (you can have both StyleSheetTheme and Theme).
-
-To use the Javascript files and CSS files contained in a theme, a THead control must be placed on the page template. This is because the theme will register those files with the page and THead is the right place to load those files.
-
-It is possible to specify media types of CSS files contained in a theme. By default, a CSS file applies to all media types. If the CSS file is named like mystyle.print.css, it will be applied only to print media type. As another example, mystyle.screen.css applies to screen media only, and mystyle.css applies to all media types.
-
-All themes by default must be placed under the [AppEntryPath]/themes directory, where AppEntryPath refers to the directory containing the application entry script. If you want to use a different directory, configure the BasePath and BaseUrl properties of the System.Web.UI.TThemeManager module in application configuration,
-
-Creating a theme involves creating the theme directory and writing skin files (and possibly Javascript and CSS files). The name of skin files must be terminated with .skin. The format of skin files are the same as that of control template files. Since skin files do not define parent-child presentational relationship among controls, you cannot place a component tag within another. And any static texts between component tags are discarded. To define the aforementioned 'Blue' skin for TButton, write the following in a skin file,
-
-As aforementioned, you can put several skins within a single skin file, or split them into several files. A commonly used strategy is that each skin file only contains skins for one type of controls. For example, Button.skin would contain skins only for the TButton control type.
-
-Asset adalah file sumber daya (seperti gambar, suara, video, CSS stylesheet, javascript, dll.) yang dimiliki oleh kelas komponen tertentu. Assets disediakan bagi para pengguna Web. Untuk kegunaan dan kemudahan penyebaran kelas komponen terkait, asset harus berada bersama dengan file kelas komponen. Sebagai contoh, tombol toggle dapat memakai dua gambar, disimpan dalam file down.gif dan up.gif, untuk menampilkan kondisi toggle berbeda. Jika kita ingin file gambar disimpan di bawah direktori images di bawah akar dokumen server Web, tidak akan memembuat nyaman bagi para pengguna komponen tombol toggle, karena setiap kali mereka mengembangkan atau menyebarkan aplikasi baru, mereka harus meng-copy file gambar ke direktori tertentu itu secara manual. Untuk mengeliminir persyaratan ini, direktori relatif ke file kelas komponen harus digunakan untuk menyimpan file gambar. Strategi umum adalah menggunakan direktori yang berisi file kelas komponen untuk menyimpan file asset.
-
-Karena direktori yang berisi file kelas komponen biasanya tidak bisa diakses oleh pengguna Web, PRADO menerapkan skema penerbitan asset untuk menjadikan assets tersedia bagi para pengguna Web. Sebuah asset, setelah diterbitkan, akan mempunyai URL di mana para pengguna bisa mengambil file asset.
-
-PRADO menyediakan beberapa metode untuk penerbitan asset atau direktori yang berisi asset:
-
-HATI-HATI: Berhati-hatilah dengan penerbitan asset, karena ia memberikan para pengguna Web mengakses ke file yang sebelumnya tidak dapat diakses. Pastikan bahwa Anda tidak menerbitkan file yang tidak ingin dilihat pengguna lain.
-
-Penerbitan asset diatur oleh modul System.Web.TAssetManager. Standarnya, semua file asset yang diterbitkan disimpan di bawah direktori [AppEntryPath]/assets, di mana AppEntryPath merujuk ke direktori yang berisi naskah entri aplikasi. Pastikan direktori assets bisa ditulisi oleh proses server Web. Anda dapat mengubah direktorinya ke direktori lain dengan mengkonfigurasi properti BasePath dan BaseUrl pada modul TAssetManager dalam konfigurasi aplikasi,
-
-PRADO menggunakan teknik cache guna memastikan efisiensi penerbitan asset. Menerbitkan asset intinya memerlukan operasi copy file, yang mahal. Untuk menyimpan operasi copy file yang tidak diperlukan, System.Web.TAssetManager hanya menerbitkan asset saat ia memiliki waktu modifikasi file lebih baru daripada file yang pernah diterbitkan. Ketika aplikasi dijalankan dengan mode Performance, pemeriksaan cap waktu tersebut juga diabaikan.
-
-SARAN: Jangan menggunakan penerbitan asset secara berlebihan. Konsep asset dipakai terutama untuk membantu pemakaian ulang dan redistribusi kelas komponen agar lebih baik. Normalnya, Anda tidak akan menggunakan penerbitan asset untuk sumberdaya yang tidak terikat ke komponen mana pun dalam aplikasi. Sebagai contoh, Anda jangan menggunakan penerbitan asset untuk gambar yang digunakan terutama sebagai elemen desain (misalnya logo, gambar latar belakang, dll). Biarkan server Web melayani gambar ini secara langsung yang akan membantu meningkatkan performansi aplikasi Anda.
-
-Sekarang kita menggunakan contoh tombol toggle untuk menjelaskan penggunaan asset. Kontrol menggunakan dua file gambar up.gif dan down.gif, yang disimpan di bawah direktori yang berisi file kelas. Ketika tombol dalam kondisi Up, kita ingin menampilkan gambar up.gif. Ini dapat dikerjakan seperti berikut,
-
-Dalam contoh di atas, pemanggilan $this->getAsset('up.gif') akan menerbitkan file gambar up.gif dan mengembalikan URL untuk file gambar yang diterbitkan. URL kemudian disajikan sebagai atribut dari tag gambar HTML.
-
-Untuk meredistribusi ToggleButton, cukup paketkan bersama file kelas dan file gambar. Para pengguna ToggleButton cuma perlu untuk mengurai file, dan mereka bisa menggunakannya secara langsung tanpa mencemaskan mengenai ke mana meng-copy file gambar itu.
-
-Otentikasi adalah proses verifikasi apakah seseorang yang mengaku siapa dirinya. Biasanya menyangkut nama pengguna dan kata sandi, tapi bisa menyertakan metode lain dari mendemonstrasikan identitas, seperti kartu pintar, sidik jari, dll.
-
-Otorisasi adalah mendapatkan keterangan jika orang yang sekali teridentifikasi, diijinkan untuk memanipulasi sumber daya tertentu. Ini biasanya ditentukan dengan menyelidiki apakah orang itu memiliki aturan akses tertentu terhadap sumber daya atau tidak.
-
-PRADO menyediakan kerangka kerja otentikasi/otorisasi yang dapat diperluas. Seperti dijelaskan dalam masa hidup aplikasi, TApplication menyimpan beberapa masa hidup untuk modul yang bertanggung jawab terhadap otentikasi dan otorisasi. PRADO menyediakan modul TAuthManager untuk keperluan tersebut. Para pengembang dapat memasukan modul otentikasinya sendiri dengan mudah. TAuthManager didesain untuk dipakai bersama dengan modul TUserManager, yang menerapkan datbase pengguna hanya-baca.
-
-Ketika sebuah permintaan halaman terjadi, TAuthManager akan mencoba untuk mengembalikan informasi pengguna dari sesi. Jika tidak ada informasi pengguna yang ditemukan, pengguna dianggap sebagai pengguna anonim atau tamu. Guna menjembatani verifikasi identitas pengguna, TAuthManager menyediakan dua metode yang umum dipakai: login() dan logout(). Pengguna dimasukan (diverifikasi) jika entitas nama pengguna serta kata sandinya sama dengan rekaman dalam database pengguna yang diatur oleh TUserManager. Pengguna dikeluarkan jika informasi pengguna dihapus dari sesi dan dia perlu masuk lagi jika dia membuat permintaan baru terhadap halaman.
-
-Selama masa hidup aplikasi Otorisasi, yang terjadi setelah masa hidup Otentikasi, TAuthManager akan memverifikasi apakah pengguna saat ini mempunyai akses ke halaman yang diminta berdasarkan set aturan otorisasi. Otorisasi adalah berbasis-aturan, misalnya seorang pengguna memiliki akses ke sebuah halaman jika 1) halaman secara ekplisit menyatakan bahwa pengguna mempunyai akses; 2) atau pengguna adalah aturan tertentu yang memiliki akses ke halaman. Jika pengguna tidak mempunyai akses ke halaman, TAuthManager akan mengalihkan browser pengguna ke halaman masuk yang ditetapkan oleh properti LoginPage.
-
-Untuk menghidupkan kerangka kerja otentikasi PRADO, tambahkan modul TAuthManager dan modul TUserManager ke konfigurasi aplikasi,
-
-Di atas, properti UserManager dari TAuthManager disetel ke modul users yang adalah TUserManager. Para pengembang dapat menggantinya dengan modul manajemen pengguna yang berasal dari TUserManager.
-
-Aturan otorisasi untuk halaman ditetapkan dalam konfigurasi halaman seperti berikut,
-
-Aturan otorisasi bisa berupa aturan allow atau aturan deny. Setiap aturan terdiri dari empat properti opsional:
-
-Ketika permintaan halaman sedang diproses, daftar aturan otorisassi menjadi tersedia. Akan tetapi, hanya aturan efektif yang pertama menyamai pengguna saat ini akan menyajikan hasil otorisasi.
-
-Dalam contoh di atas, pengguna anonim akan ditolak atas penulisan ke PageID1 dan PageID2, sementara User1 dan User2 dan semua pengguna aturan Role1 bisa mengakses dua halaman (baik metode get maupun post).
-
-Sejak versi 3.1.1, atribut pages dalam aturan otorisasi dapat mengambil path halaman relatif dengan '*'. Sebagai contoh, pages="admin.Home" merujuk ke halaman Home di bawah direktori admin, dan pages="admin.*" akan merujuk ke seluruh halaman di bawah direktori admin dan subdirektorinya.
-
-Juga diperkenalkan dalam versi 3.1.1 adalah aturan IP. Ini ditetapkan oleh atribut baru ip dalam aturan otorisasi. Aturan IP dipakai untuk menentukan apakah aturan otorisasi berlaku ke pengguna-akhir berdasarkan alamat IP-nya. Seseorang dapat mendaftar beberapa IP sekaligus, dipisahkan dengan koma ','. Wildcard '*' dapat dipakai dalam aturan. Sebagai contoh, ip="192.168.0.2, 192.168.1.*" berarti aturan berlaku untuk para pengguna yang alamat IP-nya 192.168.0.2 atau 192.168.1.*. Yang kedua sama dengan setiap host dalam subnet 192.168.1.
-
-Seperti telah disebutkan di atas, TUserManager menerapkan database pengguna hanya-baca. Informasi pengguna ditetapkan baik dalam konfigurasi aplikasi ataupun file XML eksternal.
-
-Kita telah melihat contoh di atas yang menggunakan dua pengguna ditetapkan dalam konfigurasi aplikasi. Sintaks lengkap atas penetapan pengguna dan informasi aturan adalah sebagai berikut,
-
-di mana atribut roles dalam elemen user adalah opsional. Aturan pengguna dapat ditetapkan baik dalam elemen user ataupun dalam elemen role terpisah.
-
-TDbUserManager diperkenalkan dalam v3.1.0. Tujuan utamanya adalah untuk menyederhanakan tugas pengaturan akun pengguna yang disimpan dalam sebuah database. Ini membutuhkan para pengembang untuk menulis kelas pengguna yang mewakili informasi yang diperlukan untuk akun pengguna. Kelas pengguna harus diperluas dari TDbUser.
-
-Untuk menggunakan TDbUserManager, konfigurasi itu dalam konfigurasi aplikasi seperti berikut:
-
-Dalam contoh di atas, UserClass menetapkan bahwa kelas akan dipakai untuk membuat turunan pengguna. Kelas harus diperluas dari TDbUser. ConnectionID merujuk ke ID dari modul TDataSourceConfig yang menetapkan bagaimana untuk melakukan koneksi database guna mendapatkan informasi penggunanya.
-
-Kelas pengguna harus menerapkan dua metode abstrak dalam TDbUser: validateUser() dan createUser(). Karena informasi akun pengguna disimpan dalam sebuah database, kelas pengguna dapat menggunakan properti DbConnection-nya untuk menjangkau database.
-
-Sejak versi 3.1.1, TAuthManager menyediakan dukungan guna membolehkan mengingat yang masuk dengan menyetel AllowAutoLogin menjadi true. Oleh karena itu, TDbUser menambahkan dua metode untuk memfasilitasi implementasi fitur ini. Dalam keadaan tertentu, dua metode baru diperkenalkan: createUserFromCookie() dan saveUserToCookie(). Para pengembang harus mengimplementasikan dua metode ini jika mengingat yang sudah masuk diperlukan. Di bawah ini adalah contoh implementasi:
-
-Koleksi adalah struktur data dasar dalam pemrograman. Sebagai tambahan pada pemrograman PHP, array dipakai secara luas untuk mewakili koleksi struktur data. Array PHP adalah campuran dari array berindeks-kardinal dan tabel campuran.
-
-Untuk menghidupkan manipulasi obyek-terorientasi atas koleksi, PRADO menyediakan kelas koleksi yang bertenaga. Diantaranya, TList dan TMap adalah yang paling mendasar dan biasanya melayani sebagai basis kelas untuk kelas koleksi lainnya. Karena banyak komponen PRADO memiliki properti yang bertipe koleksi, penting bagi para pengembang untuk menguasai pemakaian kelas koleksi PRADO.
-
-Obyek TList mewakili array berindeks-kardinal, misalnya array (obyek) dengan indeks 0, 1, 2, ...
-
-TList bisa dipakai seperti array PHP. Sebagai contoh,
-
-Untuk memperoleh jumlah item dalam daftar, gunakan properti Count. Catatan, jangan gunakan count($list), karena ia selalu mengembalikan 1.
-
-Sebagai tambahan, TList menerapkan beberapa metode yang nyaman untuk dipakai secara umum guna memanipulasi data dalam sebuah daftar. Ini termasuk
-
-Seperti telah disebutkan di atas, banyak properti komponen PRADO didasarkan pada TList atau kelas koleksi berasal dari TList. Properti ini semuanya berbagi pemakaian tersebut di atas.
-
-Sebagai contoh, TControl (basis kelas untuk semua kontrol PRADO) mempunyai properti yang disebut Controls yang mewakili koleksi dari kontrol anak. Tipe Controls adalah TControlCollection yang memperluas TList. Oleh karena itu, untuk menambahkan kontrol anak baru, kita dapat menggunakan cara berikut,
-
-Untuk menjelajahi melalui kontrol anak, kita bisa menggunakan,
-
-Controh lain adalah properti Items, tersedia dalam kontrol list, TRepeater, TDataList dan TDataGrid. Dalam kontrol ini, kelas leluhur dari Items adalah TList.
-
-Seringkali kita ingin memperluas TList untuk melakukan operasi tambahan untuk setiap penambahan atau penghapusan sebuah item. Satu-satunya metode yang diperlukan kelas anak untuk mengganti adalah insertAt() dan removeAt(). Sebagai contoh, guna memastikan daftar hanya berisi item yang bertipe TControl, kita dapat mengganti insertAt() sebagai berikut,
-
-Obyek TMap mewakili tabel campuran (atau kami katakan array berindeks-string).
-
-Mirip dengan TList, TMap bisa dipakai layaknya sebuah array,
-
-Properti Count memberikan jumlah item dalam map sementara properti Keys mengembalikan daftar kunci yang dipakai dalam map.
-
-Metode berikut disediakan oleh TMap demi kenyamanan,
-
-TAttributeCollection adalah kelas khusus yang diperluas dari TMap. Ia dipakai terutama oleh properti Attributes dari TControl.
-
-Catatan, dalam $collection di atas TIDAK mempunyai properti Label.
-
-Tidak seperti TMap, kunci dalam TAttributeCollection tidak sensitif huruf. Oleh karena itu $collection->Label sama dengan $collection->LABEL.
-
-Karena fitur baru di atas, ketika berhadapan dengan properti Attributes dari kontrol, kita dapat mengambil keuntungan dari konsep subproperti dan mengkonfigurasi nilai atribut kontrol dalam sebuah template seperti berikut,
-
-yang menambahkan atribut bernama onclick ke kontrol TButton.
-
-PRADO menyediakan kerangka kerja penanganan kesalahan dan laporan lengkap berdasarkan pada mekanisme eksepsi dari PHP 5.
-
-Kesalahan yang terjadi dalam aplikasi PRADO dapat diklasifikasikan ke dalam tiga kategori: kesalahan yang disebabkan oleh penguraian naskah PHP, kode yang salah (seperti memanggil fungsi yang tidak didefinisikan, menyetel properti yang tidak dikenal), dan yang disebabkan oleh pemakaian yang tidak benar pada aplikasi Web oleh pengguna klien (seperti mencoba untuk mengakses halaman terbatas). PRADO tidak dapat berhadapan dengan kesalahan kategori pertama karena tidak dapat ditangkap dalam kode PHP. PRADO menyediakan sebuah hirarki eksepsi untuk berhadapan dengan kategori kedua dan ketiga.
-
-Semua kesalahan dalam aplikasi PRADO digambarkan sebagai eksepsi. Basis kelas untuk seluruh eksepsi PRADO adalah TException. Ia menyediakan fungsionalitas internasionalisasi pesan bagi semua eksepsi sistem. Pesan kesalahan dapat diterjemahkan ke dalam bahasa yang berbeda tergantung pada preferensi bahasa browser pengguna.
-
-Eksepsi muncul karena pemakaian yang tidak benar dari kerangka kerja PRADO yang diturunkan dari TSystemException, yang bisa berupa salah satu dari kelas eksepsi berikut:
-
-Kesalahan karena pemakaian yang salah dari aplikasi Web oleh pengguna klien diturunkan dari TApplicationException.
-
-Memunculkan eksepsi dalam PRADO tidak berbeda dengan memunculkan eksepsi normal PJHP. Satu hal yang sama adalah untuk memunculkan eksepsi yang benar. Secara umum, eksepsi yang ditujukan untuk ditampilkan ke pengguna aplikasi harus menggunakan THttpException, sementara eksepsi yang ditampilkan bagi para pengembang harus menggunakan kelas eksepsi lain.
-
-Eksepsi muncul selama menjalankan aplikasi PRADO ditangkap oleh modul System.Exceptions.TErrorHandler. Template output berbeda dipakai untuk menampilkan eksepsi yang ditangkap. THttpException dianggap berisi pesan kesalahan yang ditujukan untuk aplikasi pengguna akhir dan kemudian menggunakan grup template khusus. Untuk semua eksepsi lainnya, template umum ditampilkan seperti berikut dipakai untuk menyajikan eksepsi.
-
-Para pengembang dapat mengkustomisasi penyajian pesan kesalahan. Standarnya, semua template output kesalahan disimpan dalam framework/Exceptions/templates. Lokasi dapat diubah dengan mengkonfigurasi TErrorHandler dalam konfigurasi aplikasi,
-
-THttpException menggunakan satu set template yang dibedakan berdasarkan pada nilai properti StatusCode yang berbeda dari THttpException. StatusCode memiliki arti yang sama seperti kode status dalam protokol HTTP. Sebagai contoh, kode status yang sama dengan 404 berarti URL yang diminta tidak ditemukan pada server. File template output menggunakan konvensi penamaan berikut:
-
-di mana status code merujuk ke nilai properti StatusCode dari THttpException, dan kode bahasa harus bahasa yang benar seperti misalnya en, zh, fr, dll. Ketika THttpException muncul, PRADO akan memilih template yang sesuai untuk menampilkan pesan eksepsi. Pertama PRADO akan mencari file template yang namanya berisi kode status dan yang bahasanya lebih disukai oleh jendela browser klien. Jika template seperti itu tidak ada, ia akan mencari template yang memiliki kode status yang sama tapi tanpa kode bahasa.
-
-Konvensi penamaan untuk file template yang dipakai bagi semua eksepsi adalah sebagai berikut,
-
-Sekali lagi, jika bahasa yang diinginkan tidak ditemukan, sebaliknya PRADO akan mencoba menggunakan exception.html.
- Banyak aplikasi web dibangun dengan PHP tidak memikirkan internasionlisasi saat ia pertama kali ditulis. Itu mungkin dikarenakan tidak dimaksudkan untuk digunakan dalam bahasa dan kultur. Internasionalisasi adalah aspek penting karena meningkatkan adopsi Internet dalam banyak negara yang berbicara non-Ingris. Proses internasionalisasi dan lokalisasi akan menghadapi kesulitan. Di bawah adalah beberapa petunjuk umum untuk menginternasionalisasi aplikasi yang sudah ada. Identifikasi dan pisahkan data yang beragam dengan kultur. Yang paling jelas adalah teks/string/pesan. Tipe lain dari data juga harus dipertimbangkan. Daftar berikut mengkategorikan beberapa contoh data sensitif kultur
- Bila memungkinkan semua ragam teks harus diisolasi dan disimpan dalam format persisten. Teks ini termasuk, pesan kesalahan aplikasi, string ditulis tangan dalam file PHP, email, teks statis HTML, dan teks pada elemen formulir (misalnya tombol). Untuk menghidupkan fitur lokalisasi dalam PRADO, Anda perlu menambahkan beberapa opsi konfigurasi dalam konfigurasi aplikasi Anda.
-Pertama Anda perlu menyertakan namespace System.I18N.* ke path Anda.
- Kemudian, jika Anda ingin menerjemahkan beberapa teks dalam aplikasi Anda, perlu ditambahkan sumber data pesan terjemahan. Di mana source dalam translation adalah path titik ke direktori di mana Anda akan menyimpan katalog pesan terjemahan. Atribut autosave jika dihidupkan, menyimpan pesan tidak diterjemahkan kembali ke dalam katalog pesasn.
-Dengan menghidupkan cache, pesan yang diterjemahkan disimpan dalam direktori aplikasi runtime/i18n.
-Nilai marker dipakai untuk mengelilingi teks yang tidak diterjemahkan.
- Dengan konfigurasi lengkap, sekarang kita dapat mulai melokalisasi aplikasi Anda. Jika Anda menghidupkan autosave, setelah menjalankan aplikasi Anda dengan beberapa aktivitas lokalisasi (misalnya menterjemahkan beberapa teks), Anda akan melihat sebuah direktori dan messages.xml dibuat di dalam direktori source. File katalog pesan terjemahan, jika menggunakan type="XLIFF", adalah format intechange XML pesan terjemahan distandarisasi. Anda bisa mengedit file XML menggunakan editor yang mampu menangani UTF-8. Format dari XML adalah sesuatu mirip seperti berikut ini. Sekali globalisasi dihidupkan, Anda dapat mengakses setelan globalisasi, seperti Culture, Charset, dll, menggunakan Anda juga mengubah cara kultur ditentukan dengan mengubah atribut class dalam konfigurasi modul. Sebagai contoh, untuk menyetel kultur yang tergantung pada setelan browser, Anda bisa menggunakan kelas TGlobalizationAutoDetect.
- Anda juga bisa menyediakan kelas globalisasi sendiri untuk mengubah bagaimana kultur aplikasi ditetapkan.
-Terakhir, Anda dapat mengubah setelan globalisasi dengan basis halaman demi halaman menggunakan tag kontrol template. Sebagai contoh, mengubah Culture ke "zh". Fungsi localize mencari string yang diterjemahkan yang sama dengan aslinya dari sumber terjemahan Anda. Pertama, Anda perlu mencari semua teks dikode langsung dalam PHP yang ditampilkan atau dikirimkan ke pengguna akhir. Contoh berikut melokalisasi teks $sender (menganggap, katakanlah, sender adalah sebuah tombol). Kode asli sebelum lokalisasi adalah sebagai berikut.
- Pesan dikodekan langsung "Hello, world!" dilokalisasi menggunakan fungsi localize. Pesan gabungan dapat berisi data variabel. Sebagai contoh, dalam pesan "There are 12 users online.", integer 12 dapat berubah tergantung pada beberapa data dalam aplikasi Anda. Ini sulit diterjemahkan karena posisi dari data variabel mungkin berbeda untuk bahasa yang berbeda. Seabgai tambahan, bahasa yang berbeda memiliki aturannya sendiri untuk bentuk jamak (jika ada) dan/atau pembilang. Contoh berikut tidak mudah untuk diterjemahkan, karena struktur kalimat sudah tetap dengan dikodekan langsung data variabel dengan pesan. Di mana parameter kedua dalam localize mengambil array asosiatif dengan kunci sebagai penempatan yang dicari dalam teks dan menggantinya dengan nilai terkait.
-Fungsi localize tidak memecahkan masalah lokalisasi bahasa yang memiliki bentuk jamak, solusinya adalah menggunakan TChoiceFormat. The following sample demonstrates the basics of localization in PRADO. Pesan dan string bisa dilokalisasi dalam PHP atau dalam template.
-Untuk menerjemahkan pesan atau string dalam template, gunakan TTranslate. TTranslate juga dapat melakukan penempatan string. Properti Parameters bisa digunakan untuk menambah pasangan nama nilai untuk penempatan. Substring dalam terjemahan dikurung dengan "{" dan "}" yang dianggap sebagai nama parameter selama pencarian penempatan. Contoh berikut akan menempatkan substring "{time}" dengan nilai atribut parameter "Parameters.time=<%= time() %>".
- Kependekan dari TTranslate juga disediakan menggunakan sintaks berikut. di mana string akan diterjemahkan ke bahasa berbeda berdasarkan preferensi bahasa pengguna akhir. Sintaks ini bisa dipakai dengan nilai atribut juga. Memformat tanggal dan jam dilokalisasi adalah pekerjaan langsung. Properti Pattern menerima 4 predefininisi pola tanggal dilokalisasi dan 4 predefininisi pola jam dilokalisasi.
-Predefinisi bisa dipakai dalam setiap kombinasi. Jika menggunakan pola predefinisi gabungan, pola pertama harus tanggal, diikuti oleh spasi, dan terakhir pola jam. Sebagai contoh, pola tanggal lengkap dengan pola jam pendek. Aktual uruta dari tanggal-jam dan pola aktual akan ditentukan secara otomatis dari data lokal yang ditetapkan oleh properti Culture. Anda dapat menetapkan pola kustom menggunakan sub-pola berikut.
-Format tanggal/jam ditetapkan dalam arti pola waktu string. Dalam pola ini, semua huruf ASCII disimpan sebagai huruf pola, yang ditetapkan sebagai berikut:
- Jumlah pola huruf menentukan format. (Teks): 4 huruf menggunakan bentuk lengkap, kurang dari 4 menggunakan bentuk pendek atau singkatan
-jika ada. (misalnya "EEEE" menghasilkan "Monday", "EEE" menghasilkan "Mon") (Angka): jumlah digit minimum. Angka lebih pendek adalah diisi-nol ke jumlah ini (misalnya jika "m" menghasilkan "6", "mm" menghasilkan "06"). Tahun ditangani secara khusus; yakni jika jumlah 'y' adalah 2, Tahun akan dipotong 2 digit. (misalnya jika "yyyy" menghasilkan "1997", "yy" menghasilkan "97".)
- Tidak seperti field lain, pecahan detik dipadatkan pada sisi kanan dengan nol. (Teks dan Angka): 3 atau lebih, pakai teks, sebaliknya pakai angka. (misalnya
-"M" menghasilkan "1", "MM" menghasilkan "01", "MMM" menghasilkan "Jan", and "MMMM"
-menghasilkan "January".) Setiap karakter dalam pola yang tidak dalam jangkauan ['a'..'z']
-dan ['A'..'Z'] akan diperlakukan sebagai teks bertanda kutip. Contohnya, karakter seperti
-':', '.', ' ', dan '@' akan muncul dalam hasil teks waktu
-meskipun tidak dikurung dalam tanda kutip tunggal. Contoh menggunakan lokal US:
-
- Jika properti Value tidak ditetapkan, tanggal dan jam saat ini yang dipakai. Kerangka kerja Internasionalisasi PRADO menyediakan pembentukan kurs lokal dan pembentukan angka. Harap dicatat bahwa komponen TNumberFormat hanya menyediakan pembentukan, saat ini ia tidak melakukan konversi atau pertukaran. Numbers can be formatted as currency, percentage, decimal or scientific
-numbers by specifying the Type attribute. The valid types are: Properti Culture dan Currency dapat ditetapkan untuk membentuk angka spesifik lokal. Jika seseorang dari US ingin melihat gambar penjualan dari sebuah toko dalam bahasa Jerman (katakanlah menggunakan kurs EURO), diformat menggunakan kurs jerman, Anda perlu untuk menggunakan atribut Culture="de_DE" guna memperoleh kurs yang benar, misalnya 100,00$. Pemisah desimal dan pengelompokan kemudian juga dari lokal de_DE. Ini dapat menimbulkan beberapa kebingungan karena orang dari US memakai "," (koma) sebagai pemisah ribuan. Oleh karena itu, atribut Currency tersedia agar output dari hasil contoh berikut menghasilkan $100.00
- Properti Pattern menetapkan jumlah digit, posisi pengelompokan ribuan, jumlah titik desimal dan posisi desimal. Karakter aktual yang dipakai untuk menyajikan titik desimal dan titik ribuan adalah spesifik kultur dan akan berubah secara otomatis berdasarkan properti Culture. Karakter Pattern yang benar adalah:
-Sebagai contoh, anggap Value="1234567.12345" dan dengan
-Culture="en_US" (yang menggunakan "," untuk titik pemisah ribuan dan "." untuk pemisah desimal).
- Pesan gabungan, misalnya penempatan string, bisa dilakukan dengan TTranslateParameter.
-Dalam contoh berikut, string "{greeting}" dan "{name}" masing-masing akan diganti dengan nilai "Hello" dan "World". Penempatan string harus dikurung dengan "{" dan "}". Parameter selanjutnya diterjemahkan dengan menggunakans TTranslate.
-
- Menggunakan fungsi localize atau komponen TTranslate untuk menerjemahkan pesan tidak memberitahu penerjemah kardinalitas dari data yang diminta untuk menentukan struktur jamak yang benar yang dipakai. Ia hanya memberitahunya bahwa ada data tersedia, data dapat berupa apa saja. Selanjutnya, penerjemah tidak akan bisa menentukan dengan memperhatikan penempatan data plural yang benar, struktur bahasa atau prasa yang dipakai. Misalnya dalam bahasa Inggris, untuk menerjemahkan kalimat, "There are {number} of apples.", hasil terjemahan akan berbeda tergantung pada jumlah apel. Komponen TChoiceFormat melakukan pilihan terjemahan pesan/string. Contoh berikut mendemonstrasikan terjemahan pesan 2 pilihan sederhana. Dalam contoh di atas, Value "1" (satu), kemudian string yang diterjemahkan adalah "One Apple". Jika Value adalah "2", maka ia akan menampilkan "Two Apples". Pilihan pesan/string dipisashkan oleh pipa "|" diikuti oleh set notasi dari formulir. Setiap kombinasi tidak-kosong dari kurung kotak dan bulat dapat diterima.
-String yang dipilih untuk tampilan tergantung pada properti Value. Value dievaluiasi untuk setiap set-nya sampai Value ditemukan milik set tertentu.
-PRADO menyediakan fungsionalitas sangat fleksibel dan bisa diperluas. Pesan yang dicatat dapat diklasifikasikan berdasarkan tingkat catatan dan kategori pesan. Menggunakan tingkat dan katkegori filter, pesan selanjutnya bisa dialihkan ke tujuan yang berbeda, seperti file, email, jendela browser, dll. Diagram berikut memperlihatkan arsitektur dasar dari mekanisme pencatatan PRADO,
-
-Dua metode berikut disediakan untuk mencatat pesan dalam PRADO,
-
-Perbedaan antara Prado::log() dan Prado::trace() adalah bahwa yang kedua memilih secara otomatis tingkat catatan berdasarkan mode aplikasi. Jika aplikasi dalam mode Debug, informasi pelacakan stack ditambahkan ke pesan. Prado::trace() dipakai secara luas dalam kode inti kerangka kerja PRADO.
-
-Pesan yang dicatat menggunakan dua fungsi di atas dipelihara dalam memori. Untuk menggunakan pesan, para pengembang perlu mengalihkannya ke tujuan tertentu seperti file, email, atau jendela browser. Pengalihan pesan diatur oleh modul System.Util.TLogRouter. Ketika dimasukan ke dalam aplikasi, ia bisa mengalihkan pesan ke tujuan yang berbeda secara paralel. Saat ini PRADO menyediakan tiga jenis rute:
-
-Untuk menghidupkan pengalihan pesan, masukan dan konfigurasi modul TLogRouter dalam konfigurasi aplikasi,
-
-Dalam contoh di atas, Levels dan Categories menetapkan log dan filter kategori untuk mengambil secara selektif pesan ke tujuan terkait.
-
-Pesan bisa disaring berdasarkan tingkat catatan serta kategorinya. Setiap catatan pesan dikaitkan dengan tingkat dan kategori catatan. Dengan tingkat dan kategori, para pengembang dapat mengambil pesan secara selektif yang menarik bagi mereka.
-
-Tingkat catatan didefinisikan dalam System.Util.TLogger termasuk: DEBUG, INFO, NOTICE, WARNING, ERROR, ALERT, FATAL. Pesan bisa disaring berdasarkan kriteria tingkat catatan. Sebagai contoh, jika sebuah filter menetapkan tingkat WARNING dan ERROR, maka hanya pesan tersebut yakni WARNING and ERROR yang akan dikembalikan.
-
-Kategori pesan adalah hirarkis. Kategori yang namanya awalan dari yang lain disebut leluhur kategori atas kategori lainnya. Sebagai contoh, kategori System.Web adalah leluhur dari kategori System.Web.UI dan System.Web.UI.WebControls. Pesan bisa diambil secara selektif menggunakan filter kategori hirarkis tersebut. Sebagai contoh, jika filter kategori adalah System.Web, maka semua pesan dalam System.Web dikembalikan. Sebagai tambahan, pesan dalam kategori anak seperti System.Web.UI.WebControls, juga dikembalikan.
-
-Dengan ketentuan, pesan yang dicatat dalam kode inti PRADO dikategorikan berdasarkan namespace dari kelas terkait. Sebagai contoh, pesan yang dicatat dalam TPage akan menjadi kategori System.Web.UI.TPage.
-
-Halaman dalam aplikasi Web sering berbagi bagian yang sama. Sebagai contoh, semua halaman dari aplikasi tutorial berbagi bagian header dan footer yang sama. Jika kita menyimpan header dan footer secara berulang dalam setiap file sumber halaman, ia akan memusingkan pemeliharaan jika suatu saat kita menginginkan sesuatu pada header atau footer. Untuk memecahkan masalah ini, PRADO memperkenalkan konsep master dan konten. Ini terutama pola dekorator, dengan konten didekorasi oleh master.
-
-Master dan konten hanya berlaku ke kontrol template (kontrol memperluas TTemplateControl atau kelas anaknya). Kontrol template dapat mempunyai paling banyak satu kontrol master dan satu atau beberapa konten (masing-masing diwakili oleh kontrol TContent). Konten akan disisipkan ke dalam kontrol master di tempat yang disiapkan oleh kontrol TContentPlaceHolder. Dan penyajian kontrol template adalah TContentPlaceHolder yang disiapkan kontrol master diganti dengan TContent.
-
-Sebagai contoh, anggap kontrol template mempunyai template berikut:
-
-yang menggunakan MasterControl sebagai kontrol masternya. Kontrol master mempunyai template berikut,
-
-Kemudian, konten disisipkan ke dalam kontrol master berdasarkan diagram berikut, sementara hubungan leluhur-anak dapat dilihat dalam berikutnya. Catatan, kontrol template mengabaikan apapun dalam template selain konten, sementara kontrol master memelihara apapun dan mengganti tempat konten dengan konten berdasarkan ID yang sama.
-
-Master sangat mirip dengan template eksternal yang diperkenalkan sejak versi 3.0.5. Tag include khusus dipakai untuk menyertakan file template eksternal ke dalam basis template.
-
-Baik template master maupun eksternal bisa dipakai untuk berbagi konten yang sama diantara halaman. Master adalah kontrol template yang berisi konten umum dan file kelasnya berisi logika terkait dengan master. Dilain pihak, template eksternal adalah file template murni tanpa file kelas apapun.
-
-Oleh karena itu, gunakan kontrol master jika konten umum harus dikaitkan dengan beberapa logika, seperti header halaman dengan kotak pencarian atau kotak login. Kontrol master membolehkan Anda untuk menetapkan bagaimana konten umum harus berinteraksi dengan pengguna akhir. Jika Anda menggunakan template eksternal, Anda harus menyimpan logika yang diperlukan dalam halaman atau kelas kontrol yang memiliki basis template.
-
-Performansinya, template eksternal lebih ringan daripada master seperti berisi kontrol sendiri yang berparisipasi dalam masa hidup halaman, karena pembentuk hanya dipakai saat template sedang diuraikan.
-
-Performansi aplikasi Web dipengaruhi oleh banyak faktor. Akses database, operasi sistem file, bandwidth jaringan adalah faktor pengaruh potensial. PRADO mencoba dalam setiap usaha untuk mengurangi akibat performansi yang disebabkan oleh kerangka kerja.
-
-PRADO menyediakan teknik cache generik yang dipakai oleh beberapa bagian inti kerangka kerja. Sebagai contoh, ketika cache dihidupkan, TTemplateManager akan menyimpan template yang diurai dalam cache dan menggunakannya kembali dalam permintaan berikut, yang menghemat waktu penguraian template. TThemeManager mengadopsi strategi yang mirip untuk berhadapan dengan penguraian tema.
-
-Menghidupkan cache sangat mudah. Cukup tambahkan modul cache dalam konfigurasi aplikasi, dan PRADO memelihara semuanya.
-
-Para pengembang juga bisa mengambil keuntungan dari teknik cache dalam aplikasinya. Properti Cache dari TApplication mengembalikan modul cache yang dimasukan bila ia tersedia. Untuk menyimpan dan mengambil item data dari dalam cache, gunakan perintah berikut,
-
-di mana $keyName harus berupa string yang secara unik mengidentifikasi item data yang disimpan dalam cache.
-
-Sejak v3.1.0, kontrol baru bernama TOutputCache telah diperkenalkan. Kontrol ini membolehkan para pengguna untuk men-cache bagian-bagian dari output halaman. Bila dipakai dengan benar, teknik ini bisa meningkatkan performansi halaman secara signifikan karena kontrol di dalamnya tidak dibuat sama sekali jika versi yang di-cache diminta.
-
-Banyak file naskah PHP yang disertakan dapat mempengaruhi performansi aplikasi secara signifikan. Kelas PRADO disimpan dalam file berbeda dan ketika memproses sebuah permintaan halaman, ia bisa menyertakan puluhan file kelas. Untuk mengurangi masalah ini, setiap rilis PRADO, sebuah file bernama pradolite.php juga disertakan. File ini adalah gabungan dari seluruh file kelas inti PRADO dengan komentar dan pencatatan pesannya yang sudah dibuang.
-
-Untuk menggunakan pradolite.php dalam naskah entri aplikasi, ganti penyertaan prado.php dengan pradolite.php.
-
-Mode aplikasi juga mempengaruhi performansi aplikasi. Aplikasi PRADO dapat berupa salah satu dari mode berikut: Off, Debug, Normal dan Performance. Mode Debug harus dipakai terutama selama pengembangan aplikasi, sementara mode Normal biasanya dipakai dalam tahap berikutnya setelah aplikasi disebarkan guna memastikan semuanya berjalan dengan baik. Setelah aplikasi terbukti bekerja stabil, selanjutnya mode bisa dialihkan ke Performance untuk meningkatkan performansi.
-
-Perbedaan antara mode Debug, Normal dan Performance yaitu di bawah mode Debug, catatan aplikasi akan berisi informasi debug, dan di bawah mode Performance, pemeriksaan cap waktu tidak dilakukan untuk template yang di-cache dan asset yang dipublikasikan. Oleh karena itu, di bawah mode Performance, aplikasi mungkin tidak berjalan dengan baik jika template atau asset dimodifikasi. Karena mode Performance dipakai terutama saat aplikasi sudah stabil, mengubah template atau asset tidak disukai.
-
-Untuk berganti mode aplikasi, konfigurasi itu dalam konfigurasi aplikasi:
-
-Standarnya PRADO menyimpan kondisi halaman dalam field tersembunyi dari output HTML. Kondisi halaman bisa berukuran sangat besar jika menggunakan kontrol yang kompleks, seperti TDataGrid. Guna mengurangi ukuran besarnya halaman yang dikirimkan melalui jaringan, dua strategi dapat dipakai.
-
-Pertama, Anda dapat mematikan kondisi tampilan dengan menyetel EnableViewState menjadi false untuk halaman atau beberapa kontrol pada halaman jika pengguna tidak perlu berinteraksi dengan halaman/kontrol.
-
-Kedua, Anda bisa menggunakan penyimpanan kondisi halaman berbeda. Sebagai contoh, kondisi halaman bisa disimpan dalam sesi, yang menyimpan kondisi halamaa terutama pada sisi server dan menghemat waktu transmisi jaringan. Properti StatePersisterClass dari halaman menentukan kelas persisten kondisi yang dipakai. Standarnya menggunakan System.Web.UI.TPageStatePersister untuk menyimpan kondisi persisten dalam field tersembunyi. Anda bisa mengubah properti ini ke kelas persisten Anda sendiri, selama kelas persister menerapkan antarmuka IPageStatePersister. Anda dapat mengkonfigurasi properti ini dalam beberapa tempat, seperti konfigurasi aplikasi atau konfigurasi halaman menggunakan tag <pages> or <page>,
-
-Catatan, dalam SpecialPage di atas akan menggunakan MyPersister2 sebagai kelas persisternya, sementara halaman lainnya akan menggunakan MyPersister1. Oleh karena itu, Anda dapat memiliki strategi perister kondisi untuk halaman yang berbeda.
-
-Teknik cache server terbukti sangat efektif meningkatkan performansi aplikasi PRADO. Sebagai contoh, kita telah mengamati bahwa dengan menggunakan Zend Optimizer, RPS (request per second) dari aplikasi PRADO bisa meningkat lebih dari sepuluh kali. Tentunya, ini merupakan harga dari output yang stabil, sementara teknik cache PRADO selalu memastikan kebenaran output.
-
- Jika Anda adalah seorang pengembang web developer dan datang dari tempat yang sama seperti saya, Anda mungkin telah mengenal sedikit Javascript dalam halaman web Anda, terutama sebagai perekat UI.
-
-
- Sampai saat ini, saya tahu bahwa Javascript mempunyai kemampuan OO daripada ketika saya dipekerjakan, tetapi saya tidak merasa perlu menggunakannya. Karena browser mulai mendukung set fitur Javascript dan DOM lebih distandarisasikan, itu menjadi semangat untuk menulis kode yang lebih fungsional dan kompleks untuk dijalankan pada klien. Itu membantu kelahiran fenomena AJAX.
-
- Saat kita mulai mempelajari apa yang diperlukan untuk menulis aplikasi AJAX yang baik, kita mulai memperhatikan bahwa Javascript yang kita pakai benar-benar berada di puncak gunung es.
- Sekarang kita melihat Javascript dipakai melampaui pekerjaan UI sehari-hari yang sederhana seperti validasi input dan tugas-tugas kecil. Kode klien sekarang jauh lebih maju dan berlapis, lebih mirip aplikasi desktop sebenarnya atau klien tebal dari klien-server. Kita melihat librari kelas, model obyek, hirarki, pola, dan banyak hal lain yang dapat kita pakai hanya dalam kode di dalam server.
-
- Dalam banyak cata kita dapat mengatakan bahwa dengan tiba-tiba palang ditaruh lebih tinggi dari sebelumnya. Ia mengambil palang pintu lebih ahli menulis aplikasi untuk Web baru dan kita perlu mengingkatkan keahlian Javascript kita agar bisa sampai ke sana.
- Jika Anda mencoba untuk menggunakan banyak librari javascript yang ada di luar sana, seperti
- Prototipe.js,
- Scriptaculous,
- moo.fx,
- Perilaku,
- YUI,
- dan lain-lain, Anda secara kebetulan akan menemukan diri Anda sendiri sedang membaca kode JS. Mungkin dikarenakan Anda ingin mempelajari bagaimana mereka melakukannya, atau karena Anda penasaran, atau lebih sering karena itulah satu-satunya cara untuk memahami bagaimana untuk memakainya, karena dokumentasi nampaknya tidak banyak ditujukan terutama terhadap librari ini. Apapun kasusnya, Anda akan menghadapi teknik kung-fu yang akan menjadi asing dan menakutkan jika Anda belum melihat itu sebelumnya.
-
- Kegunaan dari artikel ini tepatnya menjelaskan tipe konstruksi yang banyak dari kita belum terbiasa dengannya.
-
- JavaScript Object Notation (JSON,) adalah salah satu dari isu baru yang muncul sekitar tema AJAX. JSON, cukup dikatakan suatu cara mendeklarasikan obyek dalam Javascript. Mari kita lihat contoh segera dan perhatikan bagaimana kemudahannya.
-
- Mari kita tambahkan sedikit pembentukan agar terlihat lebih mirip bagaimana kita biasa menemukannya di sana:
-
- Di sini kita membuat referensi ke obyek dengan dua properti (color
- dan legCount) serta metode (communicate.)
- Tidak sulit untuk memahami bahwa properti obyek dan metode didefinisikan sebagai daftar dipisahkan koma. Masing-masing anggota diperkenalkan dengan nama, diikuti oleh titik dua dan kemudian definisi. Dalam hal properti, ini cukup mudah, hanya nilai properti. Metode yang dibuat dengan penempatan fungsi anonim, yang akan kami jelaskan lebih baik di bawah baris.
- Setelah obyek dibuat dan ditempatkan ke variabel myPet, kita dapat menggunakanya seperti ini:
-
- Anda akan melihat JSON banyak dipakai di mana saja dalam JS baru-baru ini, sebagai argumen bagi fungsi, sebagai nilai hasil, sebagai respon server (dalam string,) dll.
-
- Ini mungkin tidak biasa bagi para pengembang yang tidak pernah memikirkan tentang itu, tapi dalam fungsi JS adalah sebuah obyek. Anda bisa mengirimkan sebuah fungsi sebagai argumen terhadap fungsi lain sama seperti Anda mengirimkan sebuah string, misalnya. Ini sering dipakai dan siap digunakan.
-
- Lihat pada contoh ini. Kami akan mengirimkan fungsi ke fungsi lain yang akan memakainya.
-
- Catatan bahwa kami mengirimkan myDog.bark dan myCat.meow tanpa menambahkan tanda kurung "()" kepadanya. Jika kita melakukan itu kita tidak mengirimkan fungsi, sebaliknya kita akan memanggil metode dan mengirimkan nilai hasilnya, tidak terdefinisi dalam kedua kasus di sini.
-
- Jika Anda ingin membuat kucing malas mulai mengeong, Anda dapat dengan mudah melakukan ini:
-
- Dua baris berikut dalam JS melakukan hal yang sama.
-
- Karena saya yakin Anda sudah mengetahuinya, anda dapat mengakses item individual dalam sebuah array menggunakan tanda kurung kotak:
-
-
- Tetapi Anda tidak dibatasi pada indeks numerik. Anda bisa mengakses banyak obyek JS dengan menggunakan namanya, dalam sebuah string. Contoh berikut membuat obyek kosong, dan menambah beberapa anggotanya dengan nama.
-
- Kode di atas mempunyai pengaruh yang sama seperti berikut:
-
- Dalam banyak cara, ide obyek dan array asosiatif (hashes) dalam JS tidak dibedakan. Dua baris berikut melakukan hal yang sama juga.
-
-
- Kekuatan besar dari bahasa pemrograman obyek berasal dari pemakaian kelas. Saya tidak berpikir telah menebak bagaimana kelas didefinisikan dalam JS hanya menggunakan pengalaman saya sebelumnya dengan bahasa lainnya. Nilailah bagi diri Anda sendiri.
-
- Mari kita lihat bagaimana kita menambahkan metode pada kelas Pet kita. Kita akan menggunakan properti prototype yang dimiliki oleh semua kelas. Properti prototype adalah sebuah obyek yang berisi semua anggota yang merupakan obyek yang akan dimiliki oleh kelas.
- Bahkan kelas JS standarnya, seperti String, Number,
- dan Date mempunyai obyek prototype yang bisa kita tambah metode serta propertinya dan menjadikan setiap obyek dari kelas itu secara otomatis mendapatkan anggota baru ini.
-
- Itulah saatnya librari seperti prototype.js siap digunakan. Jika kita menggunakan prototype.js, kita dapat membuat kode kita lebih bersih (setidaknya menurut saya.)
-
- Jika Anda tidak pernah bekerja dengan bahasa yang mendukung klosur Anda akan mendapatkan idion berikut terlalu busuk.
-
-
- Wah! Mari kita jelaskan apa yang terjadi di sini sebelum Anda memutuskan saya telah pergi terlalu jauh dan beralih ke artikel yang lebih baik dari yang ini.
-
- Pertama, dalam contoh di atas kita menggunakan librari prototype.js, yang menambahkan setiap fungsi ke kelas array. Setiap fungsi menerima satu argumen yang adalah obyek fungsi. Fungsi ini, silah berganti akan dipanggil sekali untuk setiap item dalam array, mengirimkan dua argumen saat dipanggil, item dan indeks untuk item saat ini. Mari kita panggil fungsi ini sebagai fungsi pengulang kita.
- Kita juga dapat menulis kode seperti ini.
-
- Tapi ketika kita tidak ingin melakukan seperti semua anak sekolah, bukan?
- Lebih serius, bagaimanapun juga, format terakhir ini lebih sederhana untuk dimengerti karena kita memasuki kode mencari fungsi myIterator. Adalah baik untuk memiliki logaika fungsi iterator di sana dalam tempat yang sama ia dipanggil. Juga, dalam hal ini, kitak tidak memerlukan fungsi iterator di manapun juga dalam kode kita, maka kita dapat mengubahnya ke dalam fungsi anonim tanpa hukuman.
-
-
- Salah satu masalah yang paling umum yang kita miliki dengan JS adalah saat kita mulai menulis kode kita, itulah kegunaan dari kata kunci this. Ini benar-benar menjadi tripwire.
-
- Seperti disebutkan sebelumnya, sebuah fungsi juga adalah sebuah obyek dalam JS, dan adakalanya kita tidak memperhatikan bahwa kita mengirimkan sebuah fungsi.
-
- Ambil potongan kode ini sebagai contoh.
-
- Karena fungsi buttonClicked didefinisikan di luar obyek manapun kita cenderung berpikir kata kunci this akan berisi referensi ke
- obyek window atau document (menganggap kode ini ada di tengah halaman HTML yang dilihat dalam browser.)
-
- Tapi saat kita menjalankan kode ini kita melihat ia bekerja seperti yang dimaksudkan dan menampilkan id dari tombol yang diklik. Apa yang terjadi di sini adalah bahwa kita membuat metode onclick dari setiap tombol yang berisi referensi obyek buttonClicked, mengganti apapun yang ada di sana sebelumnya. Sekarang kapan saja tombol diklik, browser akan menjalankan sesuatu mirip dengan baris berikut.
-
-
- Itu tidak membingungkan sama sekali bukan? Tapi lihat apa yang terjadi, Anda mulai memiliki obyek lain yang berhadapan dengannya dan Anda ingin betindak pada obyek ini terhadap event seperti klik tombol.
-
- Anda pikir bagus, sekarang saya dapat mengklik tombol Clear pada halaman saya dan tiga kotak teks itu akan dikosongkan. Kemudian Anda mencoba mengklik tombol hanya untuk mendapatkan kesalahan runtime. Kesalahan akan terkait dengan
- (tebak apa?) kata kunci this.
- Masalahnya adalah bahwa this.formFields tidak didefinisikan jika
- this berisi sebuah referensi ke tombol, tepatnya itulah apa yang terjadi. Satu solusi cepat adalah menulis ulang baris kode terakhir.
-
- Cara itu kita membuat fungsi baru yang memanggil metode penolong di dalam konteks obyek penolong.
- Librari javascript yang didistribusikan dengan Prado dapat ditemukan dalam direktori
-framework/Web/Javascripts/source. File packages.php
-dalam direktori itu mendefinisikan daftar nama paket yang tersedia yang diambil. Itu bisa diambil seperti berikut.
- Ketergantungan masing-masing librari secara otomatis dipecahkan. Komponen yang memerlukan libari tertentu juga akan secara otomatis mengambil librari yang diperlukan.
-Sebagai contoh, jika Anda menambah komponen TDatePicker pada halaman, datepicker dan dependensinya akan secara otomatis disertakan pada halaman. Lihat TClientScript untuk opsi penambahan kode Javascript kustom Anda ke halaman.
-Kondisi tampilan berada di jantung PRADO. Kondisi tampilan menggambarkan data yang bisa dipakai untuk menyimpan kembali halaman ke kondisi terakhir kali dilihat oleh pengguna akhir sebelum membuat permintaan saat ini. Standarnya, PRADO menggunakan field tersembunyi untuk menyimpan informasi kondisi tampilan.
-
-Sangat penting untuk memastikan bahwa kondisi tampilan tidak dirusak oleh pengguna akhir. Tanpa perlindungan, pengguna yang jahat bisa menginjeksi kode berbahaya ke dalam kondisi tampilan dan instruksi yang tidak diinginkan yang mungkin dilakukan ketika kondisi halaman sedang dikembalikan pada sisi server.
-
-Untuk mencegah kondisi tampilan dari perusakan, PRADO memaksa kondisi tampilan memeriksa HMAC (Keyed-Hashing for Message Authentication) sebelum menyimpan kembali kondisi tampilan. Pemeriksaan itu bisa mendeteksi apakah kondisi tampilan sudah dirusak atau tidak oleh pengguna akhir. Seandainya kondisi tampilan dimodifikasi, PRADO akan berhenti mengembalikan kondisi tampilan dan mengembalikan pesan kesalahan.
-
-Pemeriksaan HMAC memerlukan kunci pribadi yang harus menjadi rahasia bagi pengguna akhir. Para pengembang dapat menetapkan kunci ataupun membiarkan PRADO membuat kunci secara otomatis. Menetapkan kunci secara manual berguna saat aplikasi berjalan pada taman server. Untuk melakukannya, konfigurasi TSecurityManager dalam konfigurasi aplikasi,
-
-Pemeriksaan HMAC tidak mencegah pengguna akhir dari pembacaan konten kondisi tampilan. Ukuran keamanan yang ditambahkanadalah untuk mengenkripsi informasi kondisi tampilan agar pengguna akhir tidak bisa mengurainya. Untuk menghidupkan enkripsi kondisi tampilan, setel EnableStateEncryption dari halaman menjadi true. Ini dapat dilakukan dalam konfigurasi halaman atau dalam kode halaman. Catatan, mengenkripsi kondisi tampilan dapat menurunkan performansi aplikasi. Strategi yang lebih baik adalah dengan menyimpan kondisi tampilan pada sisi server daripada field tersembunyi.
-
-Penaskahan situs silang (juga dikenal sebagai XSS) terjadi saat aplikasi web mengumpulkan data dari pengguna. Penyerang akan sering menyuntikan JavaScript, VBScript, ActiveX, HTML, atau Flash menjadi aplikasi yang mudah diserang guna mengelabui pengguna aplikasi lain dan mengumpulkan data darinya. Sebagai contoh, Sistem forum yang didesain dengan buruk dapat menampilkan input pengguna dalam tulisan forum tanpa pemeriksaan apapun. Kemudian penyerang bisa menyuntikan beberapa kode jahat JavaScript ke dalam sebuah tulisan agar pengguna lain membaca tulisan ini, JavaScript berjalan tidak seperti yang diharapkan pada komputernya.
-
-Salah satu ukuran paling penting guna mencegah penyerangan XSS adalah memeriksa input pengguna sebelum menampilkannya. Seseorang dapat melakukan pengkodean-HTML dengan input pengguna untuk mencapai tujuan ini. Akan tetapi, dalam beberapa situasi, pengkodean-HTML mungkin tidak disukai karena ia mematikan seluruh tag HTML.
-
-PRADO menyertakan pekerjaan SafeHTML dan menyediakan bagi para pengembang komponen berguna yang disebut TSafeHtml. Dengan mengurung konten di dalam tag komponen TSafeHtml, konten yang dikurung dipastikan amab bagi pengguna akhir. Sebagai tambahan, TTextBox yang umum dipakai memiliki properti SafeText yang berisi input pengguna yang dipastikan aman bila ditampilkan secara langsung ke pengguna akhir.
-
-Melindungi cookie dari serangan adalah sangat penting, karena ID sesi umumnya disimpan dalam cookie. Jika seseorang memegang ID sesi, intinya ia mempunyai semua informasi sesi relevan.
-
-Ada beberapa pengukur guna mencegah cookie dari serangan.
-
-PRADO menertapkan skema validasi cookie yang mencegah cookie dimodifikasi. Dalam keadaan tertentu, ia melakukan pemeriksaan HMAC untuk nilai cookie jika validasi cookie dihidupkan.
-
-Validasi cookie standarnya dimatikan. Untuk menghidupkannya, konfigurasi modul THttpRequest seperti berikut,
-
-Untuk menggunakan skema validasi cookie yang disediakan oleh PRADO, Anda juga perlu mengambil cookie melalui koleksi Cookies dari THttpRequest dengan menggunakan pernyataan PHP berikut,
-
-Untuk mengirimkan data cookie yang dikode dengan informasi validasi, buat obyek THttpCookie baru dan menambahkannya ke koleksi Cookies dari THttpResponse,
-
-Aplikasi Web sering memerlukan untuk mengingat apa yang pengguna akhir kerjakan dalam permintaan halaman sebelumnya agar permintaan halaman baru bisa dilayani sesuai dengan itu. Persisten kondisi untuk menangani masalah ini. Secara tradisional, jika halaman perlu memelihara interaksi pengguna, ia akan mengurut ulang sesi, cookie, atau field tersembunyi. PRADO menyediakan baris baru skema kondisi persisten, termasuk kondisi tampilan, kondisi kontrol, dan kondisi aplikasi.
-
-Kondisi tampilan berada di jantung PRADO. Dengan kondisi tampilan, halaman Web menjadi tangguh dan mampu menyimpan kembali halaman ke kondisi terakhir kali pengguna akhir berinteraksi sebelum permintaan halaman saat ini. Pemrograman Web mirip dengan pemrograman GUI Windows, dan para pengembang dapat berpikir secara kontinyu tanpa mencemaskan mengenai perjalanan pulang pergi antara pengguna akhir dan server web. Sebagai contoh, dengan kondisi tampilan, sebuah kontrol kotak centang dapat mendeteksi apakah input pengguna mengubah konten dalam kotak centang atau tidak.
-
-Kondisi tampilan hanya tersedia untuk kontrol. Kondisi tampilan dari kontrol bisa dimatikan dengan menyetel properti EnableViewState menjadi false. Untuk menyimpan variabel dalam kondisi tampilan, panggil yang berikut,
-
-di mana $this merujuk ke obyek kontrol, Caption adalah kunci unik yang mengidentifikasi variabel $caption yang disimpan dalam kondisi tampilan. Untuk mengambil variabel kembali dari kondisi tampilan, panggil yang berikut,
-
-Kondisi kontrol mirip dengan kondisi tampilan dalam setiap aspek kecuali bahwa kondisi kontrol tidak bisa dimatikan. Kondisi kontrol bertujuan dipakai untuk menyimpan informasi kondisi krusial halaman atau kontrol mana yang tidak bekerja dengan baik.
-
-Untuk menyimpan dan mengambil variabel dalam kondisi kontrol, gunakan perintah berikut,
-
-Kondisi aplikasi merujuk ke data yang persisten melalui sesi pengguna dan permintaan halaman. Contoh umum dari kondisi aplikasi adalah penghitung kunjungan pengguna. Nilai penghitung adalah persisten meskipun sesi pengguna saat ini berakhir. Catatan, kondisi tampilan dan kondisi kontrol hilang jika permintaan pengguna untuk halaman yang berbeda, karena kondisi sesi hilang jika sesi pengguna berakhir.
-
-Untuk menyimpan dan mengambil variabel dalam kondisi aplikasi, gunakan perintah berikut,
-
-PRADO melapisi manajemen sesi tradisional dalam modul THttpSession. Modul dapat diakses dari dalam setiap komponen dengan menggunakan $this->Session, di mana $this merujuk ke obyek komponen.
-
-Tema dalam PRADO menyediakan cara bagi para pengembang untuk menyediakan tampilan konsisten melintasi seluruh aplikasi web. Tema berisi daftar nilai awal untuk properti dari berbagai tipe kontrol. Ketika menerapkan tema ke sebuah halaman, semua kontrol dalam halaman tersebut akan menerima nilai properti awal terkait dari tema. Ini membolehkan tema untuk berinteraksi dengan seti properti yang banyak dari berbagai kontrol PRADO, berarti bahwa tema bisa dipakai untuk menetapkan jangkauan besar dari properti penyajian yang tidak bisa dilakukan metode tema lain (misaslnya CSS). Sebagai contoh, tema bisa dipakai untuk menetapkan ukuran standar halaman dari semua grid data melintasi aplikasi dengan menetapkan nilai standar untuk properti PageSize dari kontrol TDataGrid.
-
-Tema adalah sebuah direktori yang terdiri dari file skin, file javascript dan file CSS. Setiap file javascript atau CSS yang berada dalam tema akan diregistrasi dengan halaman yang menerapkan tema. Skin adalah set nilai properti awal untuk tipe kontrol tertentu. Tipe kontrol dapat memiliki satu atau beberapa skin, masing-masing diidentifikasi dengan SkinID unik. Ketika menerapkan tema ke sebuah halaman, skin diterapkan ke kontrol jika tipe kontrol dan nilai SkinID keduanya sama dengan ada dalam skin. Catatan, jika skin memiliki nilai SkinID kosong, ia akan menerapkannya ke semua kontrol dari tipe tertentu yang SkinID-nya tidak disetel atau kosong. File skin terdiri dari satu atau beberapa skin, untuk satu atau beberapa tipe kontrol. Tema adalah gabungan dari skin yang didefinisikan dalam semua file skin.
-
-Untuk menggunakan sebuah tema, Anda perlu menyetel properti Theme dari halaman dengan nama tema, yaitu nama direktori tema. Anda dapat menyetelnya dalam konfigurasi halaman atau dalam konstruktor atau metode onPreInit() dari halaman. Anda tidak bisa menyetel properti setelah onPreInit() karena saat itu, kontrol anak dari halaman sudah dibuat (skin harus diterapkan ke kontrol setelah kontrol tersebut dibuat.)
-
-Untuk menggunakan skin tertentu dalam tema untuk sebuah kontrol, setel properti SkinID dari kontrol dalam template seperti berikut,
-
-Ini akan menerapkan skin 'Blue' ke tombol. Catatan, nilai properti awal yang ditetapkan oleh skin 'Blue' akan mengganti setiap nilai properti tombol. Gunakan tema stylesheet jika Anda tidak ingi diganti. Untuk menggunakan tema stylesheet, setel properti StyleSheetTheme dari halaman daripada Theme (Anda bisa memiliki keduanya StyleSheetTheme dan Theme).
-
-Untuk menggunakan file Javascript dan file CSS yang berada dalam sebuah tema, kontrol THead harus ditempatkan pada template halaman. Ini dikarenakan tema akan meregistrasi file itu dengan halaman dan THead adalah tempat yang tepat untuk menempatkan mengambil file tersebut.
-
-Dimungkinkan untuk menetapkan tipe media dari file CSS yang berisikan sebuah tema. Standarnya, file CSS berlaku untuk semua tipe media. Jika file CSS bernama seperti mystyle.print.css, ia akan diterapkan hanya pada tipe media print. Sebagai contoh lain, mystyle.screen.css hanya berlaku untuk media screen, dan mystyle.css berlaku bagi semua tipe media.
-
-Semua tema standarnya harus ditempatkan di bawah direktori [AppEntryPath]/themes, di mana AppEntryPath merujuk ke direktori yang berisi naskah entri aplikasi. Jika Anda ingin menggunakan direktori berbeda, konfigurasi properti BasePath dan BaseUrl dari modul System.Web.UI.TThemeManager dalam konfigurasi aplikasi,
-
-Membuat sebuah tema melibatkan pembuatan direktori tema dan penulisan file skin (dan kemungkinan file Javascript serta CSS). Nama file skin harus diakhiri dengan .skin. Format file skin adalah sama seperti file template kontrol. Karena file skin tidak mendefinisikan penyajian hubungan leluhur-aak diantara kontrolnya, Anda tidak bisa menempatkan tag komponen di dalam yang lainnya. Dan setiap teks statis antara tag komponen diabaikan. Untuk mendefinisikan skin 'Blue' seperti telah disebutkan di atas untuk TButton, tulis yang berikut dalam file skin,
-
-Seperti sudah disebutan di atas, Anda dapat menyimpan beberapa skin dalam satu file skin, atau memisahkannya ke dalam beberapa file. Strategi yang umum digunakan adalah bahwa setiap file skin hanya berisi skin untuk satu tipe kontrol. Sebagai contoh, Button.skin akan berisi skin hanya untuk tipe kontrol TButton.
-
-Konfigurasi aplikasi digunakan untuk menetapkan perilaku global atas aplikasi. Ini terrmasuk spesifikasi alias path, pemakaian namespace, konfigurasi modul dan dan layanan, serta parameter.
-
-Konfigurasi untuk aplikasi disimpan dalam sebuah file XML bernama application.xml, yang harus ditempatkan di bawah path basis aplikasi. Formatnya ditampilkan berikut ini. Spesifikasi lengkap dari konfigurasi aplikasi dapat ditemukan dalam file DTD dan XSD.
-
-File konfigurasi eksternal mempunyai format yang sama seperti dijelaskan di atas. Meskipun nama elemen akar tidak menjadi masalah, direkomendasikan adalah <configuration>. Konfigurasi eksternal akan menambah konfigurasi utama. Sebagai contoh, jika alias path ditetapkan dalam konfigurasi eksternal, ia akan menjadi tersedia sebagai tambahan terhadap alias yang ditetapkan dalam konfigurasi utama.
-
-Standarnya tanpa konfigurasi eksplisit, aplikasi PRADO akan mengambil beberapa modul inti, seperti THttpRequest, THttpResponse, dll. Ia juga akan menyediakan TPageService sebagai layanan standar. Konfigurasi dan penggunaan modul serta layanan ini tercakup dalam seksi individual pada tutorial ini. Catatan, jika aplikasi Anda mengambil setelan standar untuk modul dan layanan ini, Anda tidak perlu menyediakan konfigurasi aplikasi. Akan tetapi, jika modul atau layanan ini tidak mencukupi, atau Anda ingin menghubah perilakunya dengan mengkonfigurasi nilai propertinya, Anda memerlukan konfigurasi aplikasi.
-
-PRADO menggunakan konfigurasi untuk merekat komponen bersama ke dalam halaman dan aplikasi. Ada konfigurasi aplikasi, konfigurasi halaman, dan template.
-
-Konfigurasi aplikasi dan halaman adalah opsional jika nilai standar yang dipakai. Template sebagian besar digunakan oleh halaman dan kontrol template. Ini juga opsional.
-
-Konfigurasi halaman sebagian besar dipakai oleh TPageService untuk memodifikasi atau menambahkan konfigurasi aplikasi. Seperti ditunjukan oleh namanya, konfigurasi halaman dikaitkan dengan direktori yang menyimpan beberapa file halaman. Ia disimpan sebagai file XML bernama config.xml.
-
-Ketika pengguna meminta halaman yang disimpan di bawah <BasePath>/dir1/dir2, TPageService akan mencoba untuk mengurai dan mengambil file config.xml di bawah <BasePath>, <BasePath>/dir1 dan <BasePath>/dir1/dir2. Path, modul, dan parameter yang ditetapkan dalam file konfigurasi ini akan ditambahkan atau digabungkan ke dalam konfigurasi aplikasi yang sudah ada. Di sini <BasePath> seperti yang didefinisikan dalam layanan halaman.
-
-Format file konfigurasi halaman adalah sebagai berikut,
-
-<paths>, <modules>, <parameters> dan <include> mirip dengan itu dalam konfigurasi aplikasi. Elemen <authorization> menetapkan aturan otorisasi yang berlaku pada direktori halaman saat ini dan seluruh subdirektorinya. Untuk lebih jelasnya, lihat seksi otentikasi dan otorisasi. Elemen <pages> menetapkan nilai awal untuk properti halaman. Setiap elemen <page> menetapkan nilai awal untuk halaman tertentu yang diidentifikasi oleh atribut id. Nilai properti awal yang diberikan dalam elemen <pages> element berlaku untuk semua halaman dalam direktori dan subdirektori saat ini.
-
-Spesifikasi lengkap dari konfigurasi halaman dapat ditemukan dalam file DTD dan XSD.
-
-Sejak versi 3.1.1, atribut id dalam elemen <page> bisa berupa path halaman relatif yang mengarah ke halaman di dalam subdirektori pada direktori yang berisi konfigurasi halaman. Sebagai contoh, id="admin.Home" merujuk ke halaman Home di bawah direktori admin. Atribut id juga bisa berisi wildcard '*' untuk menemukan seluruh halaman di bawah direktori yang ditetapkan. Sebagai contoh, id="admin.*" merujuk ke seluruh halaman di bawah direktori admin dan subdirektorinya. Peningkatan ini membolehkan para pengembang untuk memusatkan konfigurasi halamannya (misalnya menyimpan semua inisialisasi semua halaman dalam konfigurasi aplikasi atau konfigurasi akar halaman.)
-
-Template dipakai untuk menetapkan penyajian tata letak kontrol. Sebuah template dapat berisi teks statis, komponen, atau kontrol yang membantu penyajian kontrol terkait. Standarnya, turunan TTemplateControl atau subkelasnya secara otomatis mengambil dan menurunkan template dari sebuah file yang namanya sama dengan nama kelas kontrol. Untuk template halaman, nama file harus berakhiran .page; untuk kontrol template reguler lainnya, akhirannya adalah .tpl.
- Format template mirrip HTML, dengan beberapa tag spesifik-PRADO, termasuk tag komponen, tag kontrol template, tag komentar, tag konten dinamis, and tag properti dinamis. .
-
-Tag komponen menetapkan komponen sebagai bagian dari konten body pada kontrol template. Jika komponen adalah sebuah kontrol, biasanya akan menjadi anak atau cucu dari kontrol template, dan hasil penyajiannya akan disisipkan di tempat di mana ia terlihat dalam template.
-
-Format dari tag komponen adalah sebagai berikut,
-
-Diperlukan bahwa tag properti komponen saling mengumpulkan dan tag komponen pembuka dipasangkan dengan tag penutup, mirip dengan apa yang ada dalam XML.
-
-Template berikut memperlihatkan sebuah tag komponen yang menetapkan properti Text dan event OnClick dari kontrol tombol,
-
-Juga diperhatikan, nilai awal untuk properti yang namanya diakhiri dengan Template diproses secara khusus. Dalam keadaan tertentu, nilai awal diurai sebagai obyek TTemplate. Properti ItemTemplate dari kontrol TRepeater dalam contoh tersebut.
-
-Untuk menjembatani properti dengan tempat data besar, tag inisialisasi properti berikut diperkenalkan. Ini sama dengan ...PropertyName="PropertyValue"... pada setiap aspeknya. Tag inisialisasi properti harus secara langsung dikurung diantara tag pembuka dan penutup komponen.
-
-Sejak versi 3.1.0, inisialisasi tag properti dapat juga dipakai untuk menginisialisasi set subproperti yang berbagi properti leluhur yang sama. Sebagai contoh, yang berikut adalah sama HeaderStyle.BackColor="black" dan HeaderStyle.ForeColor="red".
-
-Ketika ditetapkan dalam template, properti ID komponen mempunyai arti khusus sebagai tambahan terhadap definisi properti normalnya. Tag komponen yang ditetapkan dengan nilai ID dalam template akan meregistrasi komponen terkait ke dalam kontrol pemilik template. Selanjutnya komponen dapat diakses secara langsung dari kontrol template dengan nilai ID-nya. Sebagai contoh, dalam template halaman Home, tag komponen berikut
-
-Nilai awal yang ditetapkan melalui tag kontrol template ditempatkan ke properti terkait saat kontrol template dibentuk. Oleh karena itu, Anda dapat mengganti nilai properti ini dalam langkah berikutnya, seperti tahap Init dari kontrol.
-
-Tag kontrol template adalah opsional dalam sebuah template. Setiap template dapat berisi paling banyak satu tag kontrol template. Anda dapat menempatkan tag kontrol template di mana saja di dalam template. Direkomendasikan bahwa Anda menempatkannya di awal template untuk visibilitas lebih baik.
-
-Tag komentar dipakai untuk menyimpan komentar pengembang dalam template yang tidak akan ditampilkan ke pengguna-akhir. Isi dikurung di dalam tag komentar akan diperlakukan sebagai teks tring biasa dan PRADO tidak akan mencoba untuk menguraikannya. Tag komentar tidak bisa dipakai di dalam nilai properti. Format tag komentar adalah sebagai berikut,
-
-Sejak versi 3.0.5, PRADO mulai mendukung penyertaan template eksternal. Ini dilakukan melalui tag include, di mana file template eksternal ditetapkan dalam format namespace dan nama filenya harus diakhiri dengan .tpl.
-
-Template eksternal akan disisipkan di tempat di mana tag include terjadi dalam basis template.
-
-Catatan, pengulangan penyertaan template tidak didukung, misalnya Anda tidak dapat mempunyai tag include di dalam template eksternal.
-
-Tag konten dinamis diperkenalkan sebagai jalan pintas ke beberapa tag komponen yang umum dipakai. Tag-tag ini sebagian besar dipakai untuk menyajikan konten yang dihasilkan dari evaluasi beberapa ekspresi atau pernyataan PHP. Ini termasuk tag ekspresi, tag pernyataan, tag databind, parameter tags, tag asset dan tag lokalisasi.
-
-Tag ekspresi mewakili ekspresi PHP yang dievaluasi saat kontrol template dalam tahap PreRender. Hasil evaluasi ekspresi disisipkan di tempat di mana tag berada dalam template. Konteks (yaitu $this) dari ekspresi adalah kontrol yang memilik template.
-
-Format tag ekspresi adalah sebagai berikut,
-
-Sebagai contoh, tag ekspresi berikut akan menampilkan judul halaman saat ini di tempat,
-
-Tag pernyataan mirip dengan tag ekspresi, kecuali bahwa tag pernyataan berisi pernyataan PHP daripada ekspresi. Output dari pernyataan PHP (menggunakan contoh echo atau print dalam PHP) ditampilkan di tempat di mana tag pernyataan berada dalam template. Konteks (yaitu $this) dari pernyataan adalah kontrol yang memiliki template. Format tag pernyataan adalah sebagai berikut,
-
-Contoh berikut menampilkan waktu saat ini dalam bahasa Belanda di tempat,
-
-Tag databind mirip dengan tag ekspresi, kecuali bahwa ekspresi dievaluasi hanya ketika panggilan dataBind() diterapkan pada kontrol yang mewakili tag databind. Konteks (yaitu $this) dari ekspresi databind adalah kontrol yang memiliki template. Format tag databind adalah sebagai berikut,
-
-Tag parameter dipakai untuk menyisipkan parameter aplikasi di tempat di mana ia muncul dalam template. Format tag parameter adalah sebagai berikut,
-
-Catatan, parameter aplikasi biasanya didefinisikan konfigurasi aplikasi atau konfigurasi direktori halaman. Parameter dievaluasi saat template diberi contoh.
-
-Tag asset dipakai untuk mempublikasikan file pribadi dan menampilkan URL terkait. Sebagai contoh, jika Anda mempunyai file gambar yang tidak bisa diakses Web dan Anda ingin menjadikannya terlihat bagi pengguna-akhir, Anda dapat menggunakan tag asset untuk mempublikasikan file ini dan menampilkan URL ke pengguna-akhir agar mereka dapat mengambil gambar yang dipublikasikan.
-
-Format tag asset adalah sebagai berikut,
-
-di mana LocalFileName merujuk ke path file yang relatif ke direktori yang berisi file template saat ini. Path file bisa berupa file tunggal atau sebuah direktori. Jika direktori, konten dalam seluruh direktori akan dibuat dapat diakses oleh pengguna-akhir.
-
-HARAP SANGAT BERHATI-HATI ketika Anda menggunakan tag asset karena ia dapat memperlihatkan ke pengguna-akhir file yang tidak ingin Anda perlihatkan kepada mereka.
-
-Tag lokalisasi mewakili teks yang dilokalisasi. Formatnya adalah sebagai berikut,
-
-di mana string akan diterjemahkan ke bahasa berbeda tergantung pada preferensi bahasa pengguna-akhir. Tag lokalisasi sebenarnya adalah jalan pintas ke fungsi panggil Prado::localize(string).
-
-Tag properti dinamis sangat mirip dengan tag konten dinamis, kecuali bahwa ia berlaku untuk properti komponen. Kegunaan tag properti dinamis adalah untuk membolehkan konfigurasi properti komponen lebih serba guna. Catatan, Anda tidak perlu memakai tag properti dinamis karena apa yang bisa dikerjakan oleh tag properti dinamis juga bisa dilakukan dalam kode PHP. Akan tetapi, menggunakan tag properti dinamis membawa Anda jauh lebih nyaman saat menyempurnakan tugas yang sama. Pemakaian dasar dari tag properti dinamis adalah sebagai berikut,
-
-di mana Anda dapat mengurung DynamicPropertyTag di dalam tanda kutip tunggal atau dua agar pembacaannya lebih baik.
-
-Seperti tag konten dinamis, kami mempunyai tag ekspresi, tag databind, tag parameter, tag asset dan tag lokalisasi. (Catatan, tidak ada tag pernyataan di sini.)
-
-Tag ekspresi mewakili ekspresi PHP yang dievaluasi saat kontrol template dalam tahap PreRender. Hasil evaluasi ekspresi disisipkan di tempatkan ke properti komponen terkait. Format tag ekspresi adalah sebagai berikut,
-
-Dalam ekspresi, $this merujuk ke kontrol yang memiliki template. Contoh berikut menetapkan kontrol TLabel di mana properti Text diberi contoh seperti judul halaman saat ini saat kontrol TLabel sedang dibentuk,
-
-Tag databind mirip dengan tag ekspresi, kecuali bahwa ekspresi dievaluasi hanya ketika panggilan dataBind() diterapkan pada kontrol yang mewakili tag databind. Konteks (yaitu $this) dari ekspresi databind adalah kontrol yang memiliki template. Tag databind tidak berlaku bagi seluruh komponen. Ia hanya digunakan untuk kontrol.
-
-Format tag databind adalah sebagai berikut,
-
-Sejak v3.0.2, tag ekspresi dan tag databind dapat direkatkan di dalam string statis. Sebagai contoh, Anda bisa menulis yang berikut dalam template,
-
-Sebelumnya, Anda harus menggunakan ekspresi tunggal dengan penggabungan string untuk mendapatkan efek yang sama.
-
-Tag parameter dipakai untuk menyisipkan parameter aplikasi di tempat di mana ia muncul dalam template. Format tag parameter adalah sebagai berikut,
-
-Catatan, parameter aplikasi biasanya didefinisikan konfigurasi aplikasi atau konfigurasi direktori halaman. Parameter dievaluasi saat template diberi contoh.
-
-Tag asset dipakai untuk mempublikasikan file pribadi dan menampilkan URL terkait. Sebagai contoh, jika Anda mempunyai file gambar yang tidak bisa diakses Web dan Anda ingin menjadikannya terlihat bagi pengguna-akhir, Anda dapat menggunakan tag asset untuk mempublikasikan file ini dan menampilkan URL ke pengguna-akhir agar mereka dapat mengambil gambar yang dipublikasikan. Tag asset dievaluasi ketika template diberi contoh.
-
-Format tag asset adalah sebagai berikut,
-
-di mana LocalFileName merujuk ke path file yang relatif ke direktori yang berisi file template saat ini. Path file bisa berupa file tunggal atau sebuah direktori. Jika direktori, konten dalam seluruh direktori akan dibuat dapat diakses oleh pengguna-akhir.
-
-HARAP SANGAT BERHATI-HATI ketika Anda menggunakan tag asset karena ia dapat memperlihatkan ke pengguna-akhir file yang tidak ingin Anda perlihatkan kepada mereka.
-
-Tag lokalisasi mewakili teks yang dilokalisir. Formatnya adalah sebagai berikut,
-
-di mana string akan diterjemahkan ke bahasa berbeda tergantung pada preferensi bahasa pengguna-akhir. Tag lokalisasi sebenarnya adalah jalan pintas ke fungsi panggil Prado::localize(string).
-
-Modul TUrlMapping membolehkan PRADO membentuk dan mengenali URL bersahabat berdasarkan pada pola spesifik.
-
-TUrlMapping terdiri dari daftar pola URL yang dipakai untuk menyamakan terhadap URL yang saat ini sedang diminta. Pola pertama yang sama kemudian akan dipakai untuk mendekomposisi URL ke dalam parameter request (dapat diakses melalui
-$this->Request['paramname']). Pola juga dipakai untuk membentuk URL yang dikustomisasi. Dalam hal ini, parameter dalam pola yang diterapkan akan diganti dengan nilai variabel GET terkait.
-
-Untuk menggunakan TUrlMapping, seseorang harus menyetel properti UrlManager dari modul THttpRequest sebagai ID modul TUrlMapping. Lihat contoh berikut,
-
-Contoh di atas adalah bagian dari konfigurasi aplikasi dari demo blog dalam rilis PRADO. Ia menghidupkan pengakuan format URL berikut:
-
-ServiceParameter dan ServiceID (ID standarnya adalah 'page') masing-masing menyetel parameter layanan dan ID layanan terhadap modul Request. Parameter layanan untuk layanan TPageService adalah nama kelas Page, contohnya untuk URL "index.php?page=Home", "page" adalah ID layanan dan parameter layanan adalah "Home". Layanan lain dapat menggunakan parameter layanan dan ID secara berbeda. Lihat Layanan untuk lebih jelasnya.
-
-TUrlMapping menghidupkan pengakuan terhadap format URL yang dikustomisasi berdasarkan pada daftar pola URL yang ditetapkan sebelumnya. Setiap pola ditetapkan dalam tag <url>.
-
-Nilai atribut Pattern dan Parameters adalah pola ekspresi reguler yang menentukan kriteria pemetaan. Properti Pattern mengambil ekspresi reguler dengan nama parameter dikurung antara kurung kurawal kiri '{' dan kurung kurawal kanan '}'. Pola untuk setiap parameter dapat disetel menggunakan koleksi atribut Parameters.
-Sebagai contoh,
-
-Dalam contoh di atas, pola berisi 3 parameter bernama "year",
-"month" dan "day". Pola untuk parameter ini masing-masing adalah, "\d{4}" (4 digit), "\d{2}" (2 digit)
-dan "\d+" (1 atau lebih digit).
-Intinya, nama dan nilai atribut Parameters digunakan sebagai substrings dalam penggantian tempat pada string Pattern untuk membentuk string ekspresi reguler lengkap.
- Berikut dari contoh pola di atas,
-sebuah URL "http://example.com/index.php/articles/2006/07/21" akan disamakan dan benar. Akan tetapi, "http://example.com/index.php/articles/2006/07/hello" tidak benar karena pola parameter "day" tidak memuaskan.
- Dalam kelas TUrlMappingPattern standarnya, pola disamakan dengan properti path dari hanya URL. Sebagai contoh, hanya bagian
-"/index.php/articles/2006/07/21" dari URL yang ditetapkan.
-
-URL permintaan yang dipetakan mirip dengan index.php?page=ArticleView&year=2006&month=07&day=21.
-Nilai parameter tersedia melalui obyek standar Request. Sebagai contoh, $this->Request['year'].
- Pemetaan URL dievaluasi agar ia ditempatkan dan hanya pemetaan pertama yang menyamai URL akan dipakai. Pemetaan beruntun dapat dicapat dengan menempatkan pemetaan URL dalam urutan tertentu. Sebagai contoh, menempatkan pemetaan paling spesifik terlebih dahulu.
-
-Sejak versi 3.1.1, TUrlMapping mulai mendukung pembentukan format URL terkustomisasi berdasarkan pola yang disediakan. Untuk menghidupkan fitur ini, setel TUrlMapping.EnableCustomUrl menjadi true. Saat THttpRequest.constrcutUrl() dipanggil, pembantukan kerja URL aktual akan didelegasikan ke turunan TUrlMappingPattern yang sama. Ia mengganti parameter dalam pola dengan variabel GET terkait dikirimkan ke constructUrl().
-
-Pola yang sama adalah propreti ServiceID dan ServiceParameter yang sama seperti yang dikirimkan ke constructUrl() dan parameter yang diberi nama ditemukan dalam variabel GET. Sebagai contoh, constructUrl('Posts.ListPost',array('cat'=>2)) akan menggunakan pola pihak ketiga dalam contoh di atas.
-
-
-
-Standarnya TUrlMapping akan membentuk URL yang diawali dengan yang saat ini meminta path naskah PHP, seperti /path/to/index.php/article/3. Para pengguna dapat mengubah perilaku ini dengan menetapkan prefiks URL secara spesifik melalui properti UrlPrefix-nya. Sebagai contoh, jika konfigurasi server Web memperlakukan index.php sebagai naskah standar, kita bisa menyetel UrlPrefix sebagai /path/to dan URL yang dibentuk akan terlihat seperti /path/to/article/3.
-
-TButton membuat tombol klik pada halaman Web. judul tombol ditetapkan dengan properti Text. Tombol digunakan untuk mengirimkan data ke sebuah halaman. TButton memunculkan dua event sisi-server, OnClick dan OnCommand, ketika diklik pada sisi-klien. Perbedaan diantara event OnClick dan OnCommand adalah bahwa event kedua meneruskan ke leluhur kontrol tombol. Pengendali event OnCommand bisa menggunakan CommandName dan CommandParameter terkait dengan event guna melakukan aksi spesifik.
-
-Mengklik tombol dapat memicu formulir validasi, jika CausesValidation adalah true. Dan validasi mungkin dibatasi di dalam grup tertentu dari kontrol validator menurut ValidationGroup.
-
-TCaptcha menampilkan CAPTCHA yang bisa dipakai untuk menentukan apakah input dimasukan oleh pengguna asli ataukah beberapa program. TCaptcha menampilkan sebuah token (string terdiri dari karakter alfanumerik) sebagai sebuah gambar dan pengguna diharapkan untuk mengulang token dalam kotak teks. Gambar token dibuat dalam cara tertentu yang bisa dikenali oleh manusia, tapi tidak oleh sebuah program.
-
-Untuk menggunakan TCaptcha, anda hrus menghidupkan ekstensi PHP GD2 dengan dukungan font TrueType. Tidak seperti naskah CAPTCHA lain, TCaptcha tidak memerlukan sesi atau cookie.
-
-Token yang dibuat oleh TCaptcha dapat dikonfigurasi dalam beberapa cara. Untuk menetapkan panjang karakter dalam token, setel MinTokenLength dan MaxTokenLength. Untuk menggunakan perbandingan huruf tidak sensitif-huruf dan hanya membuat token huruf-besar, setel CaseSensitive ke false. Para pengguna tingkat lanjut dapat mencoba untuk menyetel TokenAlphabet guna menetapkan karakter mana yang akan muncul dalam token yang dibuatnya.
-
-Validasi token terkait dengan dua properti: TestLimit (standarnya 5 kali) dan TokenExpiry (standarnya 600 detik). Pembentuk menetapkan berapa kali token bisa diuji pada sisi-server, dan yang terakhir mengatakan kapan token yang dibuat akan berakhir. Jika validasi gagal dalam salah satu dari dua skenario, token baru akan secara otomatis dibuat.
-
-Untuk menetapkan tampilan dari gambar token yang dibuat, setel TokenImageTheme ke integer antara 0 dan 31. Ada bisa mencoba contoh berikut untuk melihat bagaimana nilai ini mempengaruhi gambar token yang dihasilkan. Ukuran gambar token ditentukan oleh TokenFontSize. Dalam keadaan tertentu, panjang gambar adalah proporsional bagi ukuran font. Anda juga bisa menyetel Width untuk mengubah gambar yang dihasilkan ke ukuran yang anda inginkan, gambar yang diskala mungkin tidak terlihat baik.
-
-Setelah postback, input pengguna dapat di validasi dengan memanggil metode TCaptcha.validate(). Jauh lebih mudah, anda dapat menggunakan TCaptchaValidator untuk mengotomasi pekerjaan validasi bagi anda. TCaptchaValidator mempunyai keuntungan tambahan dari kemampuan untuk memvalidasi input pengguna pada sisi-klien. Standarnya, token yang dihasilkan akan tetap tidak berubah selama postbacks. Token baru dapat dibuat dengan memanggil TCaptcha.regenerateToken() secara manual.
-
-Template berikut memperlihatkan penggunaan umum dari kontrol TCaptcha:
-
-TCheckBox menampilkan kotak centang pada halaman Web. Judul bisa ditetapkan melalui Text dan ditampilkan disamping kotak centang. Ia bisa muncul baik di sisi kanan atau kiri kotak centang, yang ditentukan oleh TextAlign. Selanjutnya anda dapat menetapkan atribut yang diterapkan ke teks dengan menggunakan LabelAttributes.
-
-Untuk menentukan apakah kotak centang dicentang atau tidak, uji properti Checked. Event CheckedChanged dimunculkan jika kondisi Checked berubah diantara pengiriman ke server. Jika AutoPostBack adalah true, mengubah kotak centang akan menyebabkan aksi postback. Dan jika CausesValidation juga true, setelah postback validasi akan dilakukan bagi validator di dalam ValidationGroup yang ditetapkan.
-
-TClientScript membolehkan kode Javascript disisipkan atau di-link ke template halaman. PRADO dibundel dengan fungsionalitas librari besar Javascript termasuk efek, AJAX, pengendali event dasar, dan masih banyak lagi. Librari Javascript yang dibundel bisa di-link ke template halaman saat ini menggunakan properti PradoScripts. Multipel librari Javascript yang dibundel bisa ditetapkan menggunakan string nama librari Javascript dipisahkan koma untuk disertakan pada halaman. Contoh berikut akan menggunakan librari "ajax" dan "effects".
-
- Bundel librari yang disertakan dalam Prado adalah
-Banyak dari librari, seperti validator dan datepicker akan secara otomatis ketika kontrol yang menggunakan librari ini terlihat pada halaman. Sebagai contoh, semua validator
-jika EnableClientScript disetel true akan menyertakan librari javascript prado dan validator.
-Ketergantungan dari setiap librari secara otomatis dipecahkan. Yakni, menetapkan, katakanlah "ajax", juga akan menyertakan librari "prado". File Javascript kustom dapat diregistrasi menggunakan properti ScriptUrl. Contoh berikut menyertakan file Javascript "test.js" ke halaman. Dalam hal ini, file "test.js" relatif ke template saat ini yang sedang anda gunakan. Karena nilai properti adalah
-tag asset dinamis, file "test.js" akan dipublikasikan secara otomatis, yaitu file akan di-copy ke direktori asset bila perlu.
- You can include Javascript files from other servers by specifying the full URL string in
- the ScriptUrl property. Setiap konten di dalam tag kontrol TClientScript akan dianggap sebagai kode Javascript dan akan disajikan di mana ia dideklarasikan.
-TBD
-
-TConditional menampilkan konten terkai berdasarkan hasil evaluasi ekspresi PHP yang ditetapkan via Kondisi.
-Jika hasil adalah true, ia menurunkan template TrueTemplate;
-sebaliknua, template FalseTemplate yang diturunkan.
-Ekspresi PHP dievaluasi sebelum tahap onInit atas masa hidup kontrol.
-
-Karena TConditional mengevaluasi Kondisi di tahap awal, direkomendasikan anda menyetel Condition hanya dalam template dan ekspresi tidak boleh merujuk ke obyek yang tersedia nanti atau setelah masa hidup onInit.
-
-TConditional sangat ringan. Ia menurunkan TrueTemplate
-FalseTemplate, tapi tidak keduanya sekaligus. Dan kondisi dievaluasi hanya sekali.
-Penggunaan umum dari TConditional diperlihatkan seperti berikut:
-
-TDatagrid adalah kontrol penting dalam membangun aplikasi Web yang kompleks. Ia menampilkan data dalam format tabular dengan baris (juga disebut item) dan kolom. Baris dibuat dengan sel, sementara kolom mengatur bagaimana sel harus ditampilkan berdasarkan kaitannya dengan kolom. Data yang ditetapkan melalui DataSource atau DataSourceID terikat pada baris dan mengisi kontek ke sel.
-
-TDataGrid sangat interaktif. Para pengguna dapat mengurut data sepanjang kolom yang ditetapkan, mengendalikannya melalui halaman data yang berbeda, dan melakukan aksi, seperti mengedit dan menghapus, pada baris data.
-
-Baris TDataGrid dapat diakses melalui properti Items. Baris (item) bisa berupa salah satu dari beberapa mode: browse, mengedit dab memilih, yang mempengaruhi bagaimana sel dalam bariis ditampilkan. Untuk mengubah mode item, modifikasi EditItemIndex atau SelectedItemIndex. Catatan, jika item dalam mode edit, maka memilih item ini tidak terpengaruh.
-
-Kolom pada data grid menentukan bagaimana sel terkait ditampilkan. Sebagai contoh, sel yang dikaitkan dengan TBoundColumn ditampilkan secara berbeda tergantung dari modenya. Sebuah sel ditampilkan sebagai teks statis jika sel dalam mode browse, kotak teks jika dalam mode edit, dan seterusnya.
-
-PRADO menyediakan lima tipe kolom:
-
-TDataGrid mendefinisikan gaya yang diterapkan pada itemnya. Sebagai contoh, AlternatingItemStyle diterapkan untuk mengganti item (item 2, 4, 6, dll.) Melalui properti ini, seseorang dapat menyetel field gaya CSS atau kelas CSS untuk item-item tersebut.
-
-Gaya item diterapkan dalam cara hirarkis. Gaya dalam hirarki lebih tinggi akan diturunkan dari gaya dalam hirarki lebih rendah. Mulai dari hirarki terendah, gaya item termasuk gaya item itu sendiri, ItemStyle, AlternatingItemStyle, SelectedItemStyle, dan EditItemStyle. Oleh karena itu, jika warna latar belakang disetel merah dalam ItemStyle, EditItemStyle juga akan memiliki warna latar belakang merah, kecuali dinyatakan secara eksplisit ke nilai yang berbeda.
-
-TDataGrid menyediakan beberapa event untuk menjembatani manipulasi item datanya,
-
-TDataGrid standarnya akan membuat sebuah daftar kolom berdasarkan struktur data terikat. TDataGrid akan membaca baris pertama data, menguraikan nama field dari baris, dan mengkonstruksi kolom untuks setiap field. Setiap field adalah tipe TBoundColumn.
-
-Contoh berikut menampilkan daftar informasi produk komputer menggunakan TDataGrid. Kolom secara otomatis dibuat. Perhatikan bagaimana gaya item ditetapkan dan diturunkan. Data dipopulasi ke dalam datagrid menggunakan kode berikut yang umum diantara kebanyakan aplikasi datagrid,
-
-Menggunakan kolom yang dibuat secara otomatis memberikan cara cepat melihat data tabular. Dalam aplikasi sebenarnya, kolom yang dibuat secara otomatis sering tidak mencukupi karena para pengembang tidak memiliki cara mengkustomisasi penampilannya. Kolom yang dibuat secara manual jauh lebih diinginkan.
-
-Untuk menetapkan kolom secara manual, setel AutoGenerateColumns ke false, dan tetapkan kolom dalam template seperti berikut,
-
-Catatan, jika AutoGenerateColumns adalah true dan di sana ditetapkan kolom secara manual, kolom yang dibuat secara otomatis akan diterapkan ke kolom yang ditetapkan secara manual. Catat juga, properti Columns datagrid hanya berisi kolom yang ditetapkan secara manual dan bukan yang secara otomatis dibuat.
-
-Contoh berikut menggunakan kolom yang ditetapkan secara manual untuk memperlihatkan daftar informasi buku,
- Perhatikan bagaimana gaya item (baris) dan kolom bekerja sama untuk mempengaruhi penampilan sel dalam datagrid.
-Selain kaya fungsionalitas penyajian data seperti didemonstrasikan dalam bagian sebelumnya, TDataGrid juga sangat interaktif bagi pengguna. Pemakaian impor TDataGrid adalah mengedit atau menghapus baris data. TBoundColumn dapat menyesuaikan penyajian sel terkait berdasarkan mode item datagrid. Ketika item dalam mode browse, sel ditampilkan dengan teks statis; ketika item ditampilkan dalam mode edit, kotak teks ditampilkan untuk menampung input pengguna. TDataGrid menyediakan TEditCommandColumn untuk mengalihkan mode item. Sebagai tambahan, TButtonColumn menawarkan kepada para pengembang fleksibilitas dari pembuatan tombol bebas untuk berbagai interaksi pengguna.
-
-Contoh berikut memperlihatkan bagaimana untuk membuat tabel informasi buku sebelumnya menjadi interaktif. Ia membolehkan pengguna untuk mengedit dan menghapus item buku dari tabel. Dua kolom tambahan dipakai dalam contoh untuk membolehkan interaksi para penggunak dengan datagrid: TEditCommandColumn dan TButtonColumn. Sebagai tambahan,
-TDropDownListColumn mengganti TTemplateColumn sebelumnya untuk membolehkan pengguna memilih peringkat dari daftar dropdown. Catatan, Ini juga memungkinkan untuk menggunakan TTemplateColumn guna menyelesaikan tugas yang sama.
-
-TDataGrid mendukung pengurutan itemnya yang terkait dengan kolom tertentu. Untuk menghidupkan pengurutan, setel AllowSorting ke true. Ini akan mengubah header kolom menjadi tombol yang bisa diklik jika properti SortExpression tidak kosong. Ketika para pengguna mengklik pada tombol header, event OnSortCommand akan dimunculkan. Para pengembang dapat menulis pengendali guna merespon perintah pengurutan dan mengurut data berdasarkan SortExpression yang ditetapkan dalam kolom terkait.
-
-Contoh berikut mengubah datagrid dalam Contoh 2 menjadi yang bisa diurutkan. Para pengguna dapat mengklik pada tombol link yang ditampilkan dalam setiap kolom, dan data akan diurut dalam urutan membesar sepanjang kolom tersebut.
-
-Ketika berhadapan dengan dataset besar, lembaran sangat membantu dalam mengurangi ukuran halaman dan kompleksitasnya. TDataGrid disertai lembaran yang membolehkan para pengguna menetapkan di halaman mana data ingin mereka lihat. Lembaran bisa dikustomisasi melalui PagerStyle. Sebagai contoh, PagerStyle.Visible menentukan apakah lembaran terlihat atau tidak; PagerStyle.Position menunjukan di mana lembaran ditampilkan; dan PagerStyle.Mode menetapkan tipe lembaran apa yang ditampilkan, numerik atau kata berikutnya-sebelumnya.
-
-Untuk menghidupkan lembaran, setel AllowPaging ke true. Jumlah baris data yang ditampilkan dalam halaman ditetapkan oleh PageSize, sementara indeks (berbasis-nol) pada halaman yang saat ini terlihat bagi para pengguna adalah dengan CurrentPageIndex. Ketika para pengguna mengklik pada tombol lembar, TDataGrid memunculkan event OnPageIndexChanged. Biasanya, pengendali event ditulis seperti berikut,
-
-Contoh berikut menghidupkan fungsionalitas lembar dari datagrid yang ditampilkan dalam Contoh 1. Dalam contoh ini, anda dapat menyetel berbagai gaya lembar secara interaktif untuk melihat bagaimana pengaruh tampilan lembar halaman.
-
-Fungsionalitas lembar halaman yang ditampilkan di atas memerlukan pengambilan seluruh data ke dalam memori, meskipun hanya sebagian darinya ditampilkan dalam sebuah halaman. Untuk dataset besar, ini tidak efisien dan mungkin tidak selalu layak. TDataGrid menyediakan lembar kustom untuk memecahkan masalah ini. Lembar kustom hanya memerlukan sebagian data untuk ditampilkan kepada pengguna akhir.
-
-Untuk menghidupkan lembat kustom, setel AllowPaging dan AllowCustomPaging ke true. Beritahu TDataGrid jumlah item data (baris) yang tersedia dengan menyetel VirtualItemCount. Dan merespon ke event OnPageIndexChanged. Dalam pengendali event, gunakan properti NewPageIndex atas parameter event untuk megnambil lembar baru data dari sumber data. Untuk MySQL database, ini bisa dikerjakan dengan menggunakan klausul LIMIT dalam pernyataan SQL select.
-
-Selain turunan kelas tradisional, kemampuan diperluas TDataGrid dikembangkan terutama melalui komponen kolom datagrid. Sebagai contoh, seseorang mungkin ingin menampilkan sebuah kolom bergambar. Dia dapat menggunakan TTemplateColumn untuk menyelesaikan tugas ini. Solusi yang lebih baik adalah mengembangkan komponen kolom gambar pekerjaan tersebut bisa dipakai ulang dengan mudah dalam proyek lain.
-
-Semua komponen kolom datagrid harus diturunkan dari TDataGridColumn. Metode utama yang perlu diganti adalah initializeCell() yang membuat konten untuk sel dalam kolom terkait. Karena setiap sel juga dalam sebuah item (baris) dan item dapat memiliki tipe berbeda (seperti Header, AltneratingItem, dll.), konten berbeda bisa dibuat berdasarkan tipe item. Untuk contoh kolom gambar, seseorang dapat membuat kontrol TImage di dalam sel dalam item dari tipe Item dan AlterantingItem.
-
-Dalam initializeCell(), jangan lupa untuk memanggil implementasi leluhur, karena ia menginisialisasi sel dalam item dari tipe Header dan Footer.
-
-TDataList mewakili ikatan data dan kontrol list yang bisa dimutakhirkan. Seperti TRepeater, TDataList menampilkan kontennya secara berulang berdasarkan data yang diambil dari DataSource. Kontek yang diulang dalam TDataList disebut item, yang adalah kontrol dan bisa diakses melalui Items. Ketika dataBind() dipanggil, TDataList membuat sebuah item untuk setiap baris data dan mengikat baris data ke item. Secara opsional, TDataList dapat mempunyai header, footer dan/atau pemisah antara item.
-
-TDataList berbeda dari TRepeater yakni memperkenalkan konsep kondisi item dan membolehkan menerapkan gaya berbeda ke item dalam kondisi berbeda. Sebagai tambahan, TDataList mendukung pengotakan item berulang dalam berbagai cara.
-
-Tata letak dari konten yang diulang dalam TDataList ditetapkan dengan template inline. Item TDataList, header, footer, dll. diturunkan dengan template terkait saat data sedang diikat ke pengulang.
-
-Sejak v3.1.0, tata letak juga dapat berupa penyaji. Penyaji adalah kelas kontrol yang dapat diturunkan sebagai item datalist, header, dll. Penyaji dapat dilihat sebagai template eksternal (sebenarnya, ia juga merupakan kontrol tanpa-template). Untuk lebih jelasnya, lihat penjelasan mengenai penyaji dalam Tutorial TRepeater.
-
-Properti berikut dipakai untuk menetapkan tipe template dan penyaji datalist. Jika tipe konten didefinisikan dengan template dan penyaji, maka penyaji diambil lebih dulu.
-
-Ketika dataBind() dipanggil, TDataList menjalani masa hidup seperti berikut untuk setiap baris data:
-
-TDataList memunculkan OnItemCommand kapan saja kontrol tombol di dalam beberapa item datalist memunculkan event OnCommand. Oleh karena itu, anda bisa menangani semua event OnCommand di satu tempat dengan menulis pengendali event untuk event OnItemCommand. Event tambahan dimunculkan jika event OnCommand memiliki salah satu dari nama perintah berikut (tidak sensitif-huruf):
-
-TDataList menyediakan beberapa properti untuk mendukung pengotakan item. Jumlah kolom yang digunakan untuk menampilkan item data dietapkan melalui properti RepeatColumns, sementara RepeatDirection mengatur urutan item yang sedang disajikan. Tata letak item data dalam daftar ditetapkan melalui RepeatLayout, yang mengambil salah satu dari nilai berikut:
-
-Item dalam TDataList dapat berupa salah satu dari tiga keadaan: sedang dilihat, sedang diedit dan sedang dipilih. Untuk mengubah keadaan item tertentu, setel SelectedItemIndex atau EditItemIndex. Former akan mengubah item yang ditunjuk ke mode yang dipilih, yang akan menyebabkan item menggunakan SelectedItemTemplate atau SelectedItemRenderer dalam penyajiannya. Yang terakhir akan mengubah item yang ditunjuk ke mode edit dan menggunakan template atau penyaji terkait. Catatan, jika sebuah item dalam mode edit, maka memilih item ini tidak akan berpengaruh.
-
-Gaya berbeda dapat diterapkan ke item dalam status yang berbeda. Gaya aplikasi dilakukan dalam cara hirarkis: Gaya dalam hirarki lebih tinggi akan diturunkan dari hirarki lebih rendah. Dimulai dari hirarki paling rendah, gaya item termasuk:
-
-Oleh karena itu, jika warna latar belakang disetel sebagai merah dalam ItemStyle, EditItemStyle juga akan mempunyai warna latar belakang merah keciali ia disetel ke nilai berbeda secara eksplisit.
-
-Ketika halaman yang berisi datalist adalah post back, datalist akan mengembalikan secara otomatis seluruh kontennya, termasuk item, header, footer dan pemisah. Akan tetapi, baris data terkait dengan setiap item tidak akan ditemukan kembali dan menjadi null. Untuk mengakses data, gunakan salah satu cara berikut:
-
-Contoh berikut memperlihatkan bagaimana menggunakan TDataList guna menampilkan data tabular, dengan tata letak dan gaya yang berbeda.
-
-Pemakaian umum dari TDataList adalah untuk memanipulasi data tabular, termasuk melihat, mengedit, meghapus item data. Ini dihidupkan dengan event perintah dan berbagai template item pada TDataList.
-
-Contoh berikut menampilkan informasi produk komputer. Para pengguna dapat menambah produk baru, memodifikasi atau menghapus produk yang sudah ada. Agar bisa mencari item data untuk pemutakhiran atau penghapusan, properti DataKeys yang digunakan.
-
-Harap berhati-hati, untuk kemudahan, aplikasi ini tidak melakukan validasi input apapun. Dalam aplikasi sebenarnya, pastikan input divalidasi sebelum menyimpannya ke dalam database.
- TDatePicker menampilkan kotak teks untuk keperluan input tanggal.
-Ketika kotak teks menerima fokus, kalender akan muncul dan pengguna dapat mengambil tanggal darinya yang akan secara otomatis dimasukan ke dalam kotak teks. Format tanggal string yang ditampilkan dalam kotak teks ditentukan oleh properti DateFormat. Format yang benar adalah kombinasi dari token berikut:
-
-
-Tanggal pada pengambil tanggal bisa disetel menggunakan properti Date atau Timestamp. Nilai properti Date harus dalam format yang sama seperti pola yang ditetapkan dalam properti DateFormat. Properti Timestamp hanya menerima integer seperti cap waktu Unix.
-
-TDatePicker mempunyai tiga Mode untuk menampilkan tampilan pengambil tanggal. Properti CssClass dapat dipakai untuk mengganti nama kelas CSS untuk panel pengambil tanggal. Properti CalendarStyle mengubah gaya kalender secara keseluruhan.
-Nilai CalendarStyle berikut tersedia: Properti InputMode bisa disetel ke "TextBox" atau "DropDownList" dengan standar sebagai "TextBox". Dalam mode DropDownList, sebagai tambahan pada tampilan pengambil tanggal, tiga daftar drop down (hari, bulan dan tahun) disajikan untuk memilih tanggal.
-Ketika InputMode sama dengan "DropDownList", urutan dan penampilan tanggal, bulan, dan tahun akan bergantung pada pola yang ditetapkan dalam properti DateFormat.
- Tampilan pengambil tanggal dapat disembunyikan dengan menetapkan ShowCalendar ke false. Banyak teks pada tampilan pengambil tanggal dapat diubah ke bahasa berbeda menggunakan properti Culture.
- Batas tahun pengambil kalender dapat disetel menggunakan properti FromYear dan UpToYear di mana
-FromYear adalah tahun awal dan UpToYear adalah tahun terakhir yang dapat dipilih.
-Awal hari pada seminggu bisa diubah dengan properti FirstDayOfWeek, dengan 0 sebagai Minggu, 1 sebagai Senin, dst.
- Catatan 1: Jika InputMode adalah "TextBox", DateFormat TIDAK boleh berisi pola Catatan 2: Ketika TDatePicker dipakai bersama dengan validator, properti DateFormat pada validator harus sama dengan
-DateFormat pada TDatePicker DAN harus disetel DataType="Date" pada validator guna memastikan validasi yang benar. Lihat
-TCompareValidator,
-TDataTypeValidator dan
-TRangeValidator
-untuk lebih jelasnya.
-TExpression mengevaluasi ekspresi PHP dan menampilkan hasil evaluasinya. Untuk menetapkan ekspresi yang akan dievaluasi, setel properti Expression. Catatan, TExpression mengevaluasi ekspresi selama menyajikan masa hidup kontrol.
-
-Konteks dari ekspresi dalam kontrol TExpression adalah kontrol itu sendiri. Yaitu, $this mewakili obyek kontrol jika ia ada dalam ekspresi. Sebagai contoh, tag template akan menampilkan judul halaman yang berisi kontrol TExpression.
-
-Harap berhati-hati karena TExpression membolehkan eksekusi kode bebas PHP, secara umum anda seharusnya tidak menggunakannya untuk mengevaluasi ekspresi yang dikirimkan oleh para pengguna aplikasi anda.
-
-TFileUpload menampilkan field file upload pada halaman Web. Setelah postback, teks yang dimasukan ke dalam field akan diperlkakukan sebagai nama (lokal) file yang di-upload ke server.
-
-TFileUpload memunculkan event OnFileUpload ketika ia adalah post back. Properti HasFile menunjukan apakah file yang di-upload sukses atau tidak. Jika sukses, file yang di-upload dapat disimpan pada server dengan memanggil metode saveAs().
-
-Properti berikut memberikan informasi mengenai file yang di-upload:
-
-Jika upload file tidak berhasil, properti ErrorCode memberikan kode kesalahan yang menyebabkan kegagalan. Lihat dokumentasi PHP untuk penjelasan lengkap atas kode kesalahan yang mungkin.
-
-TBD
-
-THiddenField mewakili field tersembyni pada halaman Web. Nilai field tersembunyi dapat diakses melalui properti Value.
-
-THiddenField memunculkan event OnValueChanged jika nilainya diubah selama postback.
-
-THtmlArea menampilkan field input teks WYSIWYG pada halaman Web untuk mengumpulkan input dalam format HTML. Teks yang ditampilkan dalam kontrol THtmlArea ditetapkan atau ditentukan dengan menggunakan properti Text. Untuk menyesuaikan ukuran bagian input, setel properti Width dan Height daripada Columns dan Rows karena keduanya tidak memiliki arti di bawah situasi ini. Untuk mematikan fitur WYSIWYG, setel EnableVisualEdit ke false.
-
-THtmlArea menyediakan fitur WYSIWYG dengan melapisi fungsionalitas yang disediakan oleh Proyek TinyMCE.
-
-Editor standar hanya memberikan bar piranti dasar. Untuk mengubah atau menambah bar piranti lainnya, gunakan properti Options guna menambah opsi editor tambahan dengan setiap opsi pada baris baru. Lihat TinyMCE website untuk daftar opsi lebih lengkap. Contoh berikut menampilkan bar piranti spesifik untuk memanipulasi tabel HTML,
-
-Kemampuan mengedit secara visual sisi-klien didukung oleh Internet Explorer 5.0+ untuk Windows dan browser berbasis-Gecko. Jika browser tidak mendukung mengedit secara visual visual, area teks tradisional yang akan ditampilkan.
-
-THyperLink menampilkan hiperlink pada halaman. URL hiperlink ditetapkan melalui properti NavigateUrl, dan teks link melalui properti Text. Target link ditetapkan melalui properti Target. Memungkinkan juga untuk menampilkan sebuah gambar dengan menyetel properti ImageUrl. Dalam hal ini, Text ditampilkan sebagai teks alternatif dari gambar. Jika ImageUrl dan Text keduanya kosong, konten ditutupi di dalam tag kontrol akan disajikan.
-
-TImage menampilkan gambar pada halaman. Gambar ditetapkan melalui properti ImageUrl yang mengambil URL absolut terhadap file gambar. Penjajaran gambar yang ditampilkan disetel oleh properti ImageAlign. Untuk menyetel teks alternatif atau penjelasan panjang atas gambar, gunakan masing-masing AlternateText atau DescriptionUrl.
-
-TImageButton juga mirip dengan TButton, kecuali bahwa TImageButton menampilkan tombol sebagai sebuah gambar. Gambar ditetapkan melalui ImageUrl, dan teks alternatif ditetapkan oleh Text. Sebagai tambahan, dimungkinkan untuk mendapatkan informasi koordinat titik di mana gambar diklik. Informasi koordinat yang diisikan dalam parameter event OnClick (bukan OnCommand).
-
-TImageMap Mewakili sebuah gambar pada halaman Web dengan bagian titik panas (hotspot) predefinisi yang dapat merespon secara berbeda saat pengguna mengkliknya. Tergantung pada HotSpotMode dari bagian hotspot, mengklik pada hotspot akan memicu postback atau mengendalikan URL yang ditetapkan.
-
-Setiap hotspot dijelaskan menggunakan obyek THotSpot dan dipelihara dalam koleksi HotSpots pada TImageMap. Sebuah hotspot dapat berupa lingkaran, persegi panjangn, poligon, dll.
-
-Hotspot dapat ditambahkan ke TImageMap melalui properti HotSpots atau dalam template seperti berikut,
-
-TInlineFrame menampilkan sebuah bingkai inline (<iframe>) pada halaman Web. Lokasi konten bingkai ditetapkan oleh properti FrameUrl.
-
-Penampilan TInlineFrame dapat dikustomisai dengan properti berikut, sebagai tambahan terhadap apa yang diturunkan dari TWebControl.
-
-Contoh berikut memperlihatkan TInlineFrame dengan setelan properti berbeda. Google homepage dipakai sebagai konten bingkai.
-
-TJavascriptLogger menyediakan javascript pencatatan sisi-klien. Ini sebagian besar adalah pelapis dari Javascript yang dikembangkan di http://gleepglop.com/javascripts/logger/.
-
-Untuk menggunakan TJavascriptLogger, cukup tempatkan tag komponen berikut pada template halaman.
-
-Kemudian, Javascript sisi-klien dapat berisi pernyataan berikut. Ketika dieksekusi akan muncul dalam jendela pencatat.
-
-Untuk menghidup matikan penampakan pencatat dan konsol pada jendela browser, tekan ALT-D (atau CTRL-D pada OS X).
-
-TKeyboard menampilkan keyboard virtual yang dapat diklik pengguna untuk memasukan input dalam kotak teks terkait. Ini membantu mengurangi hacking perekaman.
-
-Untuk menggunakan TKeyboard, tulis template seperti berikut:
-
-Kontrol TKeyboard dikaitkan dengan kontrol TTextBox dengan menetapkan
-ForControl menjadi ID dari kontrol tersebut. Ketika kotak teks dalam fokus, keyboard virtual akan muncull dan ketika kotak teks kehilangan fokus, keyboard akan sembunyi secara otomatis. Setel AutoHide ke false untuk membiarkan keyboard tetap tampil.
-
-Penampilan keyboard juga bisa diubah dengan menetapkan file CSS terkustomisasi melalui CssUrl. Standarnya nama kelas CSS untuk keyboard adalah 'Keyboard'. Ini juga bisa diubah dengan menetapkan KeyboardCssClass
-
-TLabel menampilkan teks pada halaman Web. Teks yang ditampilkan disetel melalui properti Text. Jika Text kosong, konten yang ditutupi dalam tag komponen TLabel akan ditampilkan. TLabel juga dapat dipakai sebagai label formulir yang terkait dengan beberapa kontrol pada formulir. Karena Text bukan HTML-dikodekan ketika disajikan, pastikan ia tidak berisi karakter berbahaya yang ingin anda hindari.
-
-TLinkButton mirip dengan TButton dalam setiap aspek kecuali bahwa TLinkButton ditampilkan sebagai hiperlink. Teks link ditentukan oleh properti Text. Jika properti Text kosong, maka konten tombol yang ditampilkan (oleh karenanya, anda bisa menutupi tag <img> di dalam badan tombol dan mendapatkan tombol gambar.
-
-Kontrol Daftar yang tercakup pada seksi ini semuanya diturunkan secara langsung atau tidak langsung dari TListControl. Oleh karena itu akan berbagi set properti yang sama dan umum dipakai, termasuk,
-
-Karena TListControl berasal dari TDataBoundControl, kontrol daftar ini juga berbagi operasi umum yang sama yang dikenal sebagai databinding atau penyatuan data. Items dapat dipopulasikan dari data yang sudah ada dan ditetapkan oleh DataSource atau DataSourceID. Fungsi yang memanggil dataBind() akan menyebabkan populasi data. Untuk kontrol daftar, data bisa ditetapkan dalam dua jenis format berikut:
-
-TListBox menampilkan kotak daftar yang membolehkan satu atau multipel pilihan. Setel properti SelectionMode sebagai Single untuk menjadikan kotak daftar pilihan tunggal, dan Multiple untuk kotak daftar pilihan multipel. Jumlah baris ditampilkan dalam kotak ditetapkan melalui nilai properti Rows.
-
-TDropDownList menampilkan kotak daftar dropdown yang membolehkan pengguna untuk memilih opsi tunggal dari beberapa yang telah ditetapkan.
-
-Sejak v3.1.1, TDropDownList mulai mendukung teks pertanyaan (seperti 'Please select:' sebagai item list pertama). Untuk menggunakan fitur ini, setel baik PromptText ataupun PromptValue, atau keduanya. Jika pengguna memilih item pertanyaan, dropdown list tidak akan dipilih.
-
-TCheckBoxList menampilkan sebuah daftar kotak centang pada halaman Web. Penjajaran teks selain setiap kotak centang dapat ditetapkan dengan TextAlign. Tata letak kotak centang bisa dikontrol oleh properti berikut:
-
-TRadioButtonList mirip dengan TCheckBoxList dalam setiap aspek kecuali bahwa setiap TRadioButtonList menampilkan sebuah grup tombol radio. Hanya satu tombol radio dapat dipilih, (TCheckBoxList membolehkan pilihan multipel).
-
-TBulletedList menampilkan item dalam format bulat pada halaman Web. Gaya bulat dapat ditetapkan dengan BulletStyle. Ketika gaya adalah CustomImage, tanda bulat ditampilkan sebagai gambar, yang ditetapkan dengan BulletImageUrl.
-
-TBulletedList menampilkan teks item dalam tiga mode berbeda,
-
-TLiteral menampilkan teks statis pada halaman Web. TLiteral mirip dengan kontrol TLabel, kecuali bahwa TLiteral
- * Kontrol tidak memiliki properti style, seperti BackColor, Font, dll.
-
-Teks yang ditampilkan oleh TLiteral bisa dikontrol secara programatis dengan menyetel properti Text. Teks yang ditampilkan mungkin HTML-dikodekan jika Encode adalah true (nilai standarnya false).
-
-TLiteral akan menyajikan konten yang dikurung dalam tag komponen jika Text kosong.
-
-Harap berhati-hati jika Encode adalah false, pastikan Text tidak berisi karakter yang tidak diinginkan yang dapat menjadikan keamanan mudah ditembus.
-
-TMultiView bertindak sebagai penampung grup kontrol TView, yang dapat diambil oleh properti Views. Setiap tampilan berisi kontrol anak. TMultiView menentukan tampilan mana dan kontrol anaknya yang terlihat. Kapan saja hanya satu tampilan terlihat (disebut aktif). untuk mengaktifkan tampilan, setel ActiveView atau ActiveViewIndex. Catatan, standarnya tidak ada tampilan yang aktif.
-
-Untuk menambah tampilan ke TMultiView, manipulasi koleksi Views atau tambah ia dalam template seperti berikut,
-
-TMultiView merespon event perintah berikut untuk mengatur penampakan tampilannya.
-
-Setelah postback, jika indeks tampilan aktif diubah, TMultiView akan memunculkan event OnActiveViewChanged.
-
-Permainan Hangman adalah penggunaan umum dari TMultiView. Contoh berikut memperlihatkan kegunaan lain dari TMultiView.
-
-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.
-
-TOutputCache menghidupkan cache sebagian dari halaman Web, juga dikenal sebagai partial caching. Konten yang sedang di-cache adalah sumber halaman HTML yang berasal dari teks statis pada template PRADO atau disajikan oleh satu atau beberapa kontrol pada template. Ketika konten yang di-cache dipakai, kontrol yang membuat konten tidak lagi dibuat untuk hirarki halaman dan selanjutnya penghematan secara signifikan waktu pemrosesan halaman dapat dicapai. Efek sampingnya, seperti yang sudah anda bayangkan adalah bahwa konten yang ditampilkan mungkin membosankan jika versi cache ditampilkan ke para pengguna.
-
-Untuk menggunakan TOutputCache, cukup kurung konten yang akan di-cache di dalam tag komponen TOutputCache pada template (baik template kontrol halaman ataupun non-halaman), misalnya
-
-di mana konten yang di-cache bisa berupa teks statis dan/atau tag template. Jika yang kedua, hasil penyajian dari tag template akan di-cache. Anda dapat menempatkan satu atau beberapa TOutputCache pada satu template dan ia dapat diulang-ulang.
-
-Validitas dari konten yang di-cache ditentukan berdasarkan dua faktor: Durasi dan ketergantungan cache. Pembentuk menetapkan jumlah detik data bisa tetap benar dalam cache (standarnya 60 detik), sementara yang kedua menetapkan kondisi data yang di-cache tergantung padanya. Jika ketergantungan berubah (misalnya data relevan dalam DB dimutakhirkan), data yang di-cache akan dibuat tidak benar dan diabaikan.
-
-Ada dua cara untuk menetapkan ketergantungan cache. Seseorang bisa menulis pengendali event guna merespon event OnCheckDependency dan menyetel properti parameter event IsValid untuk menunjukan apakah data yang di-cache tetap benar atau tidak. Seseorang juga bisa memperluas TOutputCache dan mengganti metode getCacheDependency()-nya.
-
-Konten yang diambil dari cache dapat bervariasi dengan memperhatikan beberapa parameter. TOutputCache mendukung variasi dengan memperhatikan parameter permintaan, yang ditetapkan oleh properti VaryByParam. Jika parameter permintaan yang ditetapkan berbeda, versi berbeda dari konten yang di-cache dipakai. Ini sangat berguna jika konten halaman mungkin divariasikan berdasarkan beberapa parameter GET. Konten yang sedang di-cache juga dapat divariasikan dengan sesi pengguna jika VaryBySession disetel true. Untuk memvariasikan konten yang di-cache oleh faktor lain, ganti metode calculateCacheKey().
-
-Output cache bisa diulang. Cache terluar mengambil lebih dulu di atas cache terdalam dalam menentukan kebenaran konten yang di-cache. Ini berarti, jika konten yang di-cache oleh cache terdalam berakhir atau dibuat tidak benar, sementara yang terluar tidak, maka konten terluar yang di-cache akan dipakai.
-
-Standarnya, TOutputCache hanya efektif untuk permintaan halaman non-postback dan saat modul cache dihidupkan. Jangan mencoba untuk mengalamatkan kontrol anak pada TOutputCache saat konten yang di-cache saat ini sedang dipakai. Gunakan properti ContentCached untuk menentukan apakah konten di-cache atau tidak.
-
-TPager membuat sebuah lembaran yang menyediakan UI bagi pengguna akhir untuk secara interaktif menetapkan halaman data mana yang disajikan dalam kontrol turunan-TDataBoundControl, seperti TDataList, TRepeater, TCheckBoxList, dll. Kontrol data-terikat sasaran ditetapkan dengan properti ControlToPaginate, yang harus berupa path ID dari kontrol sasaran yang dijangkau dari tempat penamaan lembar.
-
-Note, the target data-bound control must have its AllowPaging set to true. Otherwise the pager will be invisible. Also, in case when there is only one page of data available, the pager will also be invisible.
-
-TPager dapat menampilkan salah satu dari tiga tipe antarmuka pengguna, ditetapkan melalui properti Mode-nya:
-
-Antarmuka pengguna ini selanjutnya dapat dikustomisasi dengan mengkonfigurasi properti berikut
-
-TPager memunculkan event OnPageIndexChanged ketika pengguna-akhir berinteraksi dengannya dan menetapkan halaman baru (misalnya dengan mengklik pada tombol halaman berikutnya yang akan membawa ke halaman berikutnya). Para pengembang dapat menulis pengendali untuk merspon event ini dan medapatkan indeks halaman baru yang diinginkan, seseorang bisa memasukan halaman baru data ke kontrol ikatan-data terkait.
-
-TPanel bertindak sebagai tempat penyajian untuk kontrol lain. Ia menampilkan elemen <div> pada halaman. Properti Wrap menetapkan konten badan panel yang menggulung ataupun tidak, sementara HorizontalAlign mengatur bagaimana konten dijajarkan secara horisontal dan Direction menunjukan arah konten (kiri ke kanan atau kanan ke kiri). Anda dapat menyetel BackImageUrl untuk memberikan gambar latar belakang pada panel, dan dana bisa menyetel GroupingText agar panel ditampilkan sebagai set field dengan legenda teks. Terakhir, anda bisa menetapkan tombol standar untuk dipicu saat para pengguna menekan tombol 'return' di dalam panel dengan menyetel properti DefaultButton.
-
-TPlaceHolder menyimpan tempat pada template, di mana teks statis atau kontrol dapat disisipkan secara dinamis.
-
-TRadioButton mirip dengan TCheckBox dalam setiap aspek, kecuali bahwa TRadioButton menampilkan tombol radio pada halaman Web. Tombol radio dapat dimiliki oleh grup yang ditetapkan oleh GroupName dengan demikian hanya satu tombol radio yang bisa dipilih.
-
-TRepeater menampilkan kontennya secara berulang berdasarkan data yang diambil dari DataSource. Konten yang diulang dalam TRepeater disebut items sebuah kontrol yang dapat diakses melalui properti Items. Ketika dataBind() dipanggil, TRepeater membuat sebuah item untuk setiap baris data dan mengikat baris data ke item. Secara opsional, TDataList dapat mempunyai header, footer dan/atau pemisah antara item.
-
-Tata letak dari konten yang diulang dalam TDataList ditetapkan dengan template inline. Item TDataList, header, footer, dll. diturunkan dengan template terkait saat data sedang diikat ke pengulang.
-
-Sejak v3.1.0, tata letak juga bisa dietapkan oleh penyaji. Penyaji adalah kelas kontrol yang dapat diturunkan sebagai item datalist, header, dll. Penyaji dapat dilihat sebagai template eksternal (sebenarnya, ia juga merupakan kontrol tanpa-template). Penyaji bisa berupa kelas kontrol apapun. Dengan menggunakan penyaji, seseorang dapat menghindari penulisan panjang dan template yang kacau. Karena penyaji adalah sebuah kelas, ia juga membantu menggunakan kembali template yang sebelumnya mungkin disertekan di dalam template lain. Jika diimplementasikan dengan salah satu antarmuka berikut, penyaji akan diinisialisasi dengan properti tambahan yang relevan terhadap item penyaji:
-
-Properti berikut dipakai untuk menetapkan tipe template dan penyaji datalist. Jika tipe konten didefinisikan dengan template dan penyaji, maka penyaji diambil lebih dulu.
-
-Untuk mempopulasikan data ke dalam item pengulag, setel DataSource ke obyek data yang benar, seperti array, TList, TMap, atau tabel database, dan kemudian panggil dataBind() untuk pengulang. Yaitu,
-
-Ketika dataBind() dipanggil, TRepeater menjalani masa hidup seperti berikut untuk setiap baris data:
-
-Biasanya anda hanya perlu mengikat data ke pengulang saat halaman yang berisi pengulang mulai diminta. Ketika halaman adalah post back, pengulang akan mengembalikan secara otomatis seluruh konten, termasuk item, header, footer dan pemisah. Akan tetapi, baris data yang terkait dengan setiap item tidak akan ditemukan kembali dan menjadi null.
-
-Untuk mengakses data item pengulang dalam postbacks, gunakan salah satu cara berikut:
-
-TRepeater memunculkan OnItemCommand kapan saja kontrol tombol di dalam beberapa item pengulang memunculkan event OnCommand. Oleh karena itu, anda bisa menangani semua event OnCommand di satu tempat dengan menulis pengendali event untuk event OnItemCommand.
-
-Contoh berikut memperlihatkan bagaimana menggunakan TRepeater guna menampilkan data tabular.
-
-TRepeater Dapat digunakan dalam situasi lebih kompleks. Sebagai contoh, kami tampilkan dalam contoh berikut bagaimana menggunakan pengulang yang diulang-ulang, misalnya pengulang dalam pengulang. Ini umum terlihat dalam penyajian data master-detail. Untuk menggunakan pengulang di dalam pengulang lain, untuk sebuah item untuk pengulang di luarnya dibuat, kita perlu menyetel sumber data detail untuk pengulang terdalam. Ini bisa dilakukan dengan merespon ke event OnItemDataBound pada pengulang terluar. Event OnItemDataBound dimunculkan setiap kali item pengulang terluar menyelesaikan penyatuan data. Dalam contoh berikut, kita mengeksploitasi event lain pada pengulang yang disebut OnItemCreated, yang dimunculkan setiap kali item pengulang (dan kontennya) baru saja dibuat. Kita respon ke event ini dengan menyetel warna latar belakang berbeda untuk item pengulang guna menyempurnakan tampilan latar belakang item berganti. Ini menghemat kita dari penulisan AlternatingItemTemplate untuk pengulang.
-
-Selain menampilkan data, TRepeater juga bisa dipakai untuk mengumpulkan data dari pengguna. Kontrol validasi dapat ditempatkan dalam template TRepeater guna memberifikasi bahwa input pengguna sudah benar.
-
-Demo Penyusun komponen PRADO adalah contoh yang baik atas penggunaan tersebut. Ia menggunakan pengulang untuk mengumpulkan properti komponen dan definisi event. Para pengguna juga dapat menghapus atau menyesuaikan event dan propertinya, yang diimplementasikan dengan merespon ke event OnItemCommand pada pengulang.
-
-Lihat dalam contoh lain berikut yang memperlihatkan bagaimana menggunakan pengulang untuk mengumpulkan input pengguna.
-
-Contoh ini memperlihatkan bagaimana menggunakan penyaji item "drop-in", tersedia sejak v3.1.0. Penyaji ini ada dalam rilis PRADO. Mereka intinya kontrol yang mengimplementasikan antarmuka IDataRenderer. Kontrol Web umum, seperti TTextBox, TLabel, semuanya mengimplementasikan antarmuka ini. Ketika kontrol tersebut adalah penyaji item yang dipakai, properti Data ditempati dengan baris data yang sedang diikat ke item pengulang.
-
-Lebih sering, seseorang perlu mengkustomisasi tata letak item pengulang. Contoh di atas bergantng pada OnItemCreated untuk menyesuaikan penampilan pengulang. Pengulang item template lebih disukai dalam situasi ini, karena membolehkan kita untuk menyimpan tata letak dan konten yang lebih kompleks dalam sebuah item pengulang. Contoh berikut mengimplementasikan ulang contoh pengulang yang diulang-ulang menggunakan template item penyadi yang disebut RegionDisplay. seperti kita lihat, kode baru lebih mudah dimengerti dan dipelihara.
-
-TSafeHtml adalah kontrol yang membuang semua konten HTML yang berpotensi membahayakan. Ini terutama sebagai pelapis dari proyek SafeHTML. Menurut proyek SafeHTML, ia mencoba untuk mengamankan situasi berikut saat string ditampilkan kepada pengguna-akhir:
-
-Untuk menggunakan TSafeHtml, cukup kurung konten untuk diamankan dalam tag komponen TSafeHtml pada template. Konten bisa terdiri dari teks statis dan kontrol PRADO. Jika yang kedua, hasil penyajian kontrol akan aman.
-
-TSlider menampilkan sebuah slider untuk keperluan input numerik. Slider terdiri dari lajur
-yang medefinisikan jangkauan nilai yang mungkin, dan sebuah kendali yang dapt bergeser pada lajur, untuk memilih
-sebuah nilai dalam jangkauan. Lajur dapat berupa Horisontal atau Vertikal, tergantung dari properti Direction.
-Standarnya adalah horisontal.
-
-Batas jangkauan ditetapkan oleh properti MinValue dan MaxValue.
-Jangkauan standar mulai dari 0 sampai 100.
-Properti StepSize bisa dipakai untuk mendefinisikan langkah diantara 2 nilai didalam jangkauan.
-Catatan bahwa langkah ini akan dihitung ulang jika ada lebih dari 200 nilai diantara batas jangkauan.
-Anda juga bisa melengkapi nilai yang diijinkan dengan menyetel array Values.
-
-sub-properti kendali dapat diakses dengan properti Handle. Anda juga bisa menyediakan kontrol anda sendiri
-untuk kendali, menggunakan properti HandleClass. Catatan bahwa kelas ini harus berupa subkelas dari TSliderHandle
-
-Kontrol TSlider bisa dikustomisasi dengan mudah menggunakan CssClasses. Anda bisa menyediakan file css sendiri menggunakan properti CssUrl.
-Kelas css untuk TSlider dapat disetel dengan properti CssClass. Nilai standarnya dalah 'hslider' untuk
-slider Horisontal, atau 'vslider' untuk Vertikal.
-Kelas css untuk Handle bisa disetel dengan subproperti Handle.CssClass. Standarnya adalah 'handle', yang menggambar blok merah sebagai kursor. Kelas css 'handle-image' juga disediakan demi kenyamanan anda, yang berfungsi menampilkan gambar sebagai kendali.
-
-Jika properti AutoPostBack adalah true, postback dilakukan segera setelah nilai berubah.
-
-TSlider memunculkan event onValueChanged saat nilai slider telah berubah selama postback.
-
-Anda juga bisa melampirkan pengendali event javascript ClientSide ke slider :
- * tutorial untuk kontrol ini belum lengkap.
-TStatements mengevaluasi rangkaian pernyataan PHP dan menampilkan konten yang disajikan oleh pernyataan. Untuk menetapkan pernyataan PHP yang dievaluasi, setel properti Statements. Sebagai contoh, tag komponen berikut menampilkan waktu saat ini pada halaman Web,
-
-Catatan, TStatements mengevaluasi pernyataan PHP selama menyajikan masa hidup kontrol. Tidak seperti TExpression, TStatements hanya menampilkan konten 'echoed' di dalam pernyataan.
-
-Konteks pernyataan dalam kontrol TStatements adalah kontrol itu sendiri. Yakni, $this mewakili obyek kontrol jika ia ada dalam pernyataan. Sebagai contoh, tag pernyataan berikut akan menampilkan judul halaman berisi kontrol TStatements.
-
-Harap berhati-hati, karena TStatements membolehkan eksekusi kode PHP bebas, secara umum anda jangan menggunakannya untuk mengevaluasi kode PHP yang dikirimkan oleh pengguna aplikasi anda.
-
-TTabPanel menampilkan panel bertab. Para pengguna dapat mengklik pada bar tab untuk beralih diantara tampilan tab yang berbeda. Setiap tampilan tab adalah panel independen yang dapat berisi konten bebas.
-
-Kontrol TTabPanel terdiri dari satu atau beberapa kontrol TTabView yang mewakili tampilan tab yang mungkin. Kapan saja, hanya satu tampilan tab terlihat (aktif), yang ditetapkan oleh setiap properti berikut:
-
-Jika ActiveViewIndex dan ActiveViewID keduanya disetel, yang kedua diambil lebih dahulu.
-
-TTabPanel menggunakan CSS untuk menetapkan penampilan bat tab dan panel. Standarnya, file CSS yang disertakan akan diterbitkan berisi CSS standar untuk TTabPanel. Anda juga dapat menggunakan file CSS sendiri dengan menetapkan properti CssUrl. Properti berikut menetapkan kelas CSS yang dipakai untuk elemen div dalam TTabPanel:
-
-Untuk menggunakan TTabPanel, tulis template seperti berikut:
-
-TTable menampilkan tabel HTML pada halaman. ia dipakai bersama dengan TTableRow dan TTableCell untuk membolehkan memanipulasi tabel HTML secara programatis. Baris dari tabel disimpan dalam properti Rows. Anda dapat menyetel tabel cellspacing dan cellpadding masing-masing melalui properti CellSpacing dan CellPadding. Judul tabel dapat ditetapkan melalui Caption di mana penjajarannya ditetapkan dengan CaptionAlign. Properti GridLines menunjukan bagaimana tabel harus menampikan bingkainya, dan BackImageUrl membolehkan tabel untuk memiliki gambar latar belakang.
-
-TTextBox menampilkan kotak teks pada halaman Web. Konten dalam kotak teks ditentukan oleh properti Text. Anda dapat membuat teks SingleLine, a MultiLine, atau Kata sandi dengan menyetel properti TextMode. Properti Rows dan Columns menetapkan dimensinya. Jika AutoPostBack adalah true, perubahan konten dalam kotak teks dan kemudian memindahkan fokur keluar darinya akan menyebabkan aksi postback.
-
-TTextHighlighter melakukan penerangan sintaks untuk konten badannya, termasuk teks statis dan hasil penyajian dari kontrol anaknya. Teks yang sedang diterangi mengikuti sintaks Language yang ditetapkan, yang dapat berupa 'php' (standar), 'prado', 'css', 'html', dll. Di sini, 'prado' terdiri dari sintaks template kontrol PRADO.
-
-Jika nomor baris diinginkan di depan setiap baris, setel ShowLineNumbers ke true.
-
-Untuk menggunakan TTextHighlighter, cukup kurung konten yang sintaksnya akan diterangi di dalam badan pada kontrol TTextHighlighter. Contoh berikut menerangi bagian kode PHP,
-
-Kontrol validasi disebut validator, melakukan validasi terhadap nilai data yang dimasukan-pengguna saat ia ditulis kembali ke server. Validasi dipicu oleh kontrol postback, seperti properti TButton, TLinkButton atau TTextBox (di bawah mode AutoPostBack) di mana properti CausesValidation adalah true.
-
-Validasi selalu dilakukan pada sisi server. Jika EnableClientScript adalah true dan browser klien mendukung JavaScript, validator juga dapat melakukan validasi sisi-klien. Validasi sisi-klien akan memvalidasi input pengguna sebelum ia mengirimkannya ke server. Data formulir tidak akan dikirmkan jika ada kesalahan terdeteksi. Ini menghindari informasi yang diperlukan untuk validasi sisi-server.
-
-Validator dengan berbagai set properti umum yang didefinisikan dalam basis kelas TBaseValidator dan didaftarkan sebagai berikut,
-
-TRequiredFieldValidator memastikan bahwa pengguna memasukan beberapa data dalam field input yang ditetapkan. Standarnya TRequiredFieldValidator akan memeriksa apakah input pengguna kosong atau tidak. Validasi gagal jika input kosong. Dengan menyetel InitialValue, validator dapat memeriksa apakah input pengguna berbeda dari InitialValue. Jika tidak, validasi gagal.
-
-TRegularExpressionValidator memverifikasi input pengguna terhadap pola reguler. Validasi gagal jika input tidak sama dengan pola. Ekspresi reguler bisa ditetapkan dengan properti RegularExpression. Beberapa ekspresi reguler yang umumnya dipakai termasuk:
-
-Pola ekspresi reguler lebih jauh dapat ditemukan di Internet, misalnya
-http://regexlib.com/.
-
-Catatan, TRegularExpressionValidator hanya memeriksa input pengguna yang tidak kosong. Gunakan TRequiredFieldValidator untuk memastikan input pengguna tidak kosong.
-
-TEmailAddressValidator memverifikasi bahwa input pengguna adalah alamat email yang benar. Validator menggunakan ekspresi reguler untuk memeriksa apakah input adalah format alamat email yang benar. Jika CheckMXRecord adalah true, validator juga akan memeriksa apakah rekaman MX yang diindikasikan dalam alamat email adalah benar, checkdnsrr() tersedia dalam PHP yang diinstalasi.
-
-Catatan, jika input yang divalidasi kosong, TEmailAddressValidator tidak akan melakukan validasi. Gunakan TRequiredFieldValidator untuk memastikan nilai tidak kosong.
-
-TCompareValidator membandingkan input pengguna dengan nilai konstan yang ditetapkan oleh ValueToCompare, atau input pengguna lain yang ditetapkan oleh ControlToCompare. Properti Operator menetapkan bagaimana untuk membandingkan nilai, yang menyertakan Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan dan LessThanEqual. Sebelum perbandingkan, nilai yang dibandingkan akan diubah ke tipe yang ditetapkan oleh DataType seperti didaftarkan sebagai berikut,
-
-Catatan, jika input yang sedang divalidasi kosong, TEmailAddressValidator tidak akan melakukan validasi. Gunakan TRequiredFieldValidator untuk memastikan nilai tidak kosong.
-
-N.B. Jika memvalidasi terhadap TDatePicker properti DataType harus sama dengan "Date" dan properti DateFormat pada validator harus sama dengan DateFormat pada TDatePicker.
-
-TDataTypeValidator memverifiksai apakah data input adalah tipe spesifik sepeti ditunjukan oleh DataType. Tipe data dapat diperiksa kembali apakah sama seperti yang ada dalam TCompareValidator.
-
-N.B. Jika memvalidasi terhadap TDatePicker properti DataType harus sama dengan "Date" dan properti DateFormat pada validator harus sama dengan DateFormat pada TDatePicker.
-
-TRangeValidator memverifikasi apakah nilai input di dalam jangkauan yang ditetapkan. TRangeValidator menggunakan properti kunci untuk melakukan validasinya. Properti MinValue dan properti MaxValue menetapkan nilai minimum dan maksimum dari jangkauan yang benar. Properti DataType menetapkan tipe data dari nilai yang sedang divalidasi. Pertama, nilai akan diubah ke dalam tipe yang ditetapkan dan kemudian dibandingkan dengan jangkauan yang benar. Tipe data bisa diperiksa apakah sama dengan yang ada dalam TCompareValidator.
-
-Jika properti StrictComparison disetel ke true, maka jangkauan dibandingkan semata-mata kurang dari MaxValue dan/atau lebih besar dari MinValue.
-
-N.B. Jika memvalidasi terhadap TDatePicker properti DataType harus sama dengan "Date" dan properti DateFormat pada validator harus sama dengan DateFormat pada TDatePicker.
-
-TCustomValidator melakukan validasi didefinisikan-pengguna (baik sisi-server atau sisi-klien ataupun keduanya) pada kontrol input.
-
-Untuk membuat fungsi validasii sisi-server, sediakan pengendali untuk event OnServerValidate yang melakukan validasi. String data pada kontrol input untuk memvalidasi dapat diakses dengan parameter event properti Value. Hasil validasi harus disimpan dalam properti IsValid pada parameter.
-
-Untuk membuat fungsi validasi sisi-klien, tambahkan fungsi validasi javascript ke template halaman dan tempatkan namanya ke properti ClientValidationFunction. Fungsi harus memiliki tanda sebagai berikut:
-
-TValidationSummary menampilkan ringkasan dari kesalahan inline validasi pada halaman Web, dalam kotak pesan, atau keduanya.
-
-Standarnya ringkasan validasi akan mengumpulkan ErrorMessage dari semua validator yang gagal pada halaman. Jika ValidationGroup tidak kosong, hanya validator itu yang dimiliki grup akan menampilkan pesan kesaslahannya dalam ringkasan.
-
-Ringkasan dapat ditampilkan sebagai daftar, daftar bertitik, atau satu paragraf berdasarkan properti DisplayMode. Pesan yang ditampilkan dapat diawali dengan HeaderText. Ringkasan dapat ditampilkan pada halaman Web atau kotak pesan JavaScript, masing-masing dengan menyetel properti ShowSummary dan ShowMessageBox. Catatan, yang terakhir hanya efektif saat EnableClientScript adalah true.
-
-Validator bisa mereset pada sisi-klien menggunakan javascript dengan memanggil
-Prado.Validation.reset(groupID) di mana groupID adalah nama pengelompokan. Jika groupID adalah null, maka validator tanpa pengelompokan yang dipakai.
-
- Semua validator berisi event berikut.
- Event terkait untuk sisi klien tersedia sebagai sub-properti
- dari properti ClientSide pada validator.
- Contoh berikut memunculkan pesan yang mengatakan "hello" saat validator gagal pada sisi-klien.
-
-Contoh berikut memperlihatkan penggunaan event validator sisi-klien dan sisi server. Contoh mendemonstrasikan validasi kondisional. Catatan bahwa, kita perlu menuliskan kode untuk sisi server dan klien. Selanjutnya, pada sisi server, kita perlu menghidupkankembali validator kondisional agar kode javascript dihasilkan tanpa mempedulikan apapun (sebaliknya, validator sisi-klien tidak tersedia).
-
-TWizard adalah analogi terhadap bimbingan instalasi yang umum digunakan untuk menginstalasi software pada Windows. Ia memisahkan formulir besar dan menyajikan pengguna dengan sederetan formulir lebih kecil, disebut langkah bimbingan, untuk diselesaikan. Gambar berikut memperlihatkan bagaimana bimbingan dibuat atas kapan disajikan untuk pengguna, di mana konten langkah adalah konten utama pada langkah bimbingan untuk diselesaikan oleh para pengguna, header merujuk ke konten header yang umum bagi seluruh langkah, navigasi berisi tombol yang membolehkan pengguna untuk menjelajahi langkah demi langkah, dan bar samping berisi daftar hiperlink di mana para pengguna dapat menjangkau ke setiap langkah dengan satu klik. Penampakan bar samping dapat dihidup matikan dengan menyetel ShowSideBar.
-
-Standarnya TWizard menyertakan komponen di atas dalam sebuah tabel HTML agar bar samping bisa ditampilkan di kiri sementara sisanya di kanan. Jika UseDefaultLayout disetel ke false, tidak ada tabel HTML yang akan dipakai, dan para pengembang hrus menggunakan teknik murni CSS untuk posisi komponen bimbingan. Catatan, setiap komponen ditampilkan sebagai <div> dan bimbingan sendiri juga adalah <div> yang mengurung komponennya <div>.
-
-Langkah bimbingan disajikan dengan TWizardStep dan dipelihara dalam TWizard melalui properti WizardSteps. Kapan saja hanya satu yang terlihat, yang ditentukan oleh properti ActiveStep. Properti ActiveStepIndex memberikan indeks pada langkah yang aktif dalam koleksi langkah. Mengklik pada tombol navigasi dapat mengaktifkan langkah bimbingan yang berbeda.
-
-Langkah bimbingan biasanya ditambahkan ke bimbingan melalui template seperti berikut,
-
-Dalam contoh di atas, StepType merujuk ke tipe langkah bimbingan, yang dapat mempengaruhi bagaimana penampilan navigasi dan perilaku langkah. Langkah bimbingan dapat berupa salah satu dari tipe berikut:
-
-Dalam contoh ini, kita menggunakan bimbingan untuk mengumpulkan preferensi pengguna pada warna. Dalam langkah pertama, pengguna disajikan dengan daftar dropdown dari mana dia dapat memilih warna favoritnya. Dalam langkah kedua, langkah lengkap, pilihannya dalam langkah sebelumnya ditampilkan. Dalam aplikasi sebenarnya, pada langkah ini pilihan bisa disimpan dalam database di belakang layar.
-
-TWizard mendefinisikan seluruh set properti untuk kustomisasi penampilan berbagai komponennya seperti yang ditampilkan pada gambar di atas. Dalam keadaan tertentu, properti berikut disediakan untuk kustomisasi gaya:
-
-Berikut adalah set langkah bimbingan, TWizard mendukung tiga cara navigasi diantaranya:
-
-TWizard mendukung kontrol konkrit dari penampilannya melalui template. Dalam keadaan tertentu, ia menyediakan properti template yang membolehkan kustomisasi lengkap pada header, navigasi dan bar samping.
-
-Langkah bimbingan juga dapat diberi template. Dengan menggunakan TTemplatedWizardStep, seseorang dapat mengkustomisasi konten langkah dan navigasi melalui masing-masing properti ContentTemplate dan NavigationTemplate. Ini berguna untuk pengembang kontrol guna membangun bimbingan khusus seperti registrasi pengguna, kereta belanja, dll.
- The above example shows demonstrates only a fraction of the capabilities
of the SqlMap Data Mapper. Further details can be found in the
- SqlMap Manual.
+ SqlMap Manual.
Rekaman Aktif adalah obyek yang melapisi baris dalam tabel atau view database,
- melindungi akses database dan menambahkan logika domain pada data tersebut.
- Dasar dari Rekaman Aktif adalah kelas bisnis, sebagai contoh, kelas
- Products, yang hampir menyamai struktur rekaman dari tabel database
- dibawahnya. Setiap Rekaman Aktif akan bertanggung jawab atas
- penyimpanan dan pengambilan data ke dan dari database. Rekaman Aktif adalah pilihan yang baik untuk logika domain yang tidak terlalu rumit,
- seperti membuat, membaca, memutakhirkan, dan menghapus. Derivasi dan validasi
- didasarkan pada satu rekaman yang bekerja denga baik dalam struktur ini. Rekaman Aktif mempunyai kuntungan utama dalam hal kesederhanaan. Mudah untuk membangun Rekaman Aktif, dan mudah untuk dimengerti. Akan tetapi, seiring dengan perkembangan logika bisnis Anda dalm hal kompleksitas, Anda akan segera ingin menggunakan hubungan langsung obyek Anda, koleksi, turunan, dan seterusnya. Ini tidak mudah diterapkan ke dalam Rekaman Aktif, dan menambahkannya sedikit demi sedikit menjadi sangat kacau.
- Argumen lain terhadap Rekaman Aktif adalah kenyataan bahwa ia menyandingkan desin obyek ke desain database. Ini menjadikannya lebih sulit untuk merefraktorisasi karena proyek terus berjalan. Alternatifnya adalah menggunakan Pemeta Data yang yang memisahkan aturan dari obyek bisnis dan bagaimana obyek ini disimpan.
- Prado menyediakan pilihan tambahan antara Rekaman Aktif dan
- Pemeta Data SqlMap.
- Pemeta Data SqlMap bisa dipakai untuk mengambil obyek Rekaman Aktif, hasilnya; obyek Rekaman Aktif ini bisa dipakai untuk memutakhirkan database.
- "Hubungan" antara Rekaman Aktif dan SqlMap digambarkan dalam diagram berikut. Lebih rinci mengenai Pemeta Data SqlMap dapat ditemukan dalam
- Manual SqlMap.
- alt="Rekaman Aktif dan SqlMap DataMapper" id="fig:diagram.png" class="figure"/>
-
- Kelas Rekaman Aktif berfungsi untuk melakukan tugas-tugas berikut.
-
-Implementasi Prado terhadap Rekaman Aktif tidak memelihara identitas referensial. Setiap obyek diperoleh menggunakan Rekaman Aktif pada data dalam database. Sebagai contoh, jika Anda meminta kustomer tertentu dan mendapatkan kembali obyek Customer, kali berikutnya Anda meminta kustomer itu, Anda akan kembali mendapatkan turunan lain dari obyek Customer. Ini berarti bahwa perbandingan tepat (misalnya menggunakan ===) akan mengembalikan false, sementara perbandingan bebas (misalnya menggunakan ==) akan mengembalikan true jika nilai obyek sama menurut perbandingan bebas.
-
-
-Implikasi desain ini terkait dengan pertanyaan berikut.
-"Anda pikir kustomer sebagai obyek, di mana hanya satu,
-atau Anda pikir obyek yang Anda operasikan sebagai duplikat dari database?"
-Pemetaan O/R lain akan mengartikan bahwa hanya ada satu obyek Kustomer dengan custID 100, dan secara literal ia adalah kustomer.
-Jika Anda mendapatkan kustomer dan mengubah field-nya, maka Anda sekarang telah mengubah kustomer itu.
-"Itu berbatasan dengan: Anda telah mengubah duplikat kustomer ini, tapi bukan pada duplikat itu.
-Dan jika dua orang memutakhirkan kustomer pada dua duplikat obyek, siapapun yang memutakhirkan pertama kali, atau mungkin yang terakhir yang menang." [A. Hejlsberg 2003]
-
-Implementasi Rekaman Aktif memanfaatkan kelas Prado DAO untuk akses data.
-Implementasi Rekaman Aktif saat ini mendukung database sebagai berikut.
- Dukungan database lain dapat disediakan jika permintaan mencukupi. Mari kita anggap tabel
- "users" berikut yang berisi dua kolom bernama "username" dan "email",
- di mana "username" juga merupakan kunci primer.
- Selanjutnya kelas Rekaman Aktif kita yang terkait dengan tabel "users".
- Setiap kolom dari tabel "users" harus mempunyai properti terkait atas nama yang sama seperti nama kolom dalam kelas UserRecord.
- Tentunya, Anda juga mendefinisikan variabel atau properti tambahan yang tidak ada dalam struktur tabel.
- Konstan kelas
- TABLE adalah opsional saat nama kelas adalah sama seperti nama tabel dalam database, sebaliknya TABLE harus
- menetapkan nama tabel yang terkait dengan kelas Rekaman Aktif Anda.
-
- Karena TActiveRecord memperluas TComponent, metode penyetel dan pengambil dapat didefinisikan guna membolehkan kontrol melalui bagaimana variabel disetel dan dikembalikan. Sebagai contoh, menambah properti $level untuk menggunakan kelas UserRecord:
- Lebih jelas mengenai TComponent dapat ditemukan dalam Dokumentasi komponen.
-Nantinya kita harus dapat menggunakan pengambil/penyetel guna membolehkan pengambilan malas atas obyek yang berhubungan.
-
- Metode statis finder() mengembalilkan turunan UserRecord
- yang dapat dipakai untuk mengambil rekaman dari database. Pengambilan rekaman menggunakan metode finder akan didiskusikan nanti. Metode statis TActiveRecord::finder() mengambil nama kelas Rekaman Aktif sebagai parameter.
-
- Koneksi database standar untuk Rekaman Aktif dapat disetel sebagai berikut.
- Lihat Menetapkan Koneksi Database untuk
- rincian lebih jauh mengenai pembuatan koneksi database secara umum.
- Alternatifnya, Anda dapat membuat basis kelas dan mengganti metode getDbConnection() untuk mengembalikan
-koneksi database. Ini adalah cara sederhana untuk mengijinkan koneksi database multipel. Kode berikut mendemonstrasikan penetapan koneksi database dalam sebuah basis kelas (tidak perlu menyetel koneksi DB di manapun juga).
-
- Koneksi database standar dapat juga dikonfigurasi menggunakan tag <module> dalam application.xml
- atau config.xml seperti berikut.
- Properti ConnectionID dapat ditetapkan dengan nilai yang terkait ke nilai ID konfigurasi modul TDataSourceConfig lain. Ini membolehkan koneksi database yang sama untuk dipakai dalam modul lainnya seperti SqlMap.
-
- Kelas TActiveRecord menyediakan banyak metode yang sesuai untuk mencari rekaman dari database. Yang paling sederhana adalah mencari satu rekaman yang sama dengan kunci primer atau kunci komposit (kunci primer yang terdiri dari multipel kolom).
- Lihat Mencari satu rekaman hanya menggunakan kunci primer atau kunci gabungan.
- Mencari multipel rekaman menggunakan sebuah daftar kunci primer atau kunci gabungan.
-Berikut adalah persamaan untuk kunci primer (kunci primer terdiri dari hanya satu kolom/field).
- Mencari satu rekaman tunggal yang memenuhi kriteria. Kriteria dapat berupa bagian string SQL atau obyek TActiveRecordCriteria. Kelas TActiveRecordCriteria mempunyai properti sebagai berikut:
- Sama seperti find() tapi mengembalikan array obyek. Metode find dinamis menggunakan bagian dari nama metode sebagai kriteria pencarian.
-Nama metode dimulai dengan findBy mengembalikan hanya 1 rekaman dan nama metode yang dimulai dengan findAllBy mengembalikan array rekaman.
-Kondisi diambil sebagai bagian dari nama metode setelah findBy atau findAllBy.
-
-Blok kode berikut adalah sama:
- Mencari rekaman menggunakan SQL penuh di mana findBySql() mengembalikan Rekaman Aktif dan findAllBySql()mengembalikan array obyek rekaman.
-Untuk setiap kolom yang dikembalikan, kelas Rekaman Aktif terkait harus mendefinisikan variabel atau properti untuk setiap nama kolom terkait.
- Mencari jumlah rekaman yang sama, menerima beberapa parameters seperti metode findAll().
-Menambah rekaman baru menggunakan TActiveRecord sangat sederhana, cukup buat obyek Rekaman Aktif baru dan panggil metode save(). Misalnya
-
-Untuk memutakhirkan rekaman dalam database, cukup ubah satu atau lebih properti obyek Rekaman Aktif yang sudah diambil dari database dan kemudian panggil metode save().
-
-
-Obyek Rekaman Aktif mempunyai masa-hidup sederhana seperti digambarkan dalam diagram berikut.
-
-Kita melihat bahwa obyek TActiveRecord baru dibuat dengan menggunakan salah satu metode find*() ataupun membuat turunan baru dengan menggunakan kata kunci PHP new. Obyek yang dibuat dengan metode find*() dimulai dengan kondisi clean. Turunan baru TActiveRecord membuat selain metode find*() yang dimulai dengan kondisi new.
-Kapan saja Anda memanggil metode save() pada obyek TActiveRecord, obyek memasuki keadaan clean. Obyek dalam clean menjadi dirty ketika satu atau lebih keadaan internalnya diubah. Pemanggilan metode delete() pada obyek mengakhiri masa-hidup obyek, tidak ada aksi lanjutan yang dilakukan pada obyek.
-
- Untuk menghapus rekaman yang sudah ada dan diambil, cukup panggil metode delete().
- Anda juga dapat menghapus rekaman dalam database dengan kunci primer tanpa mengambil rekaman apapun menggunakan metode deleteByPk() (dan metode yang sama deleteAllByPks()).
- Sebagai contoh, untuk menghapus satu atau beberapa rekaman dengan menggunakan satu atau lebih kunci primer.
-
-Untuk kunci gabungan (ditentukan secara otomatis dari definisi tabel):
-
-Untuk menghapus dengan kriteria, gunakan deleteAll($criteria) dan deleteBy*()
-yang sintaksnya mirip dengan findAll($criteria) dan findAllBy*() seperti dijelaskan di atas.
- Semua obyek Rekaman Aktif berisi properti DbConnection yang dapat dipakai untuk mendapatkan obyek transaksi.
-
-TActiveRecord menawarkan dua event, OnCreateCommand dan OnExecuteCommand.
- Event OnCreateCommand dimunculkan ketika perintah disiapkan dan penyatuan parameter lengkap. Obyek parameter adalah TDataGatewayEventParameter di mana properti
-Command bisa diperiksa agar SQL query dijalankan.
-
-Event OnExecuteCommand dimunculkan ketika perintah dijalankan dan hasil dari database dikembalikan. Obyek parameter TDataGatewayResultEventParameter
-dari properti Result berisi data yang dikembalikan dari database.
-Data yang dikembalikan dapat diubah dengan setelan properti Result.
- Menggunakan OnExecuteCommand kita dapat menempelkan pengendali event untuk mencatat seluruh query SQL yang dijalankan untuk kelas TActiveRecord atau turunan yang diberikan. Sebagai contoh, kita mendefinisikan sebuah basis kelas dan mengganti getDbConnection() atau konstruktornya.
-
-Implementasi Rekaman Aktif Prado mendukung pemetaan kunci asing untuk database
-yang mendukung batasan kunci asing. Agar hubungan Rekaman Aktif berfungsi, database di bawahnya harus mendukung batasan kunci asing (misalnya MySQL menggunakan InnoDB).
-
-Dalam bagian berikut kita akan menganggap hubungan tabel antara
-Teams, Players, Skills dan Profiles.
- Tujuannya adalah untuk mendapatkan model obyek yang mewakili ke beberapa derajat hubungan entitas dalam gambar di atas.
-
-Ada ketidak cocokan antara hubungan dengan obyek dan hubungan tabel. Pertama, ada perbedaan dalam penyajian. Penghubung kendali obyek dengen menyimpan referensi yang dipegang oleh lingkungan memori-teratur runtime. Database relasional menangani kaitan dengan membentuk sebuah kunci ke dalam tabel lainnya. Keuda, obyek dapat dengan mudah menggunakan koleksi guna menangani multipel referensi dari satu field, sementara normalisasi memaksa seluruh relasi entitas mengaitkan ke nilai tunggal. Ini menyebabkan pembalikan struktur data antara obyek dan tabel. Pendekatan yang diambil dalam desain Rekaman Aktif Prado adalah untuk menggunakan batasan kunci asing guna memperoleh hubungan obyek. Ini berarti bahwa database di bawahnya harus mendukung batasan kunci asing.
- Hubungan entitas antara tabel Teams dan Players adalah apa yang dikenal sebagai hubungan 1-M. Yaitu, satu Tim dapat berisi 0 atau lebih Pemain. Dalam batasan hubungan obyek, kita katakan bahwa obyek TeamRecord memiliki banyak obyek PlayerRecord.
-(Perhatikan kebalikan dari arah hubungan antara tabel dan obyek.)
-
-
-
-Kita membuat model obyek Team sebagai kelas Rekaman Aktif berikut.
-
-Properti statis $RELATIONS dari TeamRecord mendefinisikan bahwa properti $players has many PlayerRecord. Multipel hubungan dibolehkan dengan mendefinisikan setiap hubungan dengan sebuah entitas dalam array $RELATIONS di mana kunci array untuk entri menunjukan nama properti.
-Dalam array(self::HAS_MANY, 'PlayerRecord'), elemen pertama mendefinisikan tipe hubungan, tipe yang benar adalah self::HAS_MANY,
-self::HAS_ONE dan self::BELONGS_TO.
-Elemen kedua adalah string 'PlayerRecord' yang menunjukan nama kelas dari kelas PlayerRecord.
-
-Batasan kunci asing tabel Players dipakai untuk menentukan nama kunci tabel Teams terkait. Ini dikerjakan secara otomatis, ditangani dalam Rekaman Aktif dengan memeriksa definisi tabel Players dan Teams.
- Hubungan "has many" tidak diambil secara otomatis ketika Anda menggunakan salah satu metode finder Rekaman Aktif.
-Anda perlu untuk mengambil secara eksplisit obyek terkait seperti berikut. Dalam kode di bawah ini, kedua baris adalah sama dan nama metode tidak sensitif huruf.
-
-Metode with_xxx() (di mana xxx adalah nama properti hubungan, dalam hal ini, players) mengambil PlayerRecords terkait menggunakan query kedua (bukan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder lainnya dari TActiveRecord, misalnya with_players('age = ?', 35).
- Hubungan "has many" dalam bagian di atas mendefinisikan koleksi obyek asing. Dalam keadaan tertentu, kita mempunyai TeamRecord memiliki banyak (nol atau lebih) obyek PlayerRecord. Kita juga dapat menambah penunjuk kembali dengan menambahkan properti dalam kelas PlayerRecord yang mengaitkan kembali ke obyek TeamRecord, secara efektif membuat asosiasi dua arah.
-Kita katakan bahwa properti $team dalam kelas PlayerRecord belongs to obyek TeamRecord.
-Kode berikut mendefinisikan kelas PlayerRecord lengkap dengan 3 hubungan.
-
-Properti $RELATIONS dari PlayerRecord mendefinisikan properti $team milik TeamRecord.
-Array $RELATIONS juga mendefinisikan dua hubungan lainnya yang nanti akan kita uji dalam seksi di bawah ini.
-Dalam array(self::BELONGS_TO, 'TeamRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO dan
-elemen kedua adalah string 'TeamRecord' yang terkait ke nama kelas dari kelas TeamRecord.
-Obyek pemain dengan obyek tim terkait dapat diambil serperti berikut.
-
- Metode with_xxx() (di mana xxx adalah nama properti hubungan dalam hal ini, team) mengambil TeamRecords terkait menggunakan query kedua (bukan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder lainnya dari TActiveRecord, contohnya with_team('location = ?', 'Madrid').
- Hubungan "belongs to" dari kelas ProfileRecord didefinisikan hampir sama. Intinya, ada hubungan "belongs to" untuk obyek yang mengaitkan entitas yang memmpunyai kolom yakni kunci asing. Dalam keadaan tertentu, kita melihat bahwa tabel Profiles mempunyai batasan kunci asing pada kolom player_id yang terkait ke tabel
-Players kolom player_id. Selanjutnya, obyek ProfileRecord
-memiliki properti ($player) yang adalah milik obyek PlayerRecord.
-Demikian juga, tabel Players mempunyai batasan kunci asing pada kolom team_name yang terkait ke tabel Teams kolom name.
-Kemudian, obyek PlayerRecord mempunyai properti ($team) yang adalah milik obyek TeamRecord.
- Hubungan entitas antara Players dan Profiles adalah satu ke satu. Yaitu, setiap obyek
-PlayerRecord has one obyek ProfileRecord (mungkin tidak ada atau null).
-Hubungan has one hampir identik ke hubungan has many dengan eksepsi bahwa obyek terkait hanya satu obyek (bukan koleksi obyek).
- Hubungan leluhur anak bisa didefinisikan menggunakan kombinasi hubungan has many dan belongs to yang
-merujuk ke kelas yang sama. Contoh berikut memperlihatkan hubungan leluhur dan anaknya antara "kategori" dan "leluhur kategori".
-
-Dalam contoh di atas, kami memperlihatkan bahwa obyek Rekaman Aktif dapat mereferensi ke obyek terkaitnya sendiri dengan
-mendeklarasikan anggota kelas statis $RELATIONS yang menetapkan sebuah daftar relasi. Setiap relasi
-ditetapkan sebagai array yang terdiri dari tiga elemen: tipe relasi, nama kelas AR terkait,
-dan kunci asing. Sebagai contoh, kami menggunakan array(self::HAS_MANY, 'PlayerRecord', 'team_name')
-untuk menetapkan pemain dalam sebuah tim. Ada dua elemen opsional berikutnya yang dapat ditetapkan
-dalam array ini: kondisi query (elemen keempat) dan parameters (elemen kelima).
-Elemen tersebut dipakai untuk mengontrol bagaimana untuk melakukan query terhadap obyek terkait. Sebagai contoh, jika kita ingin memperoleh
-para pemain yang diurut dengan usianya, kita dapat menetapkan array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'ORDER BY age').
-Jika kita ingin mendapatkan para pemain yang usianya kurang dari 30, kita dapat menggunakan
-array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'age<:age', array(':age'=>30)). Secara umum,
-dua elemen tambahan ini mirip seperti parameter yang dikirimkan ke metode find() dalam AR.
-
-Obyek dapat dengan mudah menangani field multi nilai dengan menggunakan koleksi sebagai nilai field. Database relasional tidak memiliki fitur ini dan dibatasi hanya ke field nilai-tunggal. Ketika Anda memetakan asosiasi satu-ke-banyak, Anda bisa menangani ini menggunakan hubungan has many, intinya menggunakan kunci asing untuk nilai-tunggal akhir dari asosiasi. Tapi asosiasi banyak-ke-banyak tidak bisa melakukan ini karena tidak ada nilai-tunggal akhir ke kunci asing yang dipegangnya.
-
-Jawabannya adalah resolusi klasik yang telah dipakai oleh orang selama dekade ini yakni: buat tabel ekstra (tabel asosiasi) untuk merekam asosiasi.
-Ide dasarnya adalah menggunakan tabel asosiasi untuk menyimpan asosiasi. Tabel ini memiliki ID kunci asing untuk dua tabel yang dikaitkan bersama, masing-masing memiliki pasangan dari obyek yang diasosiasikan.
-
-Tabel asosiasi tidak mempunyai kaitan obyek dalam-memori dan kunci primernya adalah gabungan dari dua kunci primer dari tabel yang diasosiasikan.
-Dalam batasan yang sederhana, tuntuk mengambil data dari tabel asosiasi, Anda melakukan dua query (secara umum, ini juga bisa dicapai menggunakan satu query yang terdiri dari join).
-Anggap pengambilan koleksi SkillRecord untuk daftar obyek PlayerRecord.
-Dalam hal ini, Anda melakukan query dalam dua tahap. Tahap pertama meng-query tabel Players untuk mencari seluruh baris dari pemain yang Anda inginkan. Tahap kedua mencari obyek SkillRecord ID pemain terkait untuk setiap barisnya dalam tabel asosiasi Player_Skills menggunakan sebuah inner join.
- Desain Rekaman Aktif Prado mengimplementasikan dua tahap pendekatan. Untuk hubungan entitas Players-Skills M-N (many-to-many), kita perlu mendefinisikan sebuah hubungan has many dalam kelas PlayerRecord dan sebagai tambahan mendefinisikan hubungan has many dalam kelas SkillRecord juga.
-Kode contoh berikut mendefinisikan kelas SkillRecord lengkap dengan hubungan banyak-ke-banyak dengan kelas PlayerRecord. (Lihat definisi kelas PlayerRecord di atas untuk mengaitkan hubungan banyak-ke-banyak dengan kelas SkillRecord.)
-
-Properti statis $RELATIONS dari SkillRecord mendefinisikan bahwa properti $players memiliki banyak PlayerRecords melalui tabel asosiasi 'Player_Skills'.
-Dalam array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::HAS_MANY,
-elemen kedua adalah string 'PlayerRecord' yang terkait ke nama kelas dari kelas PlayerRecord, dan elemen ketiga adalah nama dari nama tabel asosiasi.
-
-Daftar obyek pemain dengan koleksi obyek skil terkait bisa diambil seperti berikut.
-
-Metode with_xxx() (di mana xxx adalah nama properti hubungan, dalam hal ini, Skill) mengambil SkillRecords terkait menggunakan query kedua (tidak dengan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder dari TActiveRecord.
-
-Untuk tabel asosiasi yang mererefensi dirinya sendiri, yaitu titik asosiasi ke tabel yang sama. Sebagai contoh, anggap tabel items dengan item terkait M-N melalui tabel asosiasi related_items. Sintaks dalam contoh berikut adalah benar untuk database PostgreSQL. Untuk database lain, lihat dokumentasinya masing-masing untuk mendefinisikan batasan kunci asing.
- Nama tabel asosiasi dalam elemen ketiga dari array hubungan dapat berisi nama kolom tabel asing. Kolom yang didefinisikan dalam tabel asosiasi harus juga didefinisikan dalam kelas rekaman (contohnya properti $related_item_id terkait ke kolom related_item_id dalam tabel related_items).
- Menggunakan metode with_xxx() akan mengambil hubungan rekaman sesuai permintaan. Mengambil rekaman terkait dengan lazy loading (yaitu, hanya obyek terkait itu saja yang diakses) bisa dicapai dengan menggunakan sebuah fitur TComponent yang menyediakan metode pengakses. Dalam keadaan tertentu, kita mendefinisikan pasangan metode pengambil dan penyetel di mana metode pengambil akan mengambil hubungan secara kondisional. Contoh berikut menggambarkan bahwa PlayerRecord dapat mengambil obyek asing $skills secara kondisional.
- Pertama kita perlu mengubah deklarasi $skills=array() ke properti private $_skills (perhatikan garis bawah) dan sebaliknya setel ke null. Ini membolehkan kita untuk mendefinisikan properti skills menggunakan metode pengambil/penyetel
-(lihat Komponen untuk lebih jelasnya). Metode pengambil getSkills() untuk properti skills akan mengambil malas rekaman skill terkait saat ia dipakai sebagai berikut. Catatan bahwa kita hanya melakukan pengambilan malas ketika $player_id tidak null (yakni, ketika rekaman sudah diambil dari database ataau id player sudah disetel).
- The setSkills() memastikan bahwa properti skills akan selalu berupa TList.
-Menggunakan TList yang membolehkan kita untuk menyetel elemen properti skills seolah-olah mereka
-sebuah array. Contohnya $player->skills[] = new SkillRecord(). Jika array dipakai, kesalahan PHP
-akan dikeluarkan.
-
-Sejak v3.1.1, Rekaman Aktif mulai mendukung pemetaan kolom. Pemetaan kolom membolehkan para
-pengembang untuk mengalamatkan kolom dalam Rekaman Aktif menggunakan konvensi penamaan lebih
-konsisten. Dalam keadaan tertentu, menggunakan pemetaan kolom, seseorang dapat mengakses kolom
-menggunakan apapun namanya yang disukainya, daripada nama terbatas yang didefinisikan dalam
-skema database.
-
-Untuk menggunakan pemetaan kolom, deklarasikan array statis bernama COLUMN_MAPPING dalam kelas Rekaman Aktif.
-Kunci dari array adalah nama kolom (disebut nama kolom fisik) yang didefinisikan dalam skema database,
-sementara nilai terkait dengan nama properti (disebut nama kolom logika) didefinisikan dalam
-kelas Rekaman Aktif. Nama properti dapat nama variabel anggota kelas public atau nama properti komponen
-yang didefinisikan via pengambil/penyetel. Jika nama kolom fisik terjadi sama seperti nama kolom logika,
-keduanya tidak perlu didaftarkan dalam COLUMN_MAPPING.
-
-Dengan pemetaan kolom di atas, kita mengalamatkan first_name menggunakan $userRecord->firstName
-daripada $userRecord->first_name. Ini membantu pemisahan dari logika dengan model.
-
-Obyek Akses Data atau Data Access Object (DAO) memisahkan data sumber daya antarmuka klien dari mekanisme akses datanya. Ia mengadaptasi API akses sumber daya ke antarmuka klien generik. Hasilnya, mekanisme akses data dapat diubah tersendiri atas kode yang menggunakan data.
-
-Sejak versi 3.1, PRADO mulai menyediakan DAO yang adalah pelapis tipis sekitar PHP Data Objects (PDO). Meskipun PDO memiliki set fitur bagus dan API yang baik, kami memilih untuk mengimplementasikan PRADO DAO di atas PDO karena kelas PRADO DAO adalah kelas komponen dan bisa dikonfigurasi dalam aplikasi PRADO. Para pengguna dapat menggunakan kelas DAO ini dalam cara yang lebih disukai-PRADO.
-
-PRADO DAO sebagian besar terdiri dari empat kelas (kebalikan dari PDO yang hanya dua kelas, PDO dan PDOStatement):
-
-Berikutnya, kami memperkenalkan penggunaan PRADO DAO dalam skenario yang berbeda.
-
-Untuk menetapkan koneksi database, seseorang membuat turunan TDbConnection dan mengaktifkannya. Nama sumber data (DSN) diperlukan guna menetapkan informasi yang dibutuhkan untuk menyambung ke database. Nama pengguna dan kata sandi database mungkin perlu disertakan untuk menetapkan koneksi.
-
-Spesifikasi lengkap terhadap DSN dapat ditemukan dalam dokumentasi PDO. Di bawah ini adalah daftar format DNS paling umum dipakai:
-
-Dalam hal terjadi kesalahan ketika menetapkan koneksi (seperti DSN atau nama pengguna/sandi salah), TDbException akan dimunculkan.
-
-Sekali koneksi database terlaksana, pernyataan SQL dapat dijalankan melalui TDbCommand. Seseorang membuat TDbCommand dengan memanggil TDbConnection.createCommand() dengan pernyataan SQL yang ditetapkan:
-
-Pernyataan SQL dijalankan melalui TDbCommand dalam salah satu dari dua cara berikut:
-
-Dalam hal terjadi kesalahan selama eksekusi pernyataan SQL, TDbException akan dimunculkan.
-
-Setelah TDbCommand.query() membuat turunan TDbDataReader, seseorang dapat mengambil baris dari data hasil dengan memanggil TDbDataReader.read() secara berulang. Seseorang juga bisa menggunakan TDbDataReader dalam konstruksi bahasa PHP foreach untuk mengambil baris demi baris.
-
-Ketika aplikasi menjalankan beberapa query, setiap pembacaan dan/atau penulisan informasi dalam database, penting untuk memastikan bahwa datanase tidak dibiarkan dengan hanya beberapa query yang dibawanya. Transaksi, mewakili turunan TDbTransaksi dalam PRADO, dapat diinisialisasi dalam hal ini:
-
-Guna menghindari serangan injeksi SQL dan untuk meningkatkan performansi dari eksekusi pernyataan SQL yang dipakai secara berulang-ulang, seseorang dapat "menyiapkan" pernyataan SQL dengan tempat parameter opsional yang akan diganti dengan parameter sebenarnya selama proses pengikatan parameter.
-
-Tempat parameter dapat bernama (diwakili dengan token unik) ataupun tidak bernama (diwakili dengan tanda tanya). Panggil TDbCommand.bindParameter() atau TDbCommand.bindValue() untuk mengganti tempat ini dengan parameter aktual. Parameter tidak perlu diberi tanda kutip: driver database melakukan ini bagi Anda. Pengikatan parameter harus dikerjakan sebelum pernyataan SQL dijalankan.
-
-Metode bindParameter() dan bindValue() sangat mirip. Perbedaanya hanyalah pembentuk mengikat parameter dengan referensi variabel PHP sementara yang terkahir dengan nila. Untuk parameters yang mewakili blok memori data besar, pembentuk lebih disukai untuk pertimbangan performansi.
-
-Untuk lebih jelasnya mengenai pengikatan parameter, lihat dokumentasi PHP terkait.
-
-Ketika mengambil hasil query, seseorang dapat juga mengikat kolom dengan bariabel PHP agar dipopulasikan secara otomatis dengan data terbaru setiap kali baris diambil.
- Kelas Rekaman Aktif dapat digunakan dengan
- Tampilan scaffold dimaksudkan untuk membantu dalam membuat prototipe aplikasi web, tidak didesain sebagai yang bisa dikustomisasi atau serumit komponen misalnya
-TDataGrid. Tampilan scaffold menyediakan fungsionalitas builtin:
- Tampilan Scaffold berdiri sendiri pada Rekaman Aktif dan saat ini mendukung database: Mysql, Sqlite dan Postgres SQL. Dukungan untuk database lain dapat diputuskan bila ada permintaan yang cukup. Untuk menggunakan tampilan scaffold, pertama kita mendefinisikan kelas Rekaman Aktif yang mewakili tabel atau view dalam database. Tetapkan kelas Rekaman Aktif berikut yang berkaitan dengan tabel users
-seperti didefinisikan dalam halaman Rekaman Aktif.
- Kelas tampilan scaffold ada di System.Data.ActiveRecord.Scaffold.*
-namespace.
-namespace ini bisa diimpor ke
-Konfigurasi Aplikasi
-menggunakan file application.xml atau melalui kode php menggunakan metode Prado::using(). Untuk mulai menggunakan
- Kode di atas akan mendaftar rekaman saat ini dalam tabel users.
-Setiap rekaman dapat diedit dengan mengklik tombol "edit" dan dihapus dengan mengklik tombol "delete". Rekaman baru bisa ditambahkan dengan mengklik pada tombol "Add new record", masukkan beberapa data (perhatikan validasi otomatis terhadap field dan tipe data yang diperlukan), dan klik tombol "save".
-Menetapkan batas pencarian dalam kotak teks cari guna menemukan rekaman tertentu. Akhirnya, daftar rekaman bisa disimpan pada setiap kolom dengan mengubah kolom pengurutan serta urutan.
- TScaffoldView adalah kontrol template yang dibuat dari kontrol scaffold lainnya.
-Properti berikut memberikan akses ke kontrol gabungan ini.
- Semua kontrol gabungan ini bisa dikustomisasi seperti yang akan kita lihat di bawah.
- Daftar Rekaman Aktif dapat ditampilkan menggunakan TScaffoldListView dengan properti berguna berikut. Penyajian kustom dari Rekaman Aktif dapat dicapai dengan menetapkan properti ItemTemplate dan/atau AlternatingItemTemplate dari pengulang List.
-TScaffoldListView akan mendengarkan dua event perintah bernama "delete" dan "edit". Perintah "delete" akan menghapus rekaman untuk baris di mana perintah "delete" berasal.
-Perintah "edit" akan memaksa data rekaman untuk diedit oleh
-TScaffoldEditView dengan ID yang ditetapkan dengan properti EditViewID.
-Contoh berikut mendaftar nama pengguna hanya dengan format tebal.
- Properti SearchCondition dan properti SearchParameters (mengambil nilai array) bisa ditetapkan untuk mengkustomisasi rekaman yang ditampilkan. SearchCondition
-akan dipakai sebagai properti Condition dari TActiveRecordCriteria
-dan properti SearchParameters berkaitan dengan properti
-Parameters dari TActiveRecordCriteria. Pemeta Data memindahkan data antara obyek dan database sementara memeliharanya berdiri sendiri satu sama lain dan pemetanya sendiri. Jika Anda mulai dengan
- Active Records, mungkin nantinya Anda dihadapkan dengan obyek bisnis lebih kompleks seiring denga kemajuan proyek Anda. Ketika Anda membangun model obyek dengan banyak logika bisnis, sangat berharga untuk memakai mekanisme ini untuk mengatur data lebih baik dan perilaku bersamanya. Melakukan itu menyebabkan skema varian; yakni skema obyek dan skema relasional tidak sama.
- Pemeta Data memisahkan obyek dalam-memori dari database. Tanggung jawabnya adalah mentransfer data diantara keduanya dan juga saling mengisolasinya.
- Dengan Pemeta Data obyek dalam-memori tidak perlu mengetahui meskipun ada sebuah database; tidak perlu kode antarmuka SQL, dan tentunya tidak mengetahui skema database. (Skema database selalu diabaikan dari obyek yang memakainya.)
- Tujuan utama menggunakan Pemeta Data ialah ketika Anda menginginkan skema database dan model obyek tumbuh secara independen. Keuntungan utama dari Pemeta Data adalah bahwa saat bekerja pada obyek bisnis (atau domain) Anda bisa mengabaikan database, baik dalam desain maupun pembangunan propes pengujian. Obyek domain tidak mengetahui struktur databasenya karena semua ini dikerjakan oleh pemeta.
- Ini membantu Anda dalam kode karena Anda bisa mengerti serta bekerja dengan obyek domain tanpa harus mengerti bagaimana ia disimpan dalam. Anda bisa memodifikasi model bisnis atau database tanpa harus mengubahnya. Dengan pemetaan rumit, terutama yang menyangkut database yang sudah ada, ini sangat berharga.
- Harga tentunya merupakan lapisan ekstra yang tidak Anda peroleh dengan Rekaman Aktif, maka pengujian menggunakan pola ini adalah kompleksitas dari logika bisnis. Jika Anda memiliki logika bisa cukup sederhana, Rekaman Aktif mungkin akan mencukupi.
-Untuk logika yang lebih rumit, Pemeta Data mungkin lebih cocok.
- Kerangka kerja Pemeta Data SqlMap memudahkan untuk menggunakan database dengan aplikasi PHP.
- PemetaData SqlMap memasangkan obyek dengan prosedur tersimpan atau pernyataan SQL menggunakan deskriptor XML. Kesederhanaan adalah keuntungan terbesar dari PemetaData SqlMap di atas piranti pemetaan relasional obyek. Untuk menggunakan PemetaData SqlMap Anda bergantung pada obyek Anda sendiri,
- XML, dan SQL. Anda sedikit yang harus mempelajari yang belum Anda ketahui.
- Dengan Pemeta Data SqlMap Anda mempunyai tenaga penuh pada SQL dan prosedur tersimpan di tangan Anda.
-
- alt="Tinjauan Pemeta Data SqlMap" id="fig:sqlmap.png" class="figure"/>
-
- Ini adalah penjelasan tingkat tinggi atas alur kerja yang dilukiskan pada gambar di atas.
- Menyediakan parameter, baik sebagai obyek ataupun tipe primitif. Parameter bisa dipakai untuk menyetel nilai runtime dalam pernyataan SQL atau prosedur. Jika nilai runtime tidak diperlukan, parameter dapat diabaikan.
- Menjalankan pemetaan dengan mengirimkan parameter dan nama yang Anda berikan pada deskriptor XML Anda. Langkah ini adalah saat di mana keajaiban terjadi. Kerangka kerja akan menyiapkan pernyataan SQL atau prosedur tersimpan, menyetel setiap nilai runtime menggunakan parameter Anda, menjalankan prosedur atau pernyataan, dan mengembalikan hasil.
- Dalam hal pemutakhiran, jumlah baris yang dipengaruhi dikembalikan. Dalam hal query, obyek tunggal, atau koleksi obyek dikembalikan. Seperti parameter, obyek hasil, atau koleksi obyek, bisa berupa obyek biasa ataupun tipe PHP primitif.
-
- Koneksi database untuk SqlMap dapat disetel seperti berikut.
- Lihat Menetapkan Koneksi Database untuk lebih jelasnya mengenai pembuatan koneksi database secara umum.
-
- TSqlMapManager bertanggung jawab untuk menyiapkan koneksi database dan mengkonfigurasi SqlMap dengan file XML yang diberikan. metode configureXml() menerima string yang merujuk ke file konfigurasi XML SqlMap. Sekali dikonfigurasi, panggil metode getSqlMapGateway() untuk memperoleh turunan dari antarmuka gateway SqlMap (pakai obyek ini untuk menyisipkan/menghapus/mencari rekaman).
-
- Koneksi database SqlMap juga bisa dikonfigurasi menggunakan tag <module> dalam application.xml atau
- config.xml seperti berikut.
-
- Atribut ConfigFile harus menunjuk ke file konfigurasi SqlMap (dijelaskan nanti) baik menggunakan path absolut, path relatif ataupun path notasi titik namespace Prado (harus mengabaikan ekstensi ".xml").
-
- Untuk mendapatkan antarmuka gateway SqlMap dari konfigurasi <module>, cukup lakukan misalnya
- Mari kita anggap tabel "users" berikut yang berisi dua kolom bernama "username" dan "email", di mana "username" juga merupakan kunci primer.
- Kemudian kita mendefinisikan kelas User biasa seperti berikut. Perhatikan bahwa User sangat sederhana.
- Selanjutnya, kita perlu mendefinisikan file konfigurasi XML SqlMap, mari namai file sebagai my-sqlmap.xml.
- Tag <select> mengembalikan definisi pernyataan SQL. Atribut id akan dipakai sebagai pengenal untuk query. Nilai atribut resultClass adalah nama kelas obyek yang dikembalikan.
- Sekarang kita dapat melakukan query obyek sebagai berikut:
-
- Contoh di atas hanya menampilkan demonstrasi sedikit kemampuan Pemeta Data SqlMap. Rincian selanjutnya dapat ditemukan dalam
- SqlMap Manual.
- Contoh di atas nampaknya seperti sepele dan ia juga seperti banyak pekerjaan hanya untuk mengambil data. Akan tetapi, perhatikan bahwa kelas User sama sekali tidak mengetahui telah disimpan dalam database, dan database tidak mengetahui kelas User.
-
- Salah satu keuntungan dari SqlMap adalah kemampuan memetakan hubungan
- obyek yang kompleks, koleksi dari datbase yang sudah ada. Dilain pihak,
- Rekaman Aktif menyediakan cara
- yang sangat sederhana untuk berinteraksi dengan database tapi tidak bisa
- melakukan hubungan atau koleksi yang lebih rumit. Kompromi yang baik adalah
- menggunakan SqlMap untuk mengambil hubungan dan koleksi rumit sebagai
- obyek Rekaman Aktif dan kemudian menggunakan Rekaman Aktif ini untuk memutakhirkan, menyisipkan dan menghapus.
- Melanjutkan contoh sebelumnya, kita mengubah definisi kelas User menjadi sebuah Rekaman Aktif.
- Kita juga perlu mengubah definisi dari konfigurasi XML SqlMap XML configuration. Kita cukup perlu mengubah nilai atribut resultClass ke UserRecord.
- Kode PHP untuk mengambil pengguna tetap sama, tapi sebaliknya SqlMap mengembalikan Rekaman Aktif, dan kita bisa mengambil keuntungan dari metode Rekaman Aktif.
-
- Rekordy Aktywne są obiektami, które opakowują wiersz w bazie danych lub widoku,
- obudowują (ang. encapsulate) dostęp do bazy danych oraz dziedziny logiki dla tych danych.
- Podstawą Rekordu Aktywnego są klasy biznesowe np. klasa
- Produkty, które są bardzo podobne do struktury rekordu należącego do bazy danych. Każdy Rekord Aktywny jest odpowiedzialny
- za zapisywanie i łądowanie danych do i z bazy danych. Rekord Aktywne jest dobrym wyborem dla dziedziny logiki, która nie jest zbyt złożona, tak jak tworzenie, odczyty, aktualizacje oraz usuwanie.
- Pochocne (ang. derivations) oraz sprawdzenia bazujące na pojedyńczym rekordzie sprawdzają się dobrze w tej konstrukcji.
- Rekord Aktywne ma podstawową zaletę, którą jest prostota. Łatwo jest stworzyć Rekord Aktywny, łatwo go również zrozuieć.
- Jednakże, jeśli twoja logika biznesowa staje się coraz bardziej złożona, wkrótce będziesz chciał
- używać bezpośrednich relacji, zbiorów, dziedziczenia twojego obiektu i tak dalej. Nie da się tego łatwo odwzorować za pomocą Rekordu Aktywnego,
- a dodawanie ich po kawałku staje się bardzo kłopotliwe. Innym argumentem przeciw Rekordowi Aktywnemu jest fakt, że łączy model obiektowy z modelem baz danych.
- To czyni trudniejszym refaktoring, gdy projekt idzie naprzód.
- Alternatywą jest używanie wzorca Data Mapper (mapa danych), który odseparowuje role obiektu biznesowego od tego jak te obiekty są przechowywane.
- Prado dostarcza
- Prado provides a darmowy wybór pomiędzy rekordem aktywnym a SqlMap Data Mapper.
- SqlMap Data Mapper może być uzywany do wczytania obiektów Rekordu Aktywnego, i na odwrót, te Rekordy Aktywne mogą zostać użyte do aktualizacji bazy danych.
- Związek pomiędzy Rekordem Aktywnym a SqlMap przedstawiony jest na kolejnym diagramie. Więcej informacji związanych z SqlMap Data Mapper można znaleźć w
- manualu SqlMap.
- alt="Active Records and SqlMap DataMapper" id="fig:diagram.png" class="figure"/>
-
- Klasa Rekordu aktywnego posiada funkcjonalność do przeprowadzenia następujących zadań:
-
-Implementacja wzorca Aktywnego Rekordu w PRADO nie zapewnia referencyjnej tożsamości (ang. referential identity). Każdy istniejący obiekt używający
-Rekordu Aktywnego jest koopią danych z bazy danych. Na przykład jeśli zapytasz o konkretnego klienta i zostanie zwrócony obiekt Klient,
-to następnym razem kiedy zapytasz o tego klienta otrzymasz spowrotem inną instancję obiektu Klient. To implikuje, że ścisłe porównianie (np. używając ===)
-zwróci fałsz, natomiast luźne porównianie (np. używając ==) zwróci prawdę jeśli wartości obiektu są równe poprzez luźne porónanie.
-
-
-Jest to implikacja modelu wynikająca z następującego pytania:
-"Czy myślisz o kliencie jako o obiekcie, którego któy jest tylko jeden, czy też myślisz o obiekcie na którym działasz jako o kopii bazy danych.
-Inne mapowania O/R implikują, że istnieje tylko jeden obiekt Klienta z KlientID 100
-Other O/R mappings will imply that there is only one Customer object with custID 100 i to dosłownie jest ten klient.
-Jeśli pobierzesz klienta i zmienisz pole w nim, wtedy masz zmienionego tego klienta.
-"To kontroastuje z: zmieniłeś tą kopię klienta ale nie tamtą kopię.
-Jeśli dwóch ludzi zaktualizuje kleinta z dwóch kopii obiektu, kto zaktualizuje pierwszy lub być może ostanie wygrywa." [A. Hejlsberg 2003]
-
-Implementacja Aktywnego Rekordu wykorzystuje kalsy Prado DAO by uzyskać dostęp do danych. Aktualna implementacja Aktywnego Rekordu wspiera następujace bazy danych
- Wsparcie dla pozostałych baz danych może zostać wprowadzone, keidy będzie dostatecne zapotrzebowanie Rozważmy następującą tablicę "users", która zawiera dwie kolumny nazwane "username" oraz "email",
- gdzie "username" jest kluczem głównym.
- Następnie zdefiniujemy naszą klasę Rekordu Aktywnego odpowiadającą tablicy "users".
- Każda kolumna tablicy "users" musi posiadać odpowiadającą jej właściwość o tej samej nazwie co kolumna w tablicy w klasie UserRecord.
- Oczywiście, możesz zdefiniować dodatkowe zmienne lub właściwości, które nie istnieją w strukturze tablicy.
- Stała TABLE jest opcjonalna w klasie , kiedy nazwa klasy jest taka sama jak nazwa tablicy w bazie danych, w przeciwnym przypadku TABLE
- musi określać nazwę tablicy, która odpowiada klasie Rekordu Aktywnego.
-
- Odkąd TActiveRecord rozszerza TComponent, metody setter i getter mogą zostać zdefiniowane
- by umożliwić kontrolę nad tym jak zmienne są ustawiane i zwracane. Na przykłąd dodanie właściwości $level
- do klasy UserRecord:
- Więcej szczegółów dotyczących TComponent można znaleźć dokumentacji komponentów.
-Później użyjemy metod getter/setters by umożliwić opóźnione ładowanie (ang. lazy loading) obiektów relacji.
-
- Metoda statyczna finder() zwraca instancję UserRecord, która może zostać użyta do załadowania rekordów z bazy.
- Ładowanie rekordów za pomocą tej metody będzie omówione później. Statyczna metoda TActiveRecord::finder()
- pobiera nazwę klasy Rekord Aktywnego jako parametr.
-
- Domyślne połączenie z bazą dla Rekordu Aktywnego może zostać ustawione następujaco.
- Zobacz Ustanawianie połączenia z bazą
- by uzyskać ogólnie dalsze szczegóły odnośnie tworzenia połączenia z bazą danych.
- Alternatywnie, możesz stworzyć klasę bazową i nadpisać metodę getDbConnection()
-do zwracania połączenia z bazą. To jest prosty spodób, by umożliwić wielkokrotne połączenia do wielu baz danych.
- Następujący kod demonstruje definiowanie połączenia z bazą danych w klasie bazowej (nie ma potrzeby by ustawiać połączenie DB gdziekolwiek indziej).
-
- Domyślne połączenie z bazą może zostać również skonfigurowane używając tagu <module>
- w pliku application.xml
- lub config.xml następująco:
- Do właściwość ConnectionID może zostać przypisana wartość ID z konfiguracji z innego modułu
- TDataSourceConfig. To pozwala uyżywać to połączenie z bazą danych w innych modułach, takich jak SqlMap (mapa SQL).
-
- Klasa TActiveRecord dostarcza wielu wygodnych metod do wyszukiwania rekordów z bazy danych.
- Najprostszym jest znajdowanie jednego rekordu poprzez dopasowanie klucza głównego lub klucza złożonego (ang. composite key)
- (klucz główny skłądający się z wielu kolumn).
- Zobacz Znajduje jeden rekord używając klucza głównego lub klucza złożonego.
- Znajduje wiele rekordów używając listy kluczy głównych lub kluczy złożonych.
-Co następuje jest odpowiednie dla kluczów głównych (klucz główny składa się tylko z jednego pola/kolumny)
- Znajduje pojedyńczy rekord, który spełnia kryteria. Kryteria mogą być częściowym łąńcuchem SQL lub obiektem TActiveRecordCriteria Klasa TActiveRecordCriteria ma następujące właściwości:
- Podobnie jak find() ale zwraca tablicę obiektów. Dynamiczne metody wyszukujące używające część nazwy metody jako kryteria wyszukiwania.
-Metody zaczynające się od słów findBy zwracają tylko 1 rekord natomiast metody zaczynające się findAllBy zwracają tablicę obiektów.
-Warunej jest wzięty jako część nazwy metody po przedrostku findBy lub findAllBy.
-
-Następujące bloki kodów są sobie równoważne:
- Znajdują rekordy używając pełnego zapytania SQL z tym, że findBySql()
-zwraca Rekord Aktywny a findAllBySql()zwraca tablicę obiektów rekordów.
-Dla każdej zwróconej kolumny, odpowiadająca klasa Rekordu Aktywnego musi posiadać zdefiniowaną zmienną lub właściwość odpowiadającą nazwie kolumny.
- Zlicza ilość pasujących rekordów, akceptuje te same parametry co metoda findAll()
-Dodanie nowego rekordu za pomocą TActiveRecord jest bardzo łatwe, po prostu stwórz nowy obiekt Rekordu Aktywnego i wywołaj metodę save(). Na przykład
-
-Aby zaktualizować rekord w bazie danych po prostu zmień jedną lub więcej właściwości obiektu Rekordu Aktywnego które zostały odczytane z bazy a następnie wywołaj metodę save().
-
-
-Obiekt Rekordu Aktywnego posiada prosty cykl życia zilustrowany następujący diagram.
-
-Widzimy, że nowe obiekty Rekordu Aktywnego są tworzone zarówno przez jedną z metod find*()
-lub poprzez stworzenie nowej instancji poprzez użycie polecenia PHP new. Obiekty stworzone przez metodę find*()
-zaczynają ze stanem czysty (ang. clean). Nowa instancja TActiveRecord stworzona inaczej niż za pomocą metod find*() zaczyna ze stanem nowy (ang. new).
-Kiedykolwiek wywołasz metodę save() na obiekcie TActiveRecord, obiekt przyjmuje stan czysty.
-Obiekty będące czystymi stają się brudne (ang. dirty) kiedy jeden lub więcej ze stwoich wewnętrznych stanów ulegnie zmianie.
-Wywoałanie metody delete() obiektu kończy cykl życia, żadne inne akcje nie mogą być wywołane na obiekcie.
-
- Aby usunąc istniejący rekord, który jest załadowany, po prostu wywołaj metodę delete.
- Możesz rónież usunąć rekord w bazie danych poprzez klucz główny bez ładowania żadnego rekordu używając metody
- deleteByPk() (również metoda deleteAllByPks()).
- Na przykład, aby usunąć jeden lub więcej rekordów z tabeli używając jednego lub wielu kluczów głównych:
-
-Dla klucza złożonego (ustalanego automatycznie na podstawie definicji tablicy):
-
-Aby usunąć używając kryteria użyj deleteAll($criteria) oraz deleteBy*()
-z podobną składnią jak findAll($criteria) oraz findAllBy*() opisaną wcześniej.
- Wszystkie obiekkty Rekordu Aktywnego zawierają właściwość DbConnection,
- która może być używana by uzyskać obiekt tranzakcyjny.
-
-Rekord Aktywny oferuje dwa zdarzenia: OnCreateCommand oraz OnExecuteCommand.
- Zdarzenie OnCreateCommand jest wołane gdy polecenie jest przygotowywane i przypisywanie (ang. binding) parametrów jest zakończone.
- Parametrem obiektu jest TDataGatewayEventParameter, którego właściwość Command może być sprawdzona by otrzymać zapytanie, które będzie wykonane wykonywane.
-
-Zdarzenie OnExecuteCommand jest wywoływane kiedy polecenie jest wykonane i rezultat z bazy danych został zwrócony.
- Parametrem obiektu jest TDataGatewayResultEventParameter, którego właściwość Result zawiera dane zwrócone z bazy danych.
- Dane zwrócone mogą zostać zmienione poprzez ustawienie właściwości Result.
- Używając OnExecuteCommand możemy przypiąć uchwyt zdarzenia by logować całe
-zapytanie SQL wwywoływane dla danej instancji lub klasy TActiveRecord. Na przykład definiujemy klasę bazową i nadpisujemy
-metodę getDbConnection() lub konstruktor.
-
-Implementacja Rekordu Aktywnego w Prado wspiera mapowanie kluczów obcych dla baz, które wspierają ograniczenia (ang. constraints) kluczów obcych.
- Aby relacje dla Rekordu Aktywnego działały używana baza danych musi wspierać ograniczenia klucza głównego (np. MySQL używająca InnoDB)
-
-W następnych sekcjach będziemy rozważać nastepujące relacje pomiędzy tabelami Teams, Players, Skills oraz Profiles.
- Celem jest uzyskanie modelu obiektowego, który będzie reprezetnował w pewnym stopniu relacje pomiędzy polami z powyższego rysunku.
-
-Istnieje rozbieżność pomiędzy relacjami w obiektach i relacjami w tablicach.
- Po pierwsze jest różnica w reprezentacji. Obiekty trzymają powiązanie poprzez przechowywanie referencji,
-które są trzymane poprzez zarządzające pamięcią środowiko uruchomieniowe. Bazy relacyjne trzymają powiązanie poprzez utworzenie klucza do innej tablicy.
- Po drugie, obiekty mogą łatwo uzywać kolekcji by trzymać wielokrotnie referencje z jednego pola,
-to handle multiple references from a single field, gdyż normalizacja zmusza wszystkie powiązania relacji encji by były pojedyńczymi wartościami.
-To prowadzi do odwrócenia struktury danych pomiędzy obiektami i tablicami.
-Podejście zastosowane w modelu Rekordu Aktywnego Prado uzywa ograniczeń kluczów obcych tablicy do wyprowadzenia relacji obiektów.
-To implikuje fakt wspierania ograniczeń kluczów obcych dla bazy danych.
- Relacja pól pomiędzy tablicami Teams and Players jest znana jako relacja jeden-do-wielu (ang. 1-M). Oznacza to, że jeden Team moze zawierać zero lub więcej Players. Z punktu widzenia relacji obiektów
-powiemy, że obiekt TeamRecord posiada wiele (ang. has many) obiektów PlayerRecord.
-(Zauważ odwrócenie kierunku relacji pomiędzy tablicami a obiektami)
-
-Zamodelujemy obiekt Team jako następującą klasę Rekordu Aktywnego.
-
-The static $RELATIONS property of TeamRecord defines that the
-property $players has many PlayerRecords. Multiple relationships
-is permitted by defining each relationship with an entry in the $RELATIONS
-array where array key for the entry corresponds to the property name.
-In array(self::HAS_MANY, 'PlayerRecord'), the first element defines the
-relationship type, the valid types are self::HAS_MANY, self::HAS_ONE,
-self::BELONGS_TO and self::MANY_TO_MANY.
-The second element is a string 'PlayerRecord' that corresponds to the
-class name of the PlayerRecord class.
-And the third element 'team_name' refers to the foreign key column in the Players table that
-references to the Teams table.
-
-The foreign key constraint of the Players table is used to determine the corresponding
-Teams table's corresponding key names. This is done automatically handled
-in Active Record by inspecting the Players and Teams table definitions.
- The "has many" relationship is not fetched automatically when you use any of the Active Record finder methods.
-You will need to explicitly fetch the related objects as follows. In the code below, both lines
-are equivalent and the method names are case insensitive.
-
-The method with_xxx() (where xxx is the relationship property
-name, in this case, players) fetches the corresponding PlayerRecords using
-a second query (not by using a join). The with_xxx() accepts the same
-arguments as other finder methods of TActiveRecord, e.g. with_players('age = ?', 35).
- The entity relationship between Players and Profiles is one to one. That is,
-each PlayerRecord object has one ProfileRecord object (may be none or null).
-A has one relationship is nearly identical to a has many relationship with the exception
-that the related object is only one object (not a collection of objects).
- The "has many" relationship in the above section defines a collection of foreign
-objects. In particular, we have that a TeamRecord has many (zero or more)
-PlayerRecord objects. We can also add a back pointer by adding a property
-in the PlayerRecord class that links back to the TeamRecord object,
-effectively making the association bidirectional.
-We say that the $team property in PlayerRecord class belongs to a TeamRecord object.
-The following code defines the complete PlayerRecord class with 3 relationships.
-
-The static $RELATIONS property of PlayerRecord defines that the
-property $team belongs to a TeamRecord.
-The $RELATIONS array also defines two other relationships that we
-shall examine in later sections below.
-In array(self::BELONGS_TO, 'TeamRecord', 'team_name'), the first element defines the
-relationship type, in this case self::BELONGS_TO;
-the second element is a string 'TeamRecord' that corresponds to the
-class name of the TeamRecord class; and the third element 'team_name' refers
-to the foreign key of Players referencing Teams.
-A player object with the corresponding team object may be fetched as follows.
-
- The method with_xxx() (where xxx is the relationship property
- name, in this case, team) fetches the corresponding TeamRecords using
- a second query (not by using a join). The with_xxx() accepts the same
-arguments as other finder methods of TActiveRecord, e.g.
-with_team('location = ?', 'Madrid').
- The "belongs to" relationship of ProfileRecord class is defined similarly. In essence, there exists a "belongs to" relationship for objects corresponding to
-entities that has column which are foreign keys. In particular, we see that
-the Profiles table has a foreign key constraint on the column player_id
-that relates to the Players table's player_id column. Thus, the ProfileRecord
-object has a property ($player) that belongs to a PlayerRecord object.
-Similarly, the Players table has a foreign key constraint on the column team_name that relates to the
-Teams table's name column.
-Thus, the PlayerRecord object has a property ($team) that belongs to a
-TeamRecord object.
- A parent child relationship can be defined using a combination of has many and belongs to
-relationship that refers to the same class. The following example shows a parent children relationship between
-"categories" and a "parent category".
-
-In the above, we show that an Active Record object can reference to its related objects by
-declaring a static class member $RELATIONS which specifies a list of relations. Each relation
-is specified as an array consisting of three elements: relation type, related AR class name,
-and the foreign key(s). For example, we use array(self::HAS_MANY, 'PlayerRecord', 'team_name')
-to specify the players in a team. There are two more optional elements that can be specified
-in this array: query condition (the fourth element) and parameters (the fifth element).
-They are used to control how to query for the related objects. For example, if we want to obtain
-the players ordered by their age, we can specify array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'ORDER BY age').
-If we want to obtain players whose age is smaller than 30, we could use
-array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'age<:age', array(':age'=>30)). In general,
-these two additional elements are similar as the parameters passed to the find() method in AR.
-
-Objects can handle multivalued fields quite easily by using collections as field values.
-Relational databases don't have this feature and are constrained to single-valued fields only.
-When you're mapping a one-to-many association you can handle this using has many relationships,
-essentially using a foreign key for the single-valued end of the association.
-But a many-to-many association can't do this because there is no single-valued end to
-hold the foreign key.
-
-The answer is the classic resolution that's been used by relational data people
-for decades: create an extra table (an association table) to record the relationship.
-The basic idea is using an association table to store the association. This table
-has only the foreign key IDs for the two tables that are linked together, it has one
-row for each pair of associated objects.
-
-The association table has no corresponding in-memory object and its primary key is the
-compound of the two primary keys of the tables that are associated.
-In simple terms, to load data from the association table you perform two queries (in general, it may also be achieved using one query consisting of joins).
-Consider loading the SkillRecord collection for a list PlayerRecord objects.
-In this case, you do queries in two stages.
-The first stage queries the Players table to find all the rows of the players you want.
-The second stage finds the SkillRecord object for the related player ID for each row
-in the Player_Skills association table using an inner join.
- The Prado Active Record design implements the two stage approach. For the
-Players-Skills M-N (many-to-many) entity relationship, we
-define a many-to-many relationship in the PlayerRecord class and
-in addition we may define a many-to-many relationship in the SkillRecord class as well.
-The following sample code defines the complete SkillRecord class with a
-many-to-many relationship with the PlayerRecord class. (See the PlayerRecord
-class definition above to the corresponding many-to-many relationship with the SkillRecord class.)
-
-The static $RELATIONS property of SkillRecord defines that the
-property $players has many PlayerRecords via an association table 'Player_Skills'.
-In array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), the first element defines the
-relationship type, in this case self::MANY_TO_MANY,
-the second element is a string 'PlayerRecord' that corresponds to the
-class name of the PlayerRecord class, and the third element is the name
-of the association table name.
-
-A list of player objects with the corresponding collection of skill objects may be fetched as follows.
-
-The method with_xxx() (where xxx is the relationship property
-name, in this case, Skill) fetches the corresponding SkillRecords using
-a second query (not by using a join). The with_xxx() accepts the same
-arguments as other finder methods of TActiveRecord.
-
-For self referenced association tables, that is, the association points to the same
-table. For example, consider the items table with M-N related
-item via the related_items association table. The syntax in the following
-example is valid for a PostgreSQL database. For other database, consult their respective documentation for
-defining the foreign key constraints.
- The association table name in third element of the relationship array may
-contain the foreign table column names. The columns defined in the association
-table must also be defined in the record class (e.g. the $related_item_id property
-corresponds to the related_item_id column in the related_items table).
- Using the with_xxx() methods will load the relationship record on demand. Retrieving the
-related record using lazy loading (that is, only when those related objects are accessed) can be
-achieved by using a feature of the TComponent that provides accessor methods. In particular,
-we define a pair of getter and setter methods where the getter method will retrieve the relationship
-conditionally. The following example illustrates that the PlayerRecord can retrieve its
-$skills foreign objects conditionally.
- We first need to change the $skills=array() declaration to a private property
-$_skills (notice the underscore) and set it to null instead. This allows us
-to define the skills property using getter/setter methods
-(see Components for details). The getSkills()
-getter method for the skills property will lazy load the corresponding skills foreign record
-when it is used as follows. Notice that we only do a lazy load when its $player_id is
-not null (that is, when the record is already fetched from the database or player id was already set).
- The setSkills() ensures that the skills property will always be a TList.
-Using a TList allows us to set the elements of the skills property as if they were
-arrays. E.g. $player->skills[] = new SkillRecord(). If array was used, a PHP error
-will be thrown.
-
-Since v3.1.1, Active Record starts to support column mapping. Column mapping allows developers
-to address columns in Active Record using a more consistent naming convention. In particular,
-using column mapping, one can access a column using whatever name he likes, rather than limited by
-the name defined in the database schema.
-
-To use column mapping, declare a static array named COLUMN_MAPPING in the Active Record class.
-The keys of the array are column names (called physical column names) as defined in the database
-schema, while the values are corresponding property names (called logical column names) defined
-in the Active Record class. The property names can be either public class member variable names or
-component property names defined via getters/setters. If a physical column name happens to be the same
-as the logical column name, they do not need to be listed in COLUMN_MAPPING.
-
-With the above column mapping, we can address first_name using $userRecord->firstName
-instead of $userRecord->first_name. This helps separation of logic and model.
-
-Aplikasi adalah turunan dari TApplication atau asal kelasnya. Ia mengatur modul yang menyediakan fungsionalitas berbeda dan diambil bila diperlukan. Ia menyediakan layanan bagi pengguna-akhir. Ia adalah tempat utama untuk menyimpan berbagai parameter dalam sebuah aplikasi. Dalam aplikasi PRADO, turunan aplikasi adalah satu-satunya obyek yang secara global dapat diakses melalui panggilan fungsi Prado::getApplication().
-
-Aplikasi dikonfigurasi melalui konfigurasi aplikasi. Biasanya dibuat dalam naskah entri seperti berikut,
-
-Aplikasi PRADO minimal berisi dua file: file entri dan file template halaman. Ini harus diatur sebagai berikut,
-
-
-Produk aplikasi PRADO biasanya membutuhkan file lebih banyak. Ia dapat menyertakan file konfigurasi aplikasi bernama application.xml di bawah path basis aplikasi protected. Halaman bisa diatur dalam direktori, beberapa diantaranya dapat berisi file konfigurasi halaman bernama config.xml. Untuk lebih jelasnya, silahkan lihat seksi konfigurasi.
-
-Menyebarkan aplikasi PRADO sebagian besar terkait dengan meng-copy direktori. Sebagai contoh, untuk menyebarkan aplikasi minimal di atas ke server lain, ikuti langkah-langkah berikut,
-
-Seperti masa hidup halaman, aplikasi juga mempunyai masa hidup. Modul aplikasi dapat meregistrasi event masa hidup. Ketika aplikasi mencapai masa hidup tertentu dan memunculkan event terkait, metode modul teregistrasi akan di panggil secara otomatis. Modul yang disertakan dalam rilis PRADO, seperti TAuthManager, menggunakan cara ini untuk melasanakan tujuannya.
-
-Masa hidup aplikasi dapat digambarkan sebagai berikut,
-
-PRADO adalah kerangka kerja presentasi utama, meskipun tidak dibatasi demikian. Kerangka kerja terfokus pada pembuatan pemrograman Web, yang banyak berkaitan dengan interaksi pengguna, menjadi berbasis-komponen dan kendali-event agar pengembang itu bisa lebih produktif. Susunan kelas berikut menggambarkan beberapa kelas utama yang disediakan oleh PRADO,
-
-Ketika aplikasi PRADO memproses permintaan halaman, diagram obyek statisnya dapat dilihat sebagai berikut,
-
-Komponen adalah turunan dari TComponent atau kelas anaknya. Basis kelas TComponent menerapkan mekanisme properti dan event komponen.
-
-Properti komponen dapat dilihat sebagai variabel public yang menjelaskan aspek tertentu dari komponen seperti warna latar belakang, besar font, dll. Properti didefinisikan dengan keberadaan metode penyetel dan/atau pengambil dalam kelas komponen. Sebagai contoh, dalam TControl, kami mendefinisikan properti ID menggunakan metode pengambil dan penyetel berikut,
-
-Untuk mendapatkan atau menetapkan properti ID, lakukan seperti berikut, seperti bekerja dengan sebuah variabel,
-
-Properti hanya-baca jika metode pengambil tetapi tidak untuk metode penyetel. Karena nama metode PHP adalah sensitif-huruf, nama properti juga sensitif-huruf. Kelas komponen mewariskan seluruh properti kelas leluhurnya.
-
-Subproperti adalah properti dari beberapa properti tipe-obyek. Sebagai contoh, TWebControl mempunyai properti Font yang merupakan tipe TFont. Kemudian properti Name dari Font dirujuk sebagai subproperti (dengan memperhatikan TWebControl).
-
-Untuk mendapatkan atau menentukan subproperti Name, gunakan metode beriktu,
-
-Event komponen adalah properti khusus yang mengambil nama metode sebagai nilainya. Melampirkan (setelan) metode ke sebuah event akan menancapkan metode ke tempat di mana event dimunculkan. Oleh karena itu, perilaku komponen bisa diubah dalam cara yang tidak terlihat selama pengembangan komponen.
-
-Event komponen didefinisikan dengan keberadaan metode yang namanya dimulai dengan kata on. Nama event adalah nama metode dan sensitif-huruf. Sebagai contoh, dalam TButton, kita mempunyai
-
-Namespace merujuk ke pengelompokan logis dari beberapa nama kelas agar dapat dibedakan dari nama kelas lain meskipun jika namanya sama. Karena PHP pada hakekatnya tidak mendukung namespace, Anda tidak bisa membuat turunan dari dua kelas yang mempunyai nama sama tapi dengan definisi berbeda. Untuk membedakan dari kelas didefinisikan pengguna, semua kelas PRADO diawali dengan huruf 'T' (berarti 'Type'). Para pengguna disarankan untuk tidak menamai kelasnya seperti ini. Sebaiknya mengawali nama kelasnya dengan huruf yang lainnya.
-
-Namespace dalam PRADO dianggap sebagai direktori yang berisi satu atau beberapa file kelas. Sebuah kelas dapat ditetapkan tanpa dwimakna menggunakan namespace demikian diikuti oleh nama kelas. Setiap namespace dalam PRADO ditetapkan dalam format berikut,
-
-Untuk menggunakan namespace dalam kode, lakukan seperti berikut,
-
-Untuk lebih jelasnya mengenai mendefinisikan alias path, lihat seksi konfigurasi aplikasi.
-
-Penurunan komponen berarti membuat turunan dari kelas komponen. Ada dua tipe penurunan komponen: penurunan statis dan dinamis. Komponen yang dibuat masing-masing disebut komponen statis dan komponen dinamis.
-
-Penurunan komponen dinamis berarti membuat turunan komponen dalam kode PHP. Itu sama dengan apa yang umum dirujuk pembuatan obyek dalam PHP. Sebuah komponen dapat dibuat secara dinamis menggunakan salah satu dari dua metode berikut dalam PHP,
-
-Penurunan komponen statis adalah mengenai pembuatan komponen melalui konfigurasi. Pekerjaan pembuatan sebenarnya dilakukan oleh kerangka kerja PRADO. Sebagai contoh, dalam konfigurasi aplikasi, seseorang dapat mengkonfigurasi sebuah modul untuk diambil ketika aplikasi dijalankan. Selanjutnya modul adalah komponen statis yang dibuat oleh kerangka kerja. Penurunan komponen statis lebih umum digunakan dalam template. Setiap tag komponen dalam sebuah template menetapkan komponen yang akan dibuat secara otomatis oleh kerangka kerja ketika template diambil. Sebagai contoh, dalam sebuah template halaman, tag berikut akan membawa ke pembuatan komponen TButton pada halaman,
-
-Kontrol adalah turunan dari kelas TControl atau asal sub kelasnya. Kontrol adalah komponen yang didefinisikan sebagai tambahan pada antarmuka pengguna. Kelas basis TControl mendefinisikan hubungan leluhur-anak diantara kontrol yang mencerminkan pengurungan hubungan diantara elemen antarmuka pengguna.
-
-Kontrol dikaitkan satu sama lain melalui hubungan leluhur-anak. Setiap kontrol leluhur dapat memiliki beberapa kontrol anak. Kontrol leluhur bertugas terhadap transisi keadaan dari kontrol anaknya. Hasil dari kontrol anak biasanya dipakai untuk mengatur penampilan kontrol leluhur. Hubungan leluhur-anak membawa kontrol bersama ke dalam susunan kontrol. Halaman ada di akar dari susunan yang penampilannya di berikan kepada pengguna-akhir.
-
-Hubungan leluhur-anak biasanya dilakukan oleh kerangka kerja melalui template. Dalam kode, Anda dapat menetapkan kontrol secara eksplisit sebagai anak dari yang lainnya menggunakan salah satu metode berikut,
-
-Setiap kontrol mempunyai properti ID yang dapat secara unik dapat mengidentifikasi dirinya sendiri diantara kontrol keluarganya. Sebagai tambahan, setiap kontrol mempunyai UniqueID dan ClientID yang dapat dipakai untuk mengidentifikasi kontrol secara global dalam susunan di mana kontrol berada. UniqueID dan ClientID sangat mirip. Pembentuk dipakai oleh kerangka kerja guna menentukan lokasi dari kontrol terkait dalam susunan, sementara yang kedua sebagian besar dipakai pada sisi klien sebagai ID tag HTML. Secara umum, Anda tidak boleh bergantung pada bentuk eksplisit UniqueID atau ClientID.
-
-Setiap kontrol mempunyai wadah penamaan yang mana kontrol membuat ruang nama (namespace) unik untuk membedakan antara kontrol dengan ID yang sama. Sebagai contoh, kontrol TRepeater membuat multipel item masing-masing mempunyai kontrol anak dengan ID yang sama. Untuk membedakan kontrol anak ini, setiap item bertindak sebagai wadah penamaan. Oleh karena itu, kontrol anak dapat diidentifikasi secara unik menggunakan wadah penamaan ID bersama dengan ID-nya sendiri. Seperti yang mungkin sudah Anda mengerti, UniqueID dan ClientID bergantung pada wadah penamaan.
-
-Kontrol dapat bertindak sebagai wadah penamaan jika ia menerapkan antarmuka INamingContainer.
-
-HTTP adalah protokol tidak berkondisi, berarti ia tidak menyediakan fungsionalitas untuk mendukung interaksi berlanjut antara pengguna dan server. Setiap permintaan dianggap sebagai diskrit dan berdiri sendiri dari yang lainnya. Aplikasi Web, sering perlu untuk mengetahui apa yang telah dilakukan pengguna dalam permintaan sebelumnya. Selanjutnya orang memperkenalkan sesi guna membantu mengingat informasi kondisi seperti itu.
-
-PRADO meminjam konsep viewstate dan controlstate dari Microsoft ASP.NET guna menyediakan tambahan mekanisme pemrograman berkondisi. Penyimpanan nilai dalam viewstate atau controlstate mungkin tersedia untuk permintaan berikutnya jika permintaan baru dari submisi (disebut postback) ke halamanyang sama oleh pengguna yang sama. Perbedaan antara viewstate dan controlstate adalah bahwa pembentuk dapat dimatikan saat yang kemudian tidak bisa.
-
-Viewstate dan controlstate diterapkan dalam TControl. Biasanya dipakai untuk mendefinisikan berbagai properti kontrol. Untuk menyimpan dan mengambil nilai dari viewstate atau controlstate, gunakan metode berikut,
-
-Setelah melihat aplikasi "Hello World", sekarang kita membuat aplikasi yang lebih rumit disebut "Permainan Hangman". Dalam permainan ini, pemain diminta untuk menebak kata, satu huruf setiap waktu. Jika dia menebak huruf dengan benar, huruf akan ditampilkan dalam kata. Pemain dapat melanjutkan untuk menebak selama angka kesalahannya dalam batas yang sudah ditetapkan. Pemain memenangkan permainan jika menemukan kata dalam batas kesalahan, atau dia kalah.
-
-Untuk memfasilitasi pembangunan permainan ini, kami perlihatkan diagram transisi keadaan dari proses permainan sebagai berikut,
-
-Modul adalah turunan dari kelas yang menerapkan antarmuka IModule. Umumnya sebuah modul didesain untuk fungsionalitas tertentu yang dapat disertakan ke dalam aplikasi PRADO dan berbagi dengan semua komponen dalam aplikasi.
-
-PRADO menggunakan konfigurasi untuk menetapkan apakah mengambil sebuah modul, mengambil modul jenis apa, dan bagaimana untuk menginisialisasi modul yang diambilnya. Para pengembang dapat mengganti modul inti dengan implementasinya sendiri melalui konfigurasi aplikasi, atau mereka dapat menulis modul baru guna menyediakan fungsionalitas tambahan. Sebagai contoh, modul dapat dikembangkan untuk menyediakan logika database umum pada satu atau beberapa halaman. Untuk lebih jelasnya, silahkan lihat konfigurasi.
-
-Ada tiga modul inti yang diambil secara standar kapan saja aplikasi dijalankan. Ketiganya adalah modul permintaan, modul respon, dan modul pengendali kesalahan. Sebagai tambahan, modul sesi diambil saat ia digunakan dalam aplikasi. PRADO menyediakan implementasi standar untuk semua modul ini. Modul kustom dapat dikonfigurasi atau dikembangkan guna mengganti atau menambah modul inti ini.
-
-Modul permintaan menyediakan penyimpanan dan skema akses untuk permintaan pengguna yang dikirim melalui HTTP. Permintaan pengguna datang dari beberapa sumber, termasuk URL, data post, data sesi, data cookie, dll. Data ini semuanya dapat diakses melalui modul permintaan. Standarnya PRADO menggunakan THttpRequest sebagai modul permintaan. Modul permintaan dapat diakses melalui properti Request dari aplikasi dan kontrol.
-
-Modul respon menerapkan mekanisme untuk mengirimkan output ke pengguna klien. Modul respon dapat dikonfigurasi guna mengontrol bagaimana output di-cache pada sisi klien. Standarnya PRADO menggunakan THttpResponse sebagai modul respon. Modul respon dapat diakses melalui properti Response dari aplikasi dan kontrol.
-
-Modul sesi melapisi fungsionalitas terkait dengan penanganan sesi pengguna. Modul sesi secara otomatis diambil saat aplikasi menggunakan sesi. Standarnya PRADO menggunakan THttpSession sebagai modul sesi, yang merupakan pelapis sederhana dari fungsi sesi yang disediakan oleh PHP. Modul sesi dapat diakses melalui properti Session dari aplikasi dan kontrol.
-
-Modul pengendali kesalahan dipakai untuk menangkap dan memproses semua kondisi kesalahan dalam sebuah aplikasi. PRADO menggunakan TErrorHandler sebagai modul pengendali kesalahan. Ia menangkap semua peringatan PHP, perhatian dan eksepsi, dan ditampilkan dalam bentuk yang tepat bagi pengguna-akhir. Modul pengendali kesalahan dapat diakses melalui properti ErrorHandler dari turunan aplikasi.
-
-PRADO dirilis dengan beberapa modul lebih disamping yang inti. Ini termasuk modul cache (TSqliteCache dan TMemCache), modul manajemen pengguna (TUserManager), modul otentikasi dan otorisasi (TAuthManager), dll.
-
-Ketika TPageService diminta, ia juga mengambil modul tertentu untuk layanan halaman, termasuk manajer asset (TAssetManager), manajer template (TTemplateManager), manajer tema/skin (TThemeManager).
-
-Modul kustom dan modul inti semuanya dapat dikonfigurasi melalui konfigurasi.
-
-Halaman adalah kontrol teratas yang tidak mempunyai leluhur. Presentasi halaman ditampilkan secara langsung ke pengguna-akhir. Pengguna mengakses halaman dengan mengirimkan permintaan layanan halaman.
-
-Setiap halaman harus mempunyai file template. Akhiran nama file harus .page. Nama file (tanpa akhiran) adalah nama halaman. PRADO akan mencoba mencari file kelas halaman di bawah direktori yang berisi file template halaman. File kelas halaman tersebut harus mempunyai nama file yang sama (diakhiri dengan .php) seperti file template. Jika file kelas tidak ditemukan, halaman akan mengambil kelas TPage.
-
-Submisi formulir disebut postback jika submisi dibuat untuk halaman yang berisi formulir. Postback dapat dianggap sebagai kondisi di sisi klien, dimunculkan oleh pengguna. PRADO akan mencoba mengidentifikasi kontrol mana pada sisi server untuk postback kondisi. Jika seseorang menentukan misalnya, TButton, kami menyebutnya pengirim event postback yang akan menterjemahkan event postback ke dalam beberapa event sisi-server tertentu (contoh event OnClick dan OnCommand untuk TButton).
-
-
-Mengerti masa hidup halaman adalah penting untuk menguasai pemrograman PRADO. Masa hidup halaman merujuk ke transisi kondisi dari sebuah halaman saat melayani halaman ini bagi pengguna-akhir. Ini dapat digambarkan dalam grafik kondisi berikut,
-
-
-Layanan adalah turunan dari kelas yang menerapkan antarmuka IService. Setiap jenis layanan memproses tipe permintaan tertentu pengguna. Sebagai contoh, respon layanan halaman terhadap permintaan pengguna untuk halaman PRADO.
-
-Sebuah layanan diidentifikasi secara unik dengan properti ID-nya. Standarnya ketika THttpRequest dipakai sebagai modul permintaan, nama variabel GET digunakan untuk mengidentifikasi layanan mana yang sedang diminta oleh pengguna. Jika nama variabel GET sama dengan beberapa ID layanan, permintaan dianggap untuk layanan itu, dan nilai dari variabel GET dikirimkan sebagai parameter layanan. Untuk layanan halaman, nama variabel GET harus page. Sebagai contoh, URKL berikut meminta halaman Fundamentals.Services,
-
-Para pengembang dapat menerapkan layanan tambahan untuk aplikasinya. Untuk menjadikan layanan agar tersedia, konfigurasi itu dalam konfigurasi aplikasi.
-
-PRADO menerapkan TPageService untuk melayani permintaan halaman pengguna. Halam disimpan di bawah direktori yang ditetapkan oleh properti BasePath dari layanan halaman. Properti standarnya ke direktori pages di bawah path basis aplikasi. Anda boleh mengubah standar ini dengan mengkonfigurasi layanan dalam konfigurasi aplikasi.
-
-Halaman disusun ke dalam direktori di bawah BasePath. Dalam setiap direktori, di sana ada file konfigurasi bernama config.xml, yang berisi konfigurasi yang hanya efektif ketika halaman di bawah direktori atau sub direktori itu diminta. Untuk lebih jelasnya, lihat seksi konfigurasi halaman.
-
-Parameter layanan untuk layanan halaman merujuk pada halaman yang sedang diminta. Parameter seperti Fundamentals.Services merujuk pada halaman Services di bawah direktori <BasePath>/Fundamentals. Jika parameter tersebut tidak ada dalam permintaan, dianggap sebagai halaman standar bernama Home. Menggunakan THttpRequest sebagai modul permintaan (default), URL berikut masing-masing akan meminta halaman Home, About dan Register,
-
-An application is an instance of TApplication or its derived class. It manages modules that provide different functionalities and are loaded when needed. It provides services to end-users. It is the central place to store various parameters used in an application. In a PRADO application, the application instance is the only object that is globally accessible via Prado::getApplication() function call.
-
-Applications are configured via application configurations. They are usually created in entry scripts like the following,
-
-A minimal PRADO application contains two files: an entry file and a page template file. They must be organized as follows,
-
-
-A product PRADO application usually needs more files. It may include an application configuration file named application.xml under the application base path protected. The pages may be organized in directories, some of which may contain page configuration files named config.xml. Fore more details, please see configurations section.
-
-Deploying a PRADO application mainly involves copying directories. For example, to deploy the above minimal application to another server, follow the following steps,
-
-Like page lifecycles, an application also has lifecycles. Application modules can register for the lifecycle events. When the application reaches a particular lifecycle and raises the corresponding event, the registered module methods are invoked automatically. Modules included in the PRADO release, such as TAuthManager, are using this way to accomplish their goals.
-
-The application lifecycles can be depicted as follows,
-
-PRADO は主にプレゼンテーションを操作するためのフレームワークです。(プレゼンテーション操作のみで制限されるわけではありません)
-PRADO アプリケーションがページ要求処理を行う際、以下のオブジェクトダイアグラムで動作します。
-
-A component is an instance of TComponent or its child class. The base class TComponent implements the mechanism of component properties and events.
-
-A component property can be viewed as a public variable describing a specific aspect of the component, such as the background color, the font size, etc. A property is defined by the existence of a getter and/or a setter method in the component class. For example, in TControl, we define its ID property using the following getter and setter methods,
-
-To get or set the ID property, do as follows, just like working with a variable,
-
-A property is read-only if it has a getter method but no setter method. Since PHP method names are case-insensitive, property names are also case-insensitive. A component class inherits all its ancestor classes' properties.
-
-A subproperty is a property of some object-typed property. For example, TWebControl has a Font property which is of TFont type. Then the Name property of Font is referred to as a subproperty (with respect to TWebControl).
-
-To get or set the Name subproperty, use the following method,
-
-Component events are special properties that take method names as their values. Attaching (setting) a method to an event will hook up the method to the places at which the event is raised. Therefore, the behavior of a component can be modified in a way that may not be foreseen during the development of the component.
-
-A component event is defined by the existence of a method whose name starts with the word on. The event name is the method name and is thus case-insensitve. For example, in TButton, we have
-
-A namespace refers to a logical grouping of some class names so that they can be differentiated from other class names even if their names are the same. Since PHP does not support namespace intrinsically, you cannot create instances of two classes who have the same name but with different definitions. To differentiate from user defined classes, all PRADO classes are prefixed with a letter 'T' (meaning 'Type'). Users are advised not to name their classes like this. Instead, they may prefix their class names with any other letter(s).
-
-A namespace in PRADO is considered as a directory containing one or several class files. A class may be specified without ambiguity using such a namespace followed by the class name. Each namespace in PRADO is specified in the following format,
-
-To use a namespace in code, do as follows,
-
-For more details about defining path aliases, see application configuration section.
-
-Component instantiation means creating instances of component classes. There are two types of component instantation: static instantiation and dynamic instantiation. The created components are called static components and dynamic components, respectively.
-
-Dynamic component instantiation means creating component instances in PHP code. It is the same as the commonly referred object creation in PHP. A component can be dynamically created using one of the following two methods in PHP,
-
-Static component instantiation is about creating components via configurations. The actual creation work is done by the PRADO framework. For example, in an application configuration, one can configure a module to be loaded when the application runs. The module is thus a static component created by the framework. Static component instantiation is more commonly used in templates. Every component tag in a template specifies a component that will be automatically created by the framework when the template is loaded. For example, in a page template, the following tag will lead to the creation of a TButton component on the page,
-
-A control is an instance of class TControl or its subclass. A control is a component defined in addition with user interface. The base class TControl defines the parent-child relationship among controls which reflects the containment relationship among user interface elements.
-
-Controls are related to each other via parent-child relationship. Each parent control can have one or several child controls. A parent control is in charge of the state transition of its child controls. The rendering result of the child controls are usually used to compose the parent control's presentation. The parent-child relationship brings together controls into a control tree. A page is at the root of the tree, whose presentation is returned to the end-users.
-
-The parent-child relationship is usually established by the framework via templates. In code, you may explicitly specify a control as a child of another using one of the following methods,
-
-Each control has an ID property that can be uniquely identify itself among its sibling controls. In addition, each control has a UniqueID and a ClientID which can be used to globally identify the control in the tree that the control resides in. UniqueID and ClientID are very similar. The former is used by the framework to determine the location of the corresponding control in the tree, while the latter is mainly used on the client side as HTML tag IDs. In general, you should not rely on the explicit format of UniqueID or ClientID.
-
-Each control has a naming container which is a control creating a unique namespace for differentiating between controls with the same ID. For example, a TRepeater control creates multiple items each having child controls with the same IDs. To differentiate these child controls, each item serves as a naming container. Therefore, a child control may be uniquely identified using its naming container's ID together with its own ID. As you may already have understood, UniqueID and ClientID rely on the naming containers.
-
-A control can serve as a naming container if it implements the INamingContainer interface.
-
-HTTP is a stateless protocol, meaning it does not provide functionality to support continuing interaction between a user and a server. Each request is considered as discrete and independent of each other. A Web application, however, often needs to know what a user has done in previous requests. People thus introduce sessions to help remember such state information.
-
-PRADO borrows the viewstate and controlstate concept from Microsoft ASP.NET to provides additional stateful programming mechanism. A value storing in viewstate or controlstate may be available to the next requests if the new requests are form submissions (called postback) to the same page by the same user. The difference between viewstate and controlstate is that the former can be disabled while the latter cannot.
-
-Viewstate and controlstate are implemented in TControl. They are commonly used to define various properties of controls. To save and retrieve values from viewstate or controlstate, use following methods,
-
-Having seen the simple "Hello World" application, we now build a more complex application called "Hangman Game". In this game, the player is asked to guess a word, a letter at a time. If he guesses a letter right, the letter will be shown in the word. The player can continue to guess as long as the number of his misses is within a prespecified bound. The player wins the game if he finds out the word within the miss bound, or he loses.
-
-To facilitate the building of this game, we show the state transition diagram of the gaming process in the following,
-
-A module is an instance of a class implementing the IModule interface. A module is commonly designed to provide specific functionality that may be plugged into a PRADO application and shared by all components in the application.
-
-PRADO uses configurations to specify whether to load a module, load what kind of modules, and how to initialize the loaded modules. Developers may replace the core modules with their own implementations via application configuration, or they may write new modules to provide additional functionalities. For example, a module may be developed to provide common database logic for one or several pages. For more details, please see the configurations.
-
-There are three core modules that are loaded by default whenever an application runs. They are request module, response module, and error handler module. In addition, session module is loaded when it is used in the application. PRADO provides default implementation for all these modules. Custom modules may be configured or developed to override or supplement these core modules.
-
-Request module represents provides storage and access scheme for user request sent via HTTP. User request data comes from several sources, including URL, post data, session data, cookie data, etc. These data can all be accessed via the request module. By default, PRADO uses THttpRequest as request module. The request module can be accessed via the Request property of application and controls.
-
-Response module implements the mechanism for sending output to client users. Response module may be configured to control how output are cached on the client side. It may also be used to send cookies back to the client side. By default, PRADO uses THttpResponse as response module. The response module can be accessed via the Response property of application and controls.
-
-Session module encapsulates the functionalities related with user session handling. Session module is automatically loaded when an application uses session. By default, PRADO uses THttpSession as session module, which is a simple wrapper of the session functions provided by PHP. The session module can be accessed via the Session property of application and controls.
-
-Error handler module is used to capture and process all error conditions in an application. PRADO uses TErrorHandler as error handler module. It captures all PHP warnings, notices and exceptions, and displays in an appropriate form to end-users. The error handler module can be accessed via the ErrorHandler property of the application instance.
-
-PRADO is released with a few more modules besides the core ones. They include caching modules (TSqliteCache and TMemCache), user management module (TUserManager), authentication and authorization module (TAuthManager), etc.
-
-When TPageService is requested, it also loads modules specific for page service, including asset manager (TAssetManager), template manager (TTemplateManager), theme/skin manager (TThemeManager).
-
-Custom modules and core modules are all configurable via configurations.
-
-Pages are top-most controls that have no parent. The presentation of pages are directly displayed to end-users. Users access pages by sending page service requests.
-
-Each page must have a template file. The file name suffix must be .page. The file name (without suffix) is the page name. PRADO will try to locate a page class file under the directory containing the page template file. Such a page class file must have the same file name (suffixed with .php) as the template file. If the class file is not found, the page will take class TPage.
-
-A form submission is called postback if the submission is made to the page containing the form. Postback can be considered an event happened on the client side, raised by the user. PRADO will try to identify which control on the server side is responsible for a postback event. If one is determined, for example, a TButton, we call it the postback event sender which will translate the postback event into some specific server-side event (e.g. OnClick and OnCommand events for TButton).
-
-
-Understanding the page lifecycles is crucial to grasp PRADO programming. Page lifecycles refer to the state transitions of a page when serving this page to end-users. They can be depicted in the following statechart,
-
-
-A service is an instance of a class implementing the IService interface. Each kind of service processes a specific type of user requests. For example, the page service responds to users' requests for PRADO pages.
-
-A service is uniquely identified by its ID property. By default when THttpRequest is used as the request module, GET variable names are used to identify which service a user is requesting. If a GET variable name is equal to some service ID, the request is considered for that service, and the value of the GET variable is passed as the service parameter. For page service, the name of the GET variable must be page. For example, the following URL requests for the Fundamentals.Services page,
-
-Developers may implement additional services for their applications. To make a service available, configure it in application configurations.
-
-PRADO implements TPageService to process users' page requests. Pages are stored under a directory specified by the BasePath property of the page service. The property defaults to pages directory under the application base path. You may change this default by configuring the service in the application configuration.
-
-Pages may be organized into subdirectories under the BasePath. In each directory, there may be a page configuration file named config.xml, which contains configurations effective only when a page under that directory or a sub-directory is requested. For more details, see the page configuration section.
-
-Service parameter for the page service refers to the page being requested. A parameter like Fundamentals.Services refers to the Services page under the <BasePath>/Fundamentals directory. If such a parameter is absent in a request, a default page named Home is assumed. Using THttpRequest as the request module (default), the following URLs will request for Home, About and Register pages, respectively,
-
-Aplikacja jest instancją TApplication lub klasy po niej dziedziczącej. Zarządza modułami dostarczającymi różnorodne funkcjonalności i ładuje je w razie potrzeby. Dostarcza użytkownikowu końcowemu serwisy.
-Jest centralnym miejscem do przechowywania różnych parametrów używanych w aplikacji. W aplikacji PRADO instancja aplikacji jest jedynym globalnie dostepnym obiektem poprzez wywołania funkcji Prado::getApplication().
-
-Aplikacje są konfigurowane poprzez konfigurację aplikacji. Są zazwyczaj tworzone w skrypcie wejściowym w podobny do następującego sposób,
-
-Minimalna aplikacja PRADO zawiera dwa pliki: plik wejściowy i plik szablonu. Muszą być one zorganizowane w następujący sposób.
-
-
-Produktywna aplikacja PRADO zazwyczaj potrzebuje więcej plików. Może ona zawierać plik konfiguracji aplikacji application.xml w podstawej ścieżce aplikacji protected. Strony mogą być zorganizowane w foldery, część z nich może zawierać pliki konfiguracji strony config.xml. Aby dowiedzieć się wiecej, zajrzyć do sekcji konfiguracji.
-
-Osadzanie aplikacji PRADO zazwyczaj wiąże się z kopiowaniem folderów. Na przykład, aby osadzić powyższą minimalną wersję aplikacji na innym serwerze należy wykonać następujące kroki.
-
-Tak jak cykle życia strony tak aplikacja również posiada cykle życia. Moduły aplikacji mogą rejestrować zdarzenia dla cykli życia.
-Kiedy aplikacja znajduje się w konkretnym cyklu i wywołuje odpowiednie zdarzenie, zarejstrowana metoda modułu jest wywoływana automatycznie.
-Moduły załaczone w oficjalnym wydaniu PRADO, takie jak TAuthManager, używają tego sposobu aby wyknać swoje zadania.
-
-Cykle życia aplikacji mogą zostać przedstawione następująco:
-
-Prado jest przede wszystkim frameworkiem służącym do prezentacji, mimo to nie jest on ograniczony jedynie do ten funkcjonalności.
-Framework skupia się na programowaniu webowym, które w większości czasu ma do czynienia z interakcją z użytkownikiem, bazując na programowaniu sterowanym zdarzeniami (ang. event driven) oraz bazującym na komponentach (ang. component based),
-tak by deweloper był bardziej produktywny. Następujące drzewko klas pokazuje główne klasy dostarczanych przez PRADO.
-
-Kiedy PRADO przetwarza żądanie strony, jego diagram obiektów statycznych wygląda następująco.
-
-Komponent jest instancją klasy lub klasy potomnej TComponent. Klasa bazowa TComponent implementuje mechanizm właściwości oraz zdarzeń kompomentu.
-
-Właściwość kompoenentu może być postrzegana jako publiczna zmienna opsiującą określoną cechę/właściwość komponentu, taką jak kolor tła, rozmiar czcionki, itp. Właściwość jest definiowana poprzez istnienie metody getter i/lub setter w klasie. Na przykład w TControl definiujemy właściwość ID komponentu używając następujących funkcji typu getter i setter,
-
-Aby pobrać lub ustawić właściwość ID, postępuj jak poniżej (tak jakbyś miał do czynienia ze zmienną):
-
-Właściwość jest "tylko do odczytu" jeśli posiada metodę getter a nie posiada metody setter. Odkąd nazwy metod w PHP nie są zależne od wielkiej bądź małej litery, właściwości również są niewrażliwe na wielkość liter. Klasa kompomentu dziedziny wszystkie właściwości rodzica.
-
-Subwłaściwość jest właściwością właściwości typu obiektowego. Dla przykładu TWebControl posiada właściwość Font, która jest typu TFont. Wtedy właściwość Name właściwości Font jest subwłaściwością w stosunku do TWebControl.
-
-Aby pobrać lub ustawić subwłaściwość Name należy użyć następującej metody:
-
-Zdarzenia komponentu są specjalnymi właściwościami, które pobierają nazwy metod jako swoje wartości. Przypisując (ustawiając) metodę do zdarzenia (will hook up the method ) do miejsca gdzie zdarzenie jest wywoływane. Dzięki temu zachowanie komponentu może zostać zmodyfikowane w sposób, który nie był przewidziany podczas fazy dewelopowania komponentu.
-
-Zdarzenie komponentu jest definiowane poprzez istnienie metody, której nazwa zaczyna się przedrostkiem on. Nazwa zdarzenia jest nazwą metody i z tego powodu jest niewrażliwa na wielkość liter. Na przykład w komponencie TButton mamy:
-
-Przestrzeń nazw odnosi się do logicznego pogrupowania nazwy klas w taki sposób, że moga być one odróżniane od innych klas, których nazwy są identyczne. Ponieważ PHP nie wspiera przestrzeni nazw sam w sobie, nie można stworzyć instancji dwóch klas, które mają tą samoą nazwę ale różne definicje. Aby odróżniać się od klas użytkowników wszystkie klasy PRADO posiadają prefix 'T' (oznaczający 'Type' - z angielskiego: typ). Zachęcamy do nazywania własnych klas w ten sposób. W odróznieniu można dodawać prefiksy klas zaczynające się dowolną inną literą (lub grupą liter).
-
-Przestrzeń nazw w PRADO jest postrzegana jako folder zawierający jednen lub więcej plików klas. Poprzez poprzedzania nazwy klasy przestrzenią nazw klasa może zostać określona jednoznacznie. Każda przestrzeń nazw jest w PRADO określona w następujący sposób:
-
-By używać przestrzeni nazw w kodzie, napisz:
-
-Aby zobaczyć więcej informacji o definiowaniu aliasów zobacz sekcję konfigurowanie aplikacji.
-
-Tworzenie instancji komponentu oznacza tworzenie instancji klasy komponentu. Rozróżniamy dwa typy instancji komponentu: statyczną i dynamiczną. Utworzone komponenty nazywane są odpowiednio komponentami statycznymi i dynamicznymi.
-
-Dynamiczne tworzenie instancji komponentów oznacza tworzenie instancji komponentu w kodzie PHP. Wygląda to identycznie jak zwyczajne tworznie komponentów w PHP. Komponent może zostać dynamicznie utworzony w jeden z poniższych sposobów w PHP:
-
-Statyczne tworzenie instancji komponentów odnosi się do tworznenia komponentów poprzez konfigurację. Proces tworzenia odbywa się po stronie frameworku. Na przykład w konfiguracji aplikacji można skonfigurować moduł, który zostanie załadowany podczas uruchamiania aplikacji. Zatem moduł jest statycznym komponentem stworzonym przez framework. Statyczne tworzenie instancji jest często wspólnie używane w szablonach. Każdy tag komponentu w szablonie określa komponent, który będzie automatycznie stworzony przez framework, kiedy szablon będzie ładowany. Na przykład w szablonie strony następujący tag doprowadzi do stworzenia komponentu TButton na stronie:
-
-Kontrolka jest instancją klasy TControl lub jej dziecka. Kontrolka jest komponentem definiowanym z dodatkiem interfejsu użytkownika. Klasa bazowa TControl definiuje relację rodzic-dziecko among controls which reflects the containment relationship among user interface elements.
-
-Kontrolki są powiązane z sobą za pomocą relacji rodzic-dziecko. Każda kontrolka rodzica może posiadać jedną lub więcej kontrolek dzieci. Kontrolka rodzica jest in charge of the state transition of its child controls. Wynik renderowanie kontrolki dziecka jest zazwyczaj używany do stworzenia warstwy prezentacji kontrolki rodzica. Relacja rodzic-dziecko brings together controls into a control tree. Strona jest korzeniem drzewka, której warstwa prezentacji jest zwracana dla użytkownika końcowego.
-
-Relacja rodzic-dziecko jest zazwyczaj ustalana przez framework poprzez szablony. W kodzie można bezpośrednio określić kontrolkę jako dziecko innej kontrolki stosując jedną z następujących metod:
-
-Każda kontrolka ma właściwość ID, która jednoznacznie identyfikuje ją samą spośród jej rodzeństwa. W dodatku każda kontrolka posiada właściwość UniqueID oraz ClientID, która może zostać użyta do identyfikacji "globalnej" kontrolki w drzewku gdzie znajduje się ta kontrolka. Właściwości UniqueID oraz ClientID są bardzo podobne. Pierwsza jest używana przez framework do określenia położenia odpowiedniej kontrolki w drzewku, druga jest głównie używana po stronie klienta jako ID w tagach HTML. Ogólnie rzecz ujmując nie powinno się polegać na tak sprecyzowanym formacie UniqueID lub ClientID.
-
-Każda kontrolka posiada kontener nazw, który jest kontrolką tworzącą unikalną przestrzeń nazw dla rozróżnienie pomiędzy kontrolkami o tych samych ID. Na przykład kontrolka TRepeater tworzy wiele pozycji, które posiadają kontrolki-dzieci o tych samych ID. Aby rozróżnić te kontrolki-dzieci, każda pozycja służy jako kontener nazw. Dzięki temu, kontrolka-dziecko może zostać jednoznacznie zidentyfikowana używając ID swojego kontenera nazw razem z swoim własnym ID. Powinieneś teraz zrozumieć, że właściwości UniqueID i ClientID bazują (wynikają?) na kontenerze nazw.
-
-Kontrolka może służyć jako kontener naz jeśli implementuje interfejs INamingContainer.
-
-HTTP jest protokołem bezstanowym, co oznacza, że nie dostarcza on funkjonalności wspierającej kontynuowanie interakcji pomiędzy użytkownikiem a serwerem. Każde żądanie (ang. request) jest rozpatrywane jako pojedyńcze i niezależne w stosunku do innego żądania. Jednakże, aplikacja webowa często potrzebuje wiedzieć co użytkownik zrobił w poprzednich żądaniach. Dlatego wprowadzono sesje by pomóc zapamiętać te informacje o stanie.
-
-PRADO zapożycza koncept stanu widoku oraz stanu kontrolki z ASP.NET Microsoftu by dostarczać dodatkowego stanowego mechanizmu programowania (ang. stateful programming mechanism). Wartość zachowana w stanie widoku lub stanie kontrolki może być dostępna w następnym żądaniu jeśli nowe żądanie pochodzi od wysłania formularza (ang. form submissions) (nazywanej postback'iem) do tej samej strony przez tego samego użytkownika. Różnica pomiędzy stanem widoku a stanem kontrolki wynika z tego iż pierwsza może zostać wyłączona a druga nie.
-
-Stan widoku i stan kontrolki są zaimplementowane w TControl. Są one zazwyczaj używane do zdefiniowania różnych właściwościu kontrolki. By zapisać i przywrócić wartości ze stanu widoku lub stanu kontrolki, należy użyć następujących sposobów:
-
-Zobaczywszy prostą aplikację "Witaj Świecie" stworzymy teraz bardziej skomplikowaną aplikację "Wisielca".
-W tej grze gracz musi odgadnąć słowo podając litery w zadanym czasie. Jeśli odgadnie prawidłowo litera pojawi się w słowie. Gracz może tak długo kontynuować zgadywanie dopóki liczba pomyłek znajduje się w zdefiniwanym na początku zakresie.
-Gracz wygrywa grę jeśli znajdzie słowo zanim przekroczy dozwoloną liczbę pomyłek, w przeciwnym przypadku przegrywa.
-
-Aby ułatwić stowrzenie tej gry, pokażemy diagram zmiany stanów gry następująco
-
-Moduł jest instancją klasy implementującej interfejs IModule. Moduł jest zazwyczaj zaprojektowany by dostarczać określonej funkcjonalności, która może być podłączona do aplikacji PRADO i dzielona wśród wszystkich komponentów aplikacji.
-
-PRADO używa konfiguracji aby określić kiedy załadować moduł, jaki rodzaj modułu i jak zainicjalizować załadowane moduły. Deweloper może zastąpić zródłowe (ang. core) moduły własnymi implementacjami poprzez konfigurację aplikacji lub może napisać nowe moduły by dostarczać dodatkowe funkcjonalności. Na przykład można stworzyć moduł, który będzie dostarczał wspólną logikę baz danych dla jednej lub więcej stron. Aby dowiedzieć się więcej zobacz sekcję konfiguracja.
-
-Domyślnie ładowane są 3 moduły źródłowe (ang. core modules) podczas starty aplikacji. Są to moduł żądania (ang. request module), moduł odpowiedzi (ang. responce module) oraz moduł zarządzania błędami (ang. error handler module). Dodatkowo moduł sesji (ang. session module) jest ładowany kiedy jejst on używany w aplikacji. PRADO dostarcza domyślną implementację dla wszystkich tych modułów. Dodatkowe moduły (ang. custom modules) mogą być konfigurowane lub stworzone by nadpisać lub uzupełnić te trzy moduły źródłowe.
-
-Moduł żądań reprezentuje i dostarcza schemat dostępu i przechowywania żądań użytkownika wysyłanych poprzez HTTP. Dane żądania użytkownika przychodzą z kilku źródeł wliczając adresy URL, dane z żądania POST, dane sesyjne, dane z ciasteczek, itd. Te dane są dostępne poprzez moduł żądania. Domyślnie PRADO używa THttpRequest jako moduł żądania. Moduł żądania jest dostępne poprzez właściwość Request aplikacjji i kontrolek.
-
-Moduł odpowiedzi implementuje mechanizm do wysywałania wyjścia do klienta użytkwonika. Moduł odpowiedzi może zostać skonfigurowany by kontrolować jak wyjście jest keszowane po stronie klienta. Może on być również uzywany by wysyłać cookie z powrotem na stronę klienta. Domyślnie PRADO używa THttpResponse jako moduły odpowiedzi. Moduł odpowiedzi jest dostępny poprzez właściwość Response aplikacji i kontrolek.
-
-Moduł sesji enkapsuluje funkcjonalność związaną z zarządzaniem sesji użytkowika. Moduł sesji jest automatycznie ładowany jeśli aplikacja używa sesji. Domyślnie PRADO używa THttpSession jako moduł sesji, który jest po prostu nadkładką (ang. wrapper) dla funkcji sesyjnych dostarczanych przez PHP. Moduł sesji jest dostępny poprzez właściwość Session aplikacji i kontrolek.
-
-Moduł zarządzzania błędami jest użuwany by przechwycić i obsłużyć wszystkie przypadki błędów w aplikacji. PRADO używa TErrorHandler jako moduł zarządzania błędami. Przechwytuje on wszystkie ostrzeżenia PHP (ang. warnings), wiadomości (ang. notices) oraz wyjątki (ang. exceptions) i wyświetla w odpowiedniej formie użytkownikowi końcowemu. Moduł zarządzania błędami jest dostępny poprzez właściwość ErrorHandler instancji aplikacji.
-
-PRADO zostało wydane z większą ilością modułów niż wymienione moduły źródłowe. PRADO zawiera moduły keszujące (TSqliteCache oraz TMemCache), moduły zarządzające użytkownikami (TUserManager), moduły autentykacji i autoryzacji (TAuthManager), itd.
-
-Kiedy wystąpi żądanie TPageService ładowane są także określone moduły dla serwisu stron, włączając menedżer elementów aktywnych (ang. assets manager) (TAssetManager), menedżer szablonów (TTemplateManager), menedżer tematów/skórek (ang. theme/skin manager) (TThemeManager).
-
-Dodatkowe moduły oraz moduły źródłowe są konfigurowalne poprzez konfigurację.
-
-Strony są najwyżej umiejscowionymi w hierarchi kontrolkamki, które nie posiadają rodzica.
-Prezentacja strony jest bezpośrednio wyświetlana użytkownikowi końcowemu. Użytkownicy posiadają dostęp do strony poprzez wysłanie żądanie do serwisu strony (ang. sending page service requests).
-
-Każda strona musi posiadać plik szablonu. Musi posiadać on rozszerzenie .page. Nazwa pliku (bez rozszerzenia) jest nazwą strony. PRADO będzie próbować znaleźć plik klasy strony w katalogu zawierającym szablon strony. Taki plik klasy strony musi posiadać tą samą nazwę (z rozszerzeniem .php) jak plik szablonu. Jeśli klasa nie zostanie znaleziona, strona skorzysta z klasy TPage.
-
-Wysłanie formularza jest nazywane postback jeśli wysłanie następuje do strony zawierającej formularz. Postback może być postrzegany jako zdarzenie po stronie klienta, wywoływane przez użytkownika. PRADO będzie próbowało zidentyfikować, która kontrolka po stronie serwera jest odpowiedzialna za zdarzenie postblack. Jeśli znajdzie taką, np. przykład TButton, nazywać ją będziemy senderem zdarzenia postback, który przetłumaczy zdarzenie postback na pewne specyficzne zdarzenia po stronie serwera (np. zdarzenia OnClick i OnCommand dla TButton).
-
-
-Zrozumienie cyklu życia strony jest kluczowe by zrozumieć istotę programowania w PRADO.
-Cykl życia strony odwołuje się do stanów przejściowych strony, gdy jest ona dostarczana użytkownikowi końcowemu. Może on (cykl) być przedstawiony za pomocą następującej tablicy stanów:
-
-
-Serwis jest instancją klasy implementującej interfejs IService. Każdy rodzaj serwisu przetwarza specyficzny typ żądania użytkownika. Na przykład serwis strony (ang. page service) odpowiada na żądania użytkownika dla stron PRADO.
-
-Serwis jest jednoznacznie identyfikowany poprzez swoją właściwość ID. Domyślnie kiedy THttpRequest jest używany jako moduł żądania (ang. request module), nazwy zmiennych GET są używane by zidentyfikować serwis żadany przez użytkownika. Jeśli nazwa zmiennej GET zgadza się z jakimś ID serwisu, żądanie jest przetwarzane przez ten serwis oraz wartość parametru GET jest przekazywana jako parametr serwisu. Dla serwisu strony nazwą zmiennej GET musi być page. Na przykład następujący adres URL żadą strony Fundamentals.Services,
-
-Deweloper może zaimplementować dodatkowe serwisy dla swojej aplikacji. Aby uczynić serwis dostępnym należy go skonfigurować w konfiguracji aplikacji.
-
-PRADO implementuje TPageService by przetwarzać żądania stron użytkonika. Strony są przechowywane w katalogu określonej przez właściwość BasePath serwisu strony. Właściwość wskazuje domyślnie na katalog pages w ścieżce aplikacji. Możesz zmienić tą wartość domyślną poprzez skonfigurowanie serwisu w konfiguracji aplikacji.
-
-Strony mogą być zorganizowane w podkatalogi w BasePath. W każdym katalogu może znajdować się plik konfiguracji strony o nazwie config.xml, który zawiera konfigurację aktywną tylko wtedy gdy strona spod tego katalogu lub podkatalogu jest żądana. Aby dowiedzieć się wiecej zobacz sekcję konfiguracja strony.
-
-Parametr dla serwisu stron wskazuje na żądaną stronę. Parametr taki jak Fundamentals.Services wskazuje na stronę Services w katalogu <BasePath>/Fundamentals. Jeśli taki parametr nie jest obecny w żądaniu domyślnie przyjmowana jest jego wartość jako Home. Używając THttpRequest jako moduł żądania (domyślnie), następujący adres URL zażada stron Home, About i Register odpowiednio dla:
-
-Complete source code of this demo can be found in the PRADO release. You can also try the online demo.
+Complete source code of this demo can be found in the PRADO release. You can also try the online demo.
-Das Quicktstart tutorial soll Sie bei der Erstellung einer PRADO 3.x-basierten Webanwendung unterstützen.
-
-Wenn Sie bereits PRADO 3.x nutzen und herausfinden möchten welche Verbesserungen und neuen Funktionen mit welcher Prado-Version unterstützt werden, besuchen sie die Neue Features-Seite.
-
-Nutzen Sie auch die folgenden Ressourcen, wenn dieses Tutorial ihre Fragen nicht hinreichend beantwortet:
-
-PRADO es una capa de programación (framework) basada componentes y programación dirigida por eventos, para desarrollos de aplicaciones Web en PHP 5. Las siglas PRADO significan en español Desarrollo Rapido de Aplicaciones con Programación Orientada a Objetos en PHP (PHP Rapid Application Development Object-oriented).
-
-El principal objetivo de PRADO es utilizar al máximo la reutilización en la programación Web. Por reusabilidad, queremos decir no solamente reutilizar el código propio, si no el de otros programadores de una manera fácil. Lo último dicho es más importante, ya que evita el esfuerzo de reinventar nuevamente la rueda y además posibilita disminuir notablemente los tiempos de desarrollos. La introducción al concepto de componentes tiene este propósito.
-
-Para alcanzar el propósito mencionado, PRADO estipula un protocolo para escribir y usar componentes para construir una aplicación Web. Un componente es una pieza de programa que es autocontenido (self-contained) y puede ser reutilizado con una mínima personalización del mismo. Nuevos componentes pueden ser creados por una simple composición de componentes existentes.
-
-Para facilitar la interacción con componentes, PRADO implementa el paradigma de la programación dirigida por eventos (event-driven) que permite la delegación de comportamientos extensibles a los componentes.
-Las actividades de los usuarios finales, tales como hacer clic en un botón de un formulario, son capturados como eventos en el lado del servidor (server events).
-Metodos o funciones deben ser enlazadas a dichos eventos de tal manera que cuando los eventos sucedan, estos son invocados automáticamente para responder a dicho evento. Comparado con la programación Web tradicional en la cual los desarrolladores tienen que tratar directamente (raw) con las variables de arreglo POST y GET, la programación dirigida por eventos ayuda a los desarrolladores enfocarse mejor en las necesidades lógicas y reducir significativamente el código de bajo nivel repetitivo (low-level repetitive coding).
-
-En resumen, desarrollar aplicaciones Web con PRADO principalmente involucra instantáneamente tipos de componentes predesarrollados, configurarlos mediante sus propiedades, responder a sus eventos escribiendo funciones manipuladoras de los mismos , y agrupándolos (composing them) dentro de paginas para la aplicación. Es muy similar al Kit de herramientas RAD de Borland Delphi y Microsoft Visual Basic, que son utilizadas para desarrollar aplicaciones (Interfaces Graficas de Usuarios, GUI) de escritorio.
-
-PRADO es comúnmente citado como una plataforma de programación (framework) única. En realidad es tan único que puede convertir una tediosa y aburrida tarea de programación en PHP en una tarea divertida (fun task). La siguiente lista es un pequeño resumen de las características principales de PRADO,
-
-PRADO es mejor adecuado para la creación de aplicaciones Web que tienen alta interactividdad con usuarios (user-interactive). Se puede utilizar para desarrollar sistemas tan simple como un blog o para aquellos sistema tan complejo como un sistema de gestión de contenidos (CMS) o una completa solución de comercio electrónico. PRADO promueve la programación orientada a objetos a través de su metodología basada en componente , se ajusta muy bien para el trabajo en equipo y el desarrollo empresarial.
-
-PRADO viene con un conjunto completo de técnicas de caching que ayudan a acelerar las aplicaciones Web PRADO y acomodar el tráfico de alta exigencia. Su arquitectura modular permite a los desarrolladores el uso o icorporar (plug-in) diferentes módulos de caché de memoria para diferentes necesidades. La salida de caché permite elegir selectivamente el caché de las paginas webs generadas.
-
-PRADO es a menudo citado como un framework único. Su singularidad radica principalmente en el paradigma de la programacion basada en componentes (component-based) y dirigida a eventos (event-driven) que pretende promover. Aunque este paradigma de programación no es nuevo en programación de aplicaciones de escritorio y no en una nueva web de algunos lenguajes de programación, PRADO es quizás el primer framework PHP que lo lleva a cabo.
-
-La mayoría de frameworks de PHP principalmente se centra en separar la presentación y la lógica y promueve el patrón de diseño MVC (modelo-vista-controlador) . PRADO logra el mismo objetivo, naturalmente, al exigir que la lógica se almacena en las clases y la presentación en las plantillas. PRADO hace mucho más en otros aspectos distintos de MVC. Se llena de mucho espacio en blanco en la programación web en PHP, con su paradigma de programacion basada en componentes, la riqueza de su conjunto de controles Web, sus potente soporte de bases de datos, su flexible manejo de errores y registro de mensajes, y muchos otros.
-
-Sí. PRADO inicialmente fue liberado en agosto de 2004. Muchas series de ensayos se han escrito y realizado con frecuencia para asegurar su calidad. Se ha utilizado por miles de desarrolladores y muchas aplicaciones Web se han desarrollado sobre la base de la misma. Bugs y peticiones se gestionan a través del sistema TRAC y tenemos una gran comunidad de usuarios y el equipo de desarrollo para asegurar que todas las preguntas se respondan en forma oportuna.
-
-La propia inspiración original de PRADO vino de Apache Tapestry. Durante el diseño y la ejecución, me tome prestadas muchas ideas de Borland Delphi y Microsoft ASP.NET. La primera versión de PRADO salió en junio de 2004 y fue escrita en PHP 4. Impulsado por el concurso de codificación de Zend PHP 5 , re-escrbí PRADO en PHP 5, que resultó ser una sabia decisión, gracias al nuevo modelo de objetos proporcionados por PHP 5. PRADO ganó el gran premio en el concurso Zend, ganando el más alto de votos del público y los jueces del panel.
-
-En agosto de 2004, PRADO comenzó a ser alojado en SourceForge como un proyecto de código abierto. Poco después, el sitio del proyecto xisc.com se anunció para el orden público. Con el fantástico apoyo del equipo de desarrolladores PRADO y usuarios PRADO, PRADO evolucionado a la versión 2,0 a mediados de 2005. En esta versión, Wei Zhuo contribuyó en PRADO con el excelente I18N y L10N apoyo.
-
-En mayo de 2005, se decidió re-escribir por completo el framework PRADO para resolver algunas cuestiones fundamentales que se encuentran en la versión 2.0 y para ponerse al día con algunas geniales características disponibles en Microsoft ASP.NET 2.0. Después de casi un año de arduo trabajo con más de 50.000 líneas de nuevo código, la versión 3.0 fue finalmente puesta a disposición en abril de 2006.
-
-A partir de la versión 3.0, importantes esfuerzos se asignan a asegurar la calidad y la estabilidad de PRADO. Si decimos PRADO v2.x y v1.x son prueba de concepto de trabajo, podemos decir PRADO 3.x ha crecido a un proyecto que es adecuado para un negocio serio el desarrollo de aplicaciones.
-
-Su usted esta viendo esta pagina desde su explorador Web, usted ha ya realizado la instalación.
-
-Los requerimientos minimos por PRADO, son que el servidor Web soporte PHP version 5. PRADO ha sido probado con el servidor Web Apache en las plataformas Windows y Linux. Existen muchas probabilidades de que tambien pueda correr en otras plataformas con otros servidores Webs siempre y cuando estos soporten PHP 5.
-
-La instalacion de PRADO, consiste principalmente en descargarlo y descomprimirlo.
-
-Su instalacion de PRADO esta lista y usted puede comenzar a probarlo con las aplicaciones de demostraciones incluidas en la pulicacion de prado a travez de la URL http://web-server-address/prado/demos/. Aqui asumimos que PRADO esta descomprimido en la subcarpeta prado que se ecnuentra debajo de DocumentRoot del servidor Web.
-
-Si encuentra algun problema con las aplicaciones demostrativa de PRADO, utilice por favor el script de chequeo de requerimientos que viene con PRADO , accesible desde http://web-server-address/prado/requirements/index.php, para comprobar primeramente si la configuracion de su server cumple con las condiciones requeridas por PRADO.
- Este tutorial rápido se presta a ayudarle rápidamente a empezar a construir tu propia web aplicaciones basadas en PRADO versión 3.x.
- Si ya es usuario PRADO 3.x y me gustaría saber qué mejoras están disponibles para cada nueva versión, por favor, consulte las nuevas características . De lo contrario, las siguientes secciones son útiles para novatos.
- Conceptos y fundamentos Más ejemplos en Controles Estándard,
- Controles de validación and
- Controles de Datos.
-
-Usted podrá hacer referencia a los siguientes recursos si usted encuentra que este tutorial no cumple con todas sus necesidades.
-
-PRADO est un framework de programmation évènementielle basé sur des composants pour développer des applications Web en PHP5. PRADO signifie PHP Rapid Application Development Object-oriented.
-
-Le but principal de PRADO est la réutilisation maximale de code dans la programmation Web. Par réutilisation, cela ne se limite pas à son propre code mais aussi celui d'autres développeurs, de manière la plus aisée possible. Cela est très important car cela évite de réinventer la roue et peut donc réduire de façon significative le temps de développement. L'introduction du concept de composant provient de cela.
-
-Afin de parvenir au but ci-dessus, PRADO stipule un protocole d'écriture et d'utilisation des composants afin de construire des applications Web. Un composant est une brique logicielle qui peut être réutilisée avec quelques modifications. De nouveaux composants peuvent ainsi être construits en utilisant des composants existants.
-
-Afin de faciliter l'intéraction avec les composants, PRADO implémente une programmation évènementielle qui permet la délégation des comportements aux composants. Les actions des utilisateurs comme le click sur un bouton de type submit sont capturées comme des évènements serveurs. Des méthodes ou fonctions peuvent être attachées à ces évènements et lorsque l'évènement se produit, elles sont automatiquement invoquées afin de répondre à ces même évènements. Comparé à la traditionnelle programmation Web où les développeurs doivent utiliser les variables POST ou GET, la programmation évènementielle aide les développeurs à se consacrer à la logique et réduit de façon significative le code répétitif.
-
-Développer une application Web avec PRADO se résume à instancier des composants existants, les configurer en définissant leurs propriétés, leur affecter des fonctions répondants à ces mêmes évènements, et ainsi composer les pages de l'application. Cela est très similaire aux développants à l'aide de RAD, comme Borland Delphi et Microsoft Visual Basic, qui sont utilisés pour développer des applications GUI.
-
-PRADO est le plus souvent cité comme un framework unique. En fait, il est tellement unique qu'il peut changer votre programmation PHP en une tâche amusante. La liste suivante est un rapide résumé des principales fonctionnalités de PRADO,
-
-PRADO est le plus adapté pour des applications Web très interactives. Il peut être utilisé pour développer des systèmes simples comme un blog, ou complexes comme un système de gestion de contenu (CMS), ou une solution complète de e-commerce. Puisque PRADO est basé sur une programmation orientée objet à travers sa méthodologie de composants, il convient particulièrement bien pour le travail en équipe et le développement d'entreprise.
-
-PRADO intègre un système de cache complet qui peut aider les applications à tenir des charges de traffic élevées. Son architecture modulaire permet aux développeurs d'utiliser des modules de cache différents pour chaque besoin. Le cache peut s'effectuer sur toute ou partie d'une page Web.
-
-PRADO est souvent cité comme un framework unique. Sa particularité est principalement liée à la gestion des composants et à la programmation évènementielle qu'il essaie de promouvoir. Bien que ce paradigme ne soit pas nouveau dans la programmation d'application GUI, PRADO est peut-être le premier framework PHP à l'intégrer.
-
-La plupart des frameworks PHP se focalise principalement sur la séparation des couches de présentation et de la logique en utilisant le design pattern MVC (Model-Vue-Contrôleur). PRADO atteint le même but en imposant que la logique se situe dans des classes et la présentation dans des templates. PRADO fait beaucoup plus sur d'autres aspects que le MVC. Il comble des manque dans la programmation PHP avec son modèle de composants Web riches, son support robuste des bases de données, sa gestion d'erreur flexible et beaucoup d'autre...
-
-Oui. Le projet PRADO a débuté en août 2004. Beaucoup de tests unitaires ont été écrits et fréquemment éxecutés afin d'assurer sa qualité. Il a été utilisé par des milliers de développeurs et beaucoup d'applications sont basés sur celui-ci. Les bugs et les demandes de fonctionnalités sont gérées à travers le système TRAC, nous avons une grande communauté d'utilisateurs et une équipe de développement afin d'assurer que toutes les questions sont répondues en un temps record.
-
-L'inspiration originale de PRADO vient de Apache Tapestry. Pendant le design et l'implémentation, j'ai emprunté beaucoup d'idées de Borland Delphi et Microsoft ASP.NET. La première version de PRADO a vue le jour en juin 2004 et était écrite en PHP4. Conduit par le concours de codage de Zend, j'ai réécrit PRADO en PHP5, qui est un changement majeur grâce au nouveau modèle objet fourni par PHP5. PRADO a remporté le grand prix du concours grâce aux votes du public ainsi que du jury.
-
-En août 2004, PRADO a commencé à être hébergé sur SourceForge en projet Open Source. Peu après, le site du projet xisc.com a été annoncé au public. Grâce au fantastique support de l'équipe de développement et des utilisateurs de PRADO, PRADO a évolué en version 2.0 mi 2005. Dans cette version, Wei Zhuo a contribué à PRADO avec le support I18N et L10N.
-
-En mai 2005, nous avons décidé de réécrire complètement le framework PRADO afin de résoudre quelques problèmes trouvés dans la version 2.0 et ajouter des fonctionnalités disponibles dans Microsoft ASP.NET 2.0. Après près d'un an de dur labeur et 50.000 lignes de nouveau code, la version 3.0 était finalement disponible en avril 2006.
-
-Au démarrage de la version 3.0, des efforts significatifs ont été fournis afin d'assurer la qualité et la stabilité de PRADO. Si PRADO v2.x et v1.x sont la preuve du concept, nous pouvons affirmer que PRADO v3.x est un projet qui est désormais adapté pour le développement d'applications métiers.
- Le script optionnel prado-cli.php du répertoire framework est un outil en ligne de commande destiné à éxecuter certaines tâches dans PRADO.
-Le script prado-cli.php peut être utilisé pour créer le squelette de projet PRADO, des fichiers tests et accéder à un shell interactif PHP.
-
-Afin d'utiliser l'outil en ligne de commande, vous aurez à utiliser une console. De plus, PHP doit être capable d'éxecuter des scripts en ligne de commande.
-
-Si vous tapez php chemin/vers/framework/prado-cli.php, vous devez voir les informations suivantes. Alternativement, si vous n'êtes pas sous Windows, vous pouvez essayer de transformer le fichier prado-cli.php en un éxecutable Les <parameter> sont les paramètres requis et [optional]
-désignent les paramètres optionnels. Afin de créer un squelettre de projet PRADO, suivez les instructions suivantes :
-Le shell interactif vous permet d'évaluer des scripts PHP directement en ligne de commande.
-Le script prado-cli.php peut être utilisé pour démarrer le shell et charger un projet PRADO existant.
-Par exemple, chargons le projet de démo blog. En supposant que votre console se situe actuellement dans le répertoire prado de la distribution, tapez :
-
-
-Dans cette partie, nous allons vous guider afin de créer votre première application PRADO, la fameuse application "Hello World".
-
-"Hello World" est peut-être l'application PRADO la plus simple et interactive que vous pouvez créer. Cela affiche une page avec un bouton où il est affiché Click Me. Lorsque l'utilisateur clicke sur la bouton, il est affiché Hello World.
-
-Il y a plusieurs approches afin d'arriver au but ci-dessus. On peut envoyer la page au serveur, vérifier le contenu de la variable POST, et générer une nouvelle page avec le texte du bouton modifié. On peut également simplement utiliser du javascript afin de mettre à jour le libellé du bouton après l'évènement onclick.
-
-PRADO privilégie une programmation évènementielle basée sur des composants. Le bouton est représenté par un objet TButton. Celui-ci comprend le libellé du bouton en tant que propriété Text et associe l'évènement "click" avec un évènement serveur OnClick. Afin de répondre à l'action de l'utilisateur sur le click du bouton, il suffit simplement d'attacher une fonction à l'évènement OnClick du bouton. Dans cette fonction, la propriété Text est modifiée en "Hello World". Le diagramme suivant image la séquence ci-dessus :
-
-
-Notre application PRADO sera composée de trois fichiers, index.php, Home.page et Home.php, qui sont organisés de la façon suivante :
-
-
-où chaque répertoire est expliqué comme suit. Notez que la structure des répertoire peut être personnalisée. Par example, le dossier protected peut se trouver hors du répertoire Web public. Vous saurez comment faire à la suite de ce tutorial.
-
-Les trois fichiers dont nous avons besoin sont expliqués comme suit.
-
-L'application is maintenant prête et est accesible à l'adresse
-The application is now ready and can be accessed via: http://Web-server-address/helloworld/index.php, en supposant que helloworld soit directement sous la racine de votre serveur. Essayez de modifier le TButton de la page Home.page en TLinkButton et voyez ce qui se produit.
-
-Le code source complet de cette démonstration peut être téléchargé dans la release de PRADO. Vous pouvez également essayer la démonstration en ligne.
-
-Si vous voyez cette page à partir de votre serveur Web, c'est que l'installation s'est déjà bien déroulée.
-
-La configuration minimum requise par PRADO est que le serveur Web supporte PHP 5. PRADO a été testé avec un serveur Apache sur une platforme Windows et Linux. Il est fort possible qu'il fonctionne avec d'autres platformes avec d'autres types de serveurs Web tant que PHP 5 est supporté.
-
-L'installation de PRADO se résume principalement au téléchargement et à la décompression des sources.
-
-Votre installation de PRADO est terminée et vous pouvez commencer à utiliser les applications de démonstration incluses dans PRADO avec l'URL http://web-server-address/prado/demos/. Ici nous supposons que PRADO est décompressé dans le sous-répertoire prado sous le répertoire racine du serveur Web.
-
-Si vous rencontrez un problème avec les applications de démonstration, merci d'utiliser le script de vérification des pré-requis de PRADO, accessible à l'adresse http://web-server-address/prado/requirements/index.php, afin de vérifier que votre configuration réponds bien aux exigences de PRADO.
-
-Ce tutorial est destiné à vous aider rapidement à créer votre propre application Web basée sur PRADO version 3.X.
-
-Vous pouvez vous réferrer aux ressouces suivantes si vous trouvez que ce tutorial ne correspond pas à vos besoins.
-
-Cette page résume les principale fonctionnalités introduites dans chaque version de PRADO.
-
-PRADO v3.0 n'est pas rétro-compatible avec les versions précédents de PRADO.
-
-La bonne nouvelle est que les propriétés et que les évènements de la plupart des contrôles restent identiques ainsi que la syntaxe des templates qui reste largement inchangée. Par conséquent, les connaissances des développeurs des anciennes versions restent applicables dans la v3.0.
-
-Nous résumons ci-dessous les changements les plus significatifs de la v3.0 afin d'aider les développeurs à migrer leurs applications v2.x et v1.x plus facilement, si besoin est.
-
-La version 3.0 a complètement changé de besoin de fichiers de spécifications des composants. Il se fonde davantage sur des conventions pour définir les propriétés et les événements des composants . En particulié, une propriété est définit par la présence d'une méthode getter et/ou setter, tandis qu'un évènement est définit par l'existance d'une méthode on... .Les noms des propriétés et évènements dans la v3.0 sont tous les deux case-insensitive. Par conséquence, les développeurs sont désormais obligés de faire attention aux conversions de type lorsque la propriété d'un composant est définie. Par example, le code suivant est utilisé afin de définir la propriété Enabled propriétaire d'un TControl, qui est un type booléen,
-
-où la fonction TPropertyValue::ensureBoolean() est utilisée afin de s'assurer que la variable est bien un booléen. Ceci car lorsque la propriété est configurée dans un template, une chaîne de caractère est passée au setter. Dans les versions précédentes, PRADO connaissait le type de chaque propriété des composants grâce aux fichiers de spécifications et se chargeait de la conversion de type pour vous.
-
-Le contrôleur de l'application implémente désormais une architecture modulaire. Les modules peuvent être ajoutés et configurés dans la configuration de l'application. Chaque module assure une fonction particulière et ils peuvent être coordonnés entre eux par le cycle de vie de l'application. Le concept des modules de la version 2.x a été replacé dans la v3.0 par les répertoires des pages. En conséquence, le format de configuration de l'application de la v3.0 est très différent des versions précédentes.
-
-Les pages dans la version 3.0 sont organisés dans des répertoires qui peuvent être comparés au concept des modules de la v2.x. Les pages sont demandées selon leur structure. Par exemple, une URL index.php?page=Controls.Samples.Sample1 sera utilisée pour servir une page nommée Sample1 se trouvant dans le répertoire [BasePath]/Controls/Samples, où [BasePath] se réfère au répertoire racine des pages. Le nom d'un fichier template d'une page doit avoir comme extension .page, principalement pour différencier les templates des pages des templates des contrôles qui se termineront par l'extension .tpl.
-
-La version 3.0 redéfinit les relations entre les contrôles. En particulier, la relation parent-enfant se réfère désormais à la relation entre les contrôles et la présentation. Un nouveau nom de relation est introduit afin d'aider la gestion des identifiants des contrôles. Pour plus de détails, voir la section concernant les contrôles.
-
-La syntaxe des contrôles dans les templates de la v3.0 est très similaire à celle des versions précédentes avec beaucoup d'améliorations. Un changement important est au sujet des expression dans le databinding. Dans la v3.0, cela est fait de la façon suivante,
-Les expressions et les tags d'états ont aussi changé. Pour plus de détails, voir la section concernant la définition des templates.
-
-Les thèmes dans la v3.0 sont définis comme les contrôles des templates avec quelques restrictions.
-
-PRADO adalah kerangka pemrograman berbasis-komponen dan kendali-event untuk mengembangkan aplikasi Web dalam PHP 5. PRADO singkatan dari PHP Rapid Application Development Object-oriented.
-
-Tujuan utama dari PRADO adalah menghidupkan usabilitas secara maksimum dalam pemrograman Web. Dengan usabilitas, kami artikan tidak hanya menggunakan ulang kode yang dimiliki seseorang, tapi juga menggunakan ulang kode orang lain dalam cara yang mudah. Yang terakhir lebih penting karena menghemat usaha penciptaan roda dan menghemat waktu pengembangan secara dramatis. Pengenalan atas konsep komponen adalah untuk tujuan ini.
-
-Untuk mencapai tujuan di atas, PRADO menetapkan sebuah protokol atas penulisan dan pemakaian komponen untuk membentuk aplikasi Web. Komponen adalah unit software yang mengandung-dirinya sendiri dan dapat dipakai ulang dengan kustomisasi mudah. Komponen baru dapat dibuat dengan komposisi sederhana terhadap komponen-komponen yang sudah ada.
-
-Untuk menjembatani interaksi dengan komponen, PRADO menerapkan paradigma pemrograman kendali-event yang membolehkan delegasi aturan yang bisa diperpanjang ke komponen. Aktivitas pengguna-akhir seperti mengklik pada tombol kirim, ditangkap sebagai event server. Metode atau fungsi dapat disertakan pada event ini agar ketika event terjadi, metode atau fungsi dipanggil secara otomatis untuk merespon event. Dibandingkan dengan pemrograman Web tradisional di mana para pengembang harus berhadapan dengan variabel kasar POST atay GET, pemrograman kendali-event membantu para pengembang lain lebih berfokus pada logika yang diperlukan dan mengurangi secara drastis pengkodean berulang kali.
-
-Ringkasnya, mengembangkan aplikasi Web PRADO sebagian besar menyangkut penurunan tipe komponen yang sudah dibuat sebelumnya, mengkonfigurasinya dengan menyetel propertinya, merespon ke event-nya dengan menulis fungsi pengendali, dan mengaturnya ke dalam halaman untuk aplikasi. Ini sangat mirip dengan kit piranti RAD, seperti Borland Delphi dan Microsoft Visual Basic, yang digunakan untuk mengembangkan aplikasi GUI desktop.
-
-PRADO banyak dikutip sebagai kerangka kerja yang unik. Kenyataannya, ia begitu unik sehinggi ia dapat mengalihkan pemrograman PHP yang membosankan menjadi tugas yang menyenangkan. Daftar berikut adalah ringkasan pendek dari fitur utama PRADO,
-
-PRADO paling cocok untuk membuat aplikasi Web yang tingkat interaksif-penggunanya cukup tinggi. Ia dapat dipakai untuk mengembangkan sistem sesederhana sistem blog sampai serumit sistem manajemen konten (CMS) atau solusi e-commerce lengkap. Karena PRADO mempromosikan pemrograman terorientasi-obyek melalui metodologi basis-komponennya, ia sangat cocok untuk kerjasama tim dan pengembangan enterprise.
-
-PRADO hadir dengan set lengkap atas teknik cache yang membantu mempercepat aplikasi Web PRADO untuk mengakomodasi kebutuhan lalu lintas tinggi. Arsitektur modularnya membolehkan para pengembang menyertakan modul cache berbeda untuk keperluan yang berbeda pula. Cache output membebaskan seseorang untuk memilih secara selektif bagian halaman Web yang akan di-cache.
-
-PRADO sering dikutip sebagai kerangka kerja unik. Keunikannya terutama berada pada paradigma pemrograman berbasis-komponen dan kendali-event yang dicoba dipromosikan. Meskipun paradigma pemrograman ini bukan hal baru dalam pemrograman aplikasi desktop dan bukan hal baru dalam beberapa bahasa pemrograman Web, Barangkali PRADO adalah kerangka kerja PHP pertama yang menghidupkannya.
-
-Kebanyakan kerangka kerja PHP berfokus pada pemisahan penyajian dan logika serta mempromosikan pola desain MVC (model-view-controller). Pada dasarnya PRADO melakukan tujuan yang sama dengan membutuhkan logika disimpan dalam kelas dan penyajian dalam template. PRADO melakukan lebih banyak aspek tidak hanya MVC. Ia mengisi banyak area kosong dalam pemrograman Web PHP dengan paradigma pemrograman berbasis-komponen, kontrol Web yang kaya, dukungan database yang handal, fitur penanganan kesalahan yang fleksibel serta fitur pencatatan, dan masih banyak lagi.
-
-Ya. PRADO awalnya dirilis pada bulan Agustus 2004. Banyak rangkaian pengujian sudah ditulis dan dilaksanakan secara berkala guna memastikan kualitasnya. Sudah dipakai oleh ribuan pengembang dan banyak aplikasi Web dikembangkan berbasis itu. Bugs dan permintaan fitur diatur melalui sistem TRAC dan kami mempunyai komunitas pengguna besar dan tim pengembangan untuk memastikan semua pertanyaan dijawab dalam model berkala.
-
-Inspirasi orisinil PRADO berasal dari Apache Tapestry. Selama desain dan implementasi, Saya meminjam ide dari Borland Delphi dan Microsoft ASP.NET. Versi pertama PRADO keluar dalam bulan Juni 2004 dan ditulis dalam PHP 4. Karena adanya kontes kode Zend PHP 5, Saya menulis ulang PRADO dalam PHP 5, yang membuktikan menjadi perpindahan yang bijaksana, terima kasih pada model obyek baru yang disediakan PHP 5. PRADO memenangkan hadiah utama dalam kontes Zend, memperoleh pilihan tertinggi baik dari umum dan panelis juri.
-
-Dalam bulan Agustus 2004, PRADO mulai ditampung pada SourceForge sebagai proyek sumber terbuka. Segera setelah itu, situs proyek xisc.com diumumkan kepada publik. Dengan dukungan fantastis dari tim pengembang PRADO dan pengguna PRADO, PRADO berkembang ke versi 2.0 di pertengahan 2005. Dalam versi ini, Wei Zhuo berkontribusi ke PRADO dengan dukungan I18N dan L10N yang istimewa.
-
-Dalam bulan Mei 2005, kami memutuskan untuk menulis ulang sepenuhnya kerangka kerja PRADO untuk memecahkan beberapa isu dasar dalam versi 2.0 dan untuk menangkap dengan beberapa fitur bagus dalam Microsoft ASP.NET 2.0. Setelah hampir setahun kerja keras dengan lebih dari 50,000 baris kode baru, versi 3.0 akhirnya tersedia pada bulan April 2006.
-
-Mulai dari versi 3.0, usaha signifikan dialokasikan untuk memastikan kualitas dan stabilitas PRADO. Jika kami katakan PRADO v2.x dan v1.x adalah pekerjaan bukti-konsep, kami dapat mengatakan PRADO 3.x telah berkembang menjadi proyek yang layak untuk pengembangan aplikasi bisnis serius.
- File naskah PHP opsional prado-cli.php dalam direktori framework
-menyediakan piranti baris perintah untuk melakukan berbagai hal membosankan dalam Prado.
-prado-cli.php dapat dipakai untuk membuat kerangka proyek Prado, membuat perlengkapan pengujian awal, dan akses ke shell PHP interaktif.
-
-Untuk menggunakan piranti baris perintah, Anda perlu memakai prompt perintah Anda, konsol perintah atau terminal. Sebagai tambahan, PHP harus dapat menjalankan naskah PHP dari baris perintah.
-
-Jika Anda ketik php path/ke/framework/prado-cli.php, Anda seharusnya melihat informasi berikut. Alternatifnya, jika Anda tidak pada Windows, Anda dapat mencoba untuk mengubah prado-cli.php ke dalam eksecutabel dan menjalankannya seperti sebuah naskah <parameter> adalah parameter diperlukan dan [optional] adalah parameter opsional. Untuk membuat kerangka proyek Prado, lakukan yang berikut:
-Shell interaktif membolehkan Anda untuk mengevaluasi pernyataan PHP dari baris perintah.
-Naskah prado-cli.php dapat dipakai untuk memulai shell dan mengambil proyek Prado yang sudah ada. Sebagai contoh, mari kita ambil proyek demo blog. Anggap bahwa baris perintah Anda ada dalam direktori distribusi prado dan Anda mengetikkannya.
-
-
-Dalam seksi ini, kami membimbing Anda melalui pembuatan aplikasi PRADO pertama Anda, aplikasi terkenal "Hello World".
-
-"Hello World" barangkali adalah aplikasi PRADO interaktif paling sederhana yang bisa Anda buat. Ia menampilkan kepada pengguna-akhir sebuah halaman dengan tombol kirim yang judulnya adalah Click Me. Setelah pengguna mengklik tombol, judulnya diubah ke Hello World.
-
-Ada banyak pendekatan yang dapat mencapai tujuan di atas. Seseorang dapat mengirim halaman ke server, menentukan variabel POST, dan membuat halaman baru dengan judul tombol yang dimutakhirkan. Atau seseorang cukup menggunakan JavaScript untuk memutakhirkan judul tombol setelah event klien onclick.
-
-PRADO mempromosikan pemrograman Web berbasis-komponen dan kendali-event. Tombol disajikan oleh obyek TButton. Ia melapisi judul tombol sebagai properti Text dan mengaitkan tindakan klik pengguna dengan event sisi-server OnClick. Untuk merespon klik pengguna pada tombol, seseorang cukup perlu menyertakan fungsi ke event OnClick tombol. Di dalam fungsi, properti tombol Text diubah sebagai "Hello World". Diagram berikut menampilkan urutan di atas,
-
-
-Aplikasi PRADO kita terdiri dari tiga file, index.php, Home.page dan Home.php, yang diatur sebagai berikut,
-
-
-di mana setiap direktori dijelaskan sebagai berikut. Catatan, struktur direktori di atas bisa dikustomisasi. Sebagai contoh, seseorang dapat memindahkan direktori protected ke luar direktori Web. Anda akan mengetahui bagaimana melakukan ini setelah Anda melewati tutorial ini.
-
-Ketiga file yang kita pakai dijelaskan sebagai berikut.
-
-Aplikasi sekarang siap dan dapat diakses melalui: http://Web-server-address/helloworld/index.php, menganggap helloworld adalah direktori di bawah Web DocumentRoot. Coba untuk mengubah TButton dalam Home.page ke TLinkButton dan lihat apa yang terjadi.
-
-Kode sumber lengkap dari demo ini dapat ditemukan pada rilis PRADO. Anda juga dapat mencoba demo online.
-
-Jika Anda sedang melihat halaman ini dari server Web Anda, maka Anda sudah selesai dengan instalasi.
-
-Persyaratan minimum PRADO adalah server Web yang mendukung PHP 5. PRADO sudah diuji dengan server Web Apache pada Windows dan Linux. Sangat dimungkinkan ia juga berjalan pada platform lain dengan server Web lain, selama PHP 5 didukung.
-
-Instalasi PRADO sebagian besar menyangkut download dan penguraian.
-
-Instalasi PRADO Anda selesai dan dapat mulai bermain dengan demo aplikasi yang disertakan dalam rilis PRADO via URL http://web-server-address/prado/demos/. Di sini kami menganggap PRADO diurai ke subdirektori prado di bawah DocumentRoot pada server Web.
-
-Jika Anda menemukan masalah dengan demo aplikasi, silahkan gunakan naskah pemeriksa persyaratan, yang dapapt diakses melalui http://web-server-address/prado/requirements/index.php, untuk terlebih dahulu memeriksa apakah konfigurasi server Anda memenuhi kondisi yang dibutuhkan oleh PRADO.
-
-Tutorial Cepat ini disediakan untuk membantu Anda secara cepat membangun aplikasi Web Anda sendiri berbasis PRADO versi 3.x.
-
-Jika Anda adalah pengguna yang sudah mengenal PRADO 3.x dan ingin mempelajari peningkatan apa yang tersedia pada versi baru, silahkan periksa halaman fitur baru. Sebaliknya, seksi berikut sangat membantu bagi para pemula.
-
-Anda dapat merujuk ke sumber daya berikut jika Anda mendapatkan tutorial ini tidak memenuhi semua kebutuhan Anda.
-
-Halaman ini meringkas fitur-fitur utama baru yang diperkenalkan dalam setiap rilis PRADO.
-
-PRADO v3.0 TIDAK kompatibel mundur dengan versi PRADO sebelumnya.
-
-Berita baiknya adalah, properti dan event dari kebanyakan kontrol tetap sama, dan sintaks template kontrol sebagian besar tidak diubah. Oleh karena itu, pengetahuan para pengembang dari versi PRADIO sebelumnya masih berlaku dalam v3.0.
-
-Kami meringkas perubahan paling berarti dalam v3.0 guna membantu para pengembang meningkatkan aplikasi PRADO v2.x dan v1.x lebih mudah, jika diperlukan.
-
-Versi 3.0 sepenuhnya telah mengabaikan kebutuhan file spesifikasi komponen. Ia banyak bergantung pada konvensi untuk mendefinisikan properti dan event komponen. Dalam keadaan tertentu, properti didefinisikan oleh keberadaan dari metode pengambil dan/atau metode penyetel, sementara event didefinisikan dengan keberadaan pada-metode. Nama properti dan event dalam v3.0 keduanya sensitif-huruf. Sebagai konsekuensinya, para pengembang diperlukan untuk memelihara perubahan tipe saat properti komponen sedang disetel. Sebagai contoh, kode berikut dipakai untuk mendefinisikan metode penyetel untuk properti yang Dihidupkan dari TControl, yang merupakan tipe boolean,
-
-di mana TPropertyValue::ensureBoolean() dipakai untuk memastikan bahwa nilai input adalah boolean. Ini adalah karena ketika properti dikonfigurasi dalam template, nilai string dikirimkan ke penyetel. Dalam versi sebelumnya, PRADO mengetahui tipe properti berdasarkan file spesifikasi komponen dan melakukan konversi tipe bagi Anda.
-
-Pengontrol aplikasi sekarang menerapkan sebuah arsitektur modular. Modul bisa disertakan dan dikonfigurasi dalam spesifikasi aplikasi. Setiap modul menganggap fungsionalitas tertentu, dan dikoordinasikan bersama oleh masa hidup aplikasi. Konsep modul v2.x diganti dalam v3.0 by direktori halaman. Walhasil, format v3.0 spesifikasi aplikasi juga berbeda dari versi sebelumnya.
-
-Halaman pada v3.0 diatur dalam direktori yang bisa dibandingkan ke konsep modul pada v2.x. Halaman diminta menggunakan path kepadanya. Sebagai contoh, URL index.php?page=Controls.Samples.Sample1 akan dipakai untuk meminta halaman bernama Sample1 yang disimpan di bawah direktori [BasePath]/Controls/Samples, di mana [BasePath] merujuk ke akar path halaman. Nama file dari template halaman harus diakhiri dengan .page, terutama untuk membedakan template halaman dari template kontrol non-halaman yang nama filenya sama harus diakhiri dengan .tpl.
-
-Versi 3.0 mendefinsikan kembali hubungan diantara kontrol. Dalam keadaan tertentu, hubungan leluhur-anak sekarang merujuk ke hubungan lampiran antara penyajian kontrol. Dan hubungan wadah-penamaan baru diperkenalkan guna membantu lebih baik mengatur ID kontrol. Untuk lebih jelasnya, lihat seksi controls.
-
-Sintaks template kontrol dalam v3.0 tetap mirip dengan versi sebelumnya, dengan banyak peningkatan. Perubahan utama adalah mengenai ekspresi penyatuan data. Dalam v3.0, ini dikerjakan dengan mengikuti,
-
-Tag ekspresi dan pernyataan juga diubah. Untuk lebih jelasnya, lihat seksi definisi template.
-
-Tema dalam v3.0 didefinisikan seperti template kontrol dengan beberapa batasan.
-
-PRADO はコンポーネントベースかつイベントドリブンなウェブアプリケーションを開発するためのPHP5フレームワークです。「PRADO」の名称は、PHP Rapid Application Development Object-oriented の略です。
-
-PRADO の第一の目標は、ウェブプログラミングにおけるコードの再利用性を最大限に高めることです。
-ここでの再利用性は、自分自身で開発したコードを再利用することだけではなく、簡単な方法で他人の開発したコードを再利用することも意味しています。これは、「車輪の発明」という無駄な努力に要する時間を節約し開発工数を劇的に減らすためにはとても重要な項目といえます。PRADOではこの目的を実現するためにコンポーネントという概念を導入しています。
-
-上記の目的を達するために、PRADO ではウェブアプリケーション構築のためのコンポーネントの作成方法および使用方法を規定しています。コンポーネントとは、自己充足的かつちょっとしたカスタマイズで再利用が可能なソフトウェアユニットです。新しいコンポーネントは既存のコンポーネントを単純に組み合わせるだけで作成する事ができます。
-
-コンポーネントをインタラクティブに利用できるように、PRADO ではイベントドリブンプログラミングの枠組みを実装しています。ボタンの押下などのユーザーアクションはサーバー側のイベントとして補足されます。メソッドや関数をそれらのイベントに対応付けておくと、イベントに反応するかのように自動的にメソッドや関数が実行されます。POST/GET 変数を取得して処理をする従来のウェブプログラミングと比べて、イベントドリブン型プログラミングは開発者が必要な処理に集中でき、POST/GET の取得などの反復コードも激減する事になります。
-
-PRADO でのアプリケーション開発は、ページにコンポーネントを配置し、プロパティの設定やイベントに反応するメソッドをコーディングすることが主な作業となります。これはデスクトップ GUI アプリケーションを開発するのに使用する Borland Delphi や Microsoft Visual Basic などの RAD ツールと非常に似た作りとなっています。
-
-PRADO はユニークなフレームワークとして紹介されています。事実、退屈な PHP プログラミングを楽しいものと変えることができるくらいユニークなフレームワークです。以下のリストは、PRADO に関する主な機能となっています。
-
-PRADO はインタラクティブなウェブアプリケーションを開発するのにとても適しています。コンテンツ管理システム(CMS)や、Eコマースなどの複雑なシステムを比較的容易に開発する事ができます。PRADO はコンポーネントベースのオブジェクト指向プログラミングですので、企業等でのチーム開発で力を発揮します。
-
-PRADO はアプリケーションの高速化とスケーラビリティを実現するためのキャッシュ機構を実装しています。利用する環境によりキャッシュモジュールを選択し、PRADO アプリケーションで利用する事ができます。出力キャッシュは、レンダリングされたウェブページの一部をキャッシュとして保存しておき、再度レンダリングする際に自動的にキャッシュから取得する機構になっています。
-
-PRADO はよくユニークなフレームワークと呼ばれています。コンポーネントベースとイベントドリブンな実装が特にユニークであるとされています。このプログラミング方法はデスクトップアプリケーション開発においては新しくはなく、いくつかのウェブプログラミング言語でも実装されていますが、PHP のフレームワークとしてはおそらく初めて実装されたフレームワークです。
-
-ほとんどの PHP フレームワークでは、画面表示部分とロジック部分を分離することに着目し、そのためにMVCデザインパターンで開発することを推奨しています。一方PRADOでは、テンプレートの中に画面表示部分を、クラスにロジック部分を記述することで、自然に同様の目標を達成する事ができています。そして、MVCでは実現できなかったコンポーネントベースのプログラミングスタイル、豊富なウェブコントロール、強力なデータベースサポート、柔軟なエラー処理とロギング機能などの色々な機能を実装することができています。
-
-はい。PRADO は2004年8月に初めてリリースされました。品質を確保するために多くのテストプログラムが作成されており、何千人もの開発者が利用しています。このテストプログラムによるテストを重ねて、フレームワークは開発されており、バグや機能追加などは TRAC システムにより管理されています。そして、すべての開発者の疑問にスピーディーに回答できるようにコミュニティも用意してあります。
-
-PRADO のユニークな発想は Apache Tapestry から生まれました。設計と実装には、Borland Delphi と Microsoft ASP.NET から多くのアイディアを借りました。PRADO の最初のバージョンは、2004年6月にできて、PHP4で書かれていましたが、Zend PHP5コンテストに応募するためにPHP5のコードに書き直しました。(PHP5から提供されたオブジェクトモデルはとても助けになりました)そして PRADO は Zend コンテストで観客・審査員の高い評価を得て特賞を勝ち取りました。
-
-2004年8月にオープンソースプロジェクトとして SourceForge にて提供され始め、そのすぐ後にプロジェクトサイト「xisc.com」が公開されました。PRADO 開発チームと PRADO ユーザーのサポートにより、PRADO は2005年中頃にバージョン2.0へとバージョンアップしました。このバージョンでは Wei Zhuo が I18N/L10N サポートの実装で貢献をしました。
-
-2005年5月に、バージョン2.0で見つかった問題点を解決し、さらに Microsoft ASP.NET2.0 で利用可能ないくつかの機能を実装するために PRADO フレームワークを完全に書き直す決定をしました。1年近い期間をかけて、新たに50,000行を超える新しいコードを追加し、2006年4月にバージョン3.0をリリースしました。
-
-バージョン3.0では、PRADO の品質と安定性を確実にするために多くの時間を当てています。
-そして私たちは、PRADO 2.x/1.x においてそのコンセプトの正しさが証明され、PRADO 3.x において重要なビジネスアプリケーションの開発に適したフレームワークにまで成長したと私たちは確信しています。
- The optional prado-cli.php PHP script file in the framework
-directory provides command line tools to perform various tedious takes in Prado.
-The prado-cli.php can be used to create Prado project skeletons, create
-initial test fixtures, and access to an interactive PHP shell.
-
-To use the command line tool, you need to use your command prompt, command console
-or terminal. In addition, PHP must be able to execute PHP scripts from
-the command line.
-
-If you type php path/to/framework/prado-cli.php, you should see
-the following information. Alternatively, if you are not on Windows,
-you may try to change the prado-cli.php into an executable
-and execute it as a script The <parameter> are required parameters and [optional]
-are optional parameters. To create a Prado project skeleton, do the following:
-The interactive shell allows you to evaluate PHP statements from the command line.
-The prado-cli.php script can be used to start the shell and load an existing
-Prado project. For example, let us load the blog demo project. Assume that your
-command line is in the prado distribution directory and you type.
-
-
-ここでは、初めて PRADO アプリケーションを開発する人のために、定番の "Hello World" アプリケーションを解説します。
-
-"Hello World" を作る事は、最もシンプルでインタラクティブな PRADO アプリケーションを作る事かもしれません。
-このアプリケーションには、複雑なアプリケーションを作る上で重要なアプローチがいくつかあります。
-PRADO ではコンポーネントベース、そしてイベントドリブンのウェブプログラミングを構築する事ができます。
-このアプリケーションは3つのファイル index.php, Home.page, Home.php から構成されています。
-
-
-各ディレクトリ名は開発者によって変更する事が可能です。例えば protected ディレクトリはウェブサーバーにより公開されたディレクトリ以外の場所へ移動することができます。このチュートリアルを読む事で、その方法を修得する事ができます。
-
-アプリケーションの実行に必要な3つのファイルの内容は以下のとおりです。
-
-アプリケーションファイルの準備ができたら、次のURLからアクセスすることができます。 http://Web-server-address/helloworld/index.php
-PRADO リリースアーカイブファイルにこのデモのソースを格納しています。また、オンラインデモにて動作を確認する事ができます。
-
-ご自分で管理されているサーバーをお持ちであれば、すぐにインストールすることが可能です。
-
-PRADO の最小構成は、サーバーがPHP5をサポートしていることです。
-PRADO のインストールは、PRADO をダウンロードし解凍することが主な作業となります。
-
-上記の作業のみでPRADOのインストールが完了します。
-もしデモアプリケーションが動作しない等の問題が発生しましたら、サーバー構成がPRADO必要条件を満たしているかどうかを確認する事ができるスクリプト http://web-server-address/prado/requirements/index.php が用意されていますので、確認してください。
-
-このチュートリアルはPRADO3.xを使ったアプリケーションをスピーディーに構築するためのものです。
-
-既にPRADO3.xを使用しており新しいバージョンで強化された機能を知りたい方は、まずは新機能ページをご覧ください。PRADOを使用したことのない方にはこのチュートリアルはとても役立つものですので、ぜひご覧下さい。
-
-もしこのチュートリアルの内容では不十分と感じたら、以下リンクの各種資料もご覧ください。
-
-このページは、以下バージョンの PRADO に含まれる新機能の概要を紹介するページです。
-
-PRADO v3.0 is NOT backward compatible with earlier versions of PRADO.
-
-A good news is, properties and events of most controls remain intact, and the syntax of control templates remains largely unchanged. Therefore, developers' knowledge of earlier versions of PRADO are still applicable in v3.0.
-
-We summarize in the following the most significant changes in v3.0 to help developers upgrade their v2.x and v1.x PRADO applications more easily, if needed.
-
-Version 3.0 has completely discarded the need of component specification files. It relies more on conventions for defining component properties and events. In particular, a property is defined by the existence of a getter method and/or a setter method, while an event is defined by the existence of an on-method. Property and event names in v3.0 are both case-insensitive. As a consequence, developers are now required to take care of type conversions when a component property is being set. For example, the following code is used to define the setter method for the Enabled property of TControl, which is of boolean type,
-
-where TPropertyValue::ensureBoolean() is used to ensure that the input value be a boolean. This is because when the property is configured in template, a string value is passed to the setter. In previous versions, PRADO knows the property type based on the component specification files and does the type conversion for you.
-
-Application controller now implements a modular architecture. Modules can be plugged in and configured in application specifications. Each module assumes a particular functionality, and they are coordinated together by the application lifecycle. The concept of v2.x modules is replaced in v3.0 by page directories. As a result, the format of v3.0 application specification is also different from earlier versions.
-
-Pages in v3.0 are organized in directories which may be compared to the module concept in v2.x. Pages are requested using the path to them. For example, a URL index.php?page=Controls.Samples.Sample1 would be used to request for a page named Sample1 stored under the [BasePath]/Controls/Samples directory, where [BasePath] refers to the root page path. The file name of a page template must be ended with .page, mainly to differentiate page templates from non-page control templates whose file names must be ended with .tpl.
-
-Version 3.0 redefines the relationships between controls. In particular, the parent-child relationship now refers to the enclosure relationship between controls' presentation. And a new naming-container relationship is introduced to help better manage control IDs. For more details, see the controls section.
-
-The syntax of control templates in v3.0 remains similar to those in earlier versions, with many enhancements. A major change is about the databinding expression. In v3.0, this is done by the following,
-
-Expression and statement tags are also changed similarly. For more details, see the template definition section.
-
-Themes in v3.0 are defined like control templates with a few restrictions.
-
-PRADO jest napisanym w PHP5 frameworkiem dla aplikacji webowych opartym na komponentach oraz programowaniu zdarzeniowym (ang. event-driven programming).
-PRADO z angielskiego oznacza PHP Rapid Application Development Object-oriented (przyp. tłum. szybkie tworzenie aplikacji zorientowanych obiektowo w PHP).
-
-Głównym celem PRADO jest zmaksymalizowanie ponownego wykorzystania kodu (ang. reusability w programowaniu webowym. Poprzez ponowne wykorzystanie kodu rozumiemy nie tylko ponowne używanie własnego kodu ale również ponowne używanie w prosty sposób tego kodu przez inne osoby. To drugie jest bardziej ważne, gdyż oszczędza niepotrzebny wysiłek włożony w ponowne odkrywanie koła i może znacznie zmniejszyć czas developmentu. Taka jest właśnie intencja zastosowania koncepcji komponentów.
-
-Aby osiągnąć powyższe cele, PRADO wymaga protokołu pisania i używania komnponentów do konstrukcji aplikacji webowych. Komponent jest jednostką programowania, która jest samowystarczalna i może być użyta ponownie poprzez proste dostosowanie (ang. trivial customization). Nowy komponent może zostać stworzony jako prosta kompozycja istniejących komponentów.
-
-Aby ułatwić interakcję z komponentami, PRADO implementuje paradygmat programowania sterowanego zdarzeniami (ang. event-driven programming paradigm), który umożliwia elastyczne przekierowanie zachowania do komponentu. Czynności użytkownika końcowego, takie jak kliknięcie na przycisk (ang. submit button), są przechwytywane jako zdarzenia serwera. Zarówno metody jak i funkcje mogą być przypisane do tych zdarzeń. W chwili gdy takie zdarzenie występuje są one (metody, funkcje) automatycznie wywoływane w odpowiedzi na zdarzenie. W porównaniu do tradycyjnego programowania, w których developerzy muszą zmagać się z surowymi zmiennymi POST i GET, programowanie zdarzeniowe pomaga developerom lepiej skupić się na niezbędnej logice i poważnie zredukować nispoziomowe powtarzające się kodowanie.
-
-Sumując, tworzenie w PRADO aplikacji sieciowych, polega głównie na tworzeniu instancji różnego typu wbudowanych komponentów, konfigurowania ich, odpowiadania na ich zdarzenia poprzez przypisanie im uchwytów funkcji oraz wkomponowanie ich w stronę aplikacji. Jest to bardzo podobne do narzędzi RAD, takich jak Borland Delphi, czy też Microsoft Visual Basic, które używane są do tworzenia desktopowych aplickacji GUI (ang. develop GUI application).
-
-PRADO jest najczęściej postrzegane jako jedyny w swoim rodzaju framework. W rzeczy samej, jest on tak unikatowy, że może zamienić nużące programowanie w PHP w przyjemną zabawę. Poniższa lista jest krótkim podsumowaniem, głównych możliwości (cech) PRADO.
-
-Stosowanie PRADO jest najbardziej wskazane w aplikacjach internetowych, które są wysoce interaktywne z użytkownikiem. Może być wykorzystywane do tworzenia systemów tak prostych jak internetowe blogi po kompleksowe rozwiązania e-commerce. Ponieważ PRADO wspiera programowanie zorietnowane obiektowo (OOP) poprzez własną metodologię, bazująca na komponentach, pasuje ono ekstremalnie dobrze do pracy grupowej oraz tworzenia aplikacji klasy enterprise (ang. enterprise development).
-
-PRADO przychodzi z kompletnym zestawem technik keszowania, które pomagają przyśpieszyć aplikacje internetowe PRADO, by móc zastosować je do aplikacji o wysokim ruchu. Jego modularna architektura umożliwia developerom używanie oraz podłączanie różnych modułów keszujących w zależności od potrzeb. Keszowanie wyjścia umożliwia każdemu selektywny wybór keszowania części wyświetlanej strony.
-
-PRADO często jest postrzegane jako jedyny w swoim rodzaju framework. Jego unikatowość polega głównie na programowaniu bazującym na komponentach oraz paradygmacie programowania sterowanego zdarzeniami, które stara się promować. Chociaż ten paradygmat nie jest nowością w aplikacjach desktopowych oraz nie jest nowy w kilku językach programowania webowego, PRADO jest prawdopodobnie pierwszym frameworkiem umożliwiającym go.
-
-Większość frameworków PHP skupia się głównie na odseparowaniu warstwy prezentacji i logiki promując wzorzec programowania MVC (przyp. tłum. od pierwszych liter model - model view - widok controler - kontroler). PRADO osiąga te same cele naturalnie poprzez potrzebę prechowywania logiki w klasach a prezetnacji w szablonach (ang. templates). PRADO robi dużo więcej w sprawach innych niż MVC. Wypełnia wiele białych plam w programowaniu webowym w PHP, swoim bazującym na komponentach paradygmacie programowania, jego bogatym zestawem kontrolek webowych, jego wszechstronną obsługą baz danych, jego elastyczną obsługą błędów oraz ich logowania oraz wiele wiele innych.
-
-Tak. PRADO zostało pierwszy raz opublikowane w sierpniu 2004 roku. Wiele zestawów testów zostało od tego czasu napisanych oraz często przeprowadzanych by upewnić sie o jakości PRADO. Framework był używany przez tysiące użytkowników oraz developerów a wiele aplikacji internetowych powstało w oparciu o niego. Bugi oraz żądania rozszerzeń są zarządzane poprzez system TRAC, posiadamy także wspaniałą społeczność użytkowników oraz zespół developerów by być pewnym, że żadne pytanie nie pozostanie bez odpowiedzi.
-
-Pierwotna inspiracja PRADO pochodziła od Apache Taperstry. W trakcie projektowania i implementacji, zapożyczyłem wiele idei z Borland Delphi oraz Microsodt ASP.NET. Pierwsza wersja PRADO ujrzała świat w czerwcu 2004 roku i została napisana w PHP4. Zachęcony konkursem kodowania w PHP5 Zenda, przepisałem PRADO do PHP5, co okazało się mądrym posunięciem, dzięki nowemu modelowi obiektowemu dostarczonemu przez PHP5. PRADO zdobyło główną nagrodę w konkrusie Zenda, uzyskując najwięcej głosów zarówno wsród publiczności jak i wśród sędziów.
-
-W sierpniu 2004, PRADO zaczęło być hostowane przez SourceForge jako projekt open source. Wkrótce, stona projektu xisc.com została zaprezentowana publicznie. Wraz z fantastycznym wparciem zespołu developerów PRADO oraz jego użytkowników, PRADO rozwinęło się do wersji 2.0 w połówie 2005 roku. W tej wersji, Wei Zhuo dołączył do PRADO ze znakomita opbsługą dla I18N oraz L10N.
-
-W maju 2005, zdecydowaliśmy się całkowicie przepisać framewrork PRADO, by rozwiązać kilka kluczowych kwestii z wersji 2.0 oraz by porwać kilka fajnych możliwości dostępncyh w Microsoft ASP.NET. Po około roku ciężkiej pracy z ponad 50.000 liniami nowego kodu, wersja 3.0 została w końcu udostępniona w kwietniu 2006r.
-
-Poczynając od wersji 3.0, znaczny nakład jest kładziony by zapewnić jakość oraz stabilność PRADO. Jeśli powiemy, że PRADO w wersjach 2.x oraz 1.x były dziełem potwierdzającym koncept (ang. proof-of-concept work), możemy powiedzieć, że PRADO 3.X wyrosło na projekt, który jest odpowiedni dla tworzenia plikacji biznesowych.
- Opcjonalny plik skryptu PHP prado-cli.php PHP w folderze framework
-dostarcza narzędzia linii poleceń do wykonywania różnych monotonnych czynności w PRADO.
-Prado-cli.php może zostać użyte do stworzenia szkieletu projektu PRADO, zainicjowania testów oraz uzyskania dostępu do
-interaktywnej powłoki PHP.
-
-Aby używać narzędzia linii poleceń powinieneś użyć terminala, consoli komend lub opcji uruchom. Dodatkowo PHP musi mieć możliwość
-wykonywania skryptów PHP z linii poleceń.
-
-Wpisując php ścieżka/do/katalogu/framework/prado-cli.php, powinieneć zobaczyć następujace informacje.
-Alternatywnie, jeśli nie używasz Windowsa możesz spróbować zamienić prado-cli.php na plik wykonywalny
-i wywołać go jako skrypt. <parameter> są wymaganymi parametrami a [optional]
-są parametrami opcjonalnymi. Aby stworzyć szkielekt projektu Prado, wykonaj następujące czynności:
-Interaktywna powłoka umożliwia Ci wykonywanie wyrażeń PHP z linii poleceń.
-Skrypt prado-cli.php może zostać użyty do uruchomienia powłoki i załadowania istniejącego projektu Prado.
-Dla przykładu załadujmy projekt demo blogu. Zakładając, że twoja linia poleceń jest w katalogu żródłowym prado i wpiszesz...
-
-
-W tej sekcji, przeprowadzimy Cię przez proces tworzenia Twojej pierwszej aplikcaji w PRADO, słynną aplikację "Witaj świecie" (ang. "Hello World").
-
-"Witaj świecie" prawdopodobnie jest najprostszą interaktywną aplikacją w PRADO, którą możesz stworzyć. Wyświetla ona użytkownikowu końcowemu stronę z przyciskiem, którego napis to Kliknij mnie (ang. Click Me). Po tym jak użytkownik kliknie na przycisk, jego napis zmienia się na Witaj świecie.
-
-Jest wiele dróg aby osiągnąć ten cel. Można przesłać (ang. submit) stronę do serwera, sprawdzić zmienną POST i wygenerować nową stronę z przyciskiem ze zaktualizowanym napisem. Można też przez proste użycie JavaScript zaktualizować napis podczas zdarzenia OnClick po stronie klienta.
-
-PRADO promuje programowanie sterowane zdarzeniami i bazujące na komponentach. Przycisk jest reprezentowany przez obiekt TButton. Hermetyzuje on napis na przycisku jako właściwość Text przycisku oraz wiąże akcję naciśnięcia przez użytkownika przycisku ze zdarzeniem po stronie serwera OnClick. Aby odpowiedzieć na naciśnięcie przez użytkownika przycisku, należy po prostu przypisać funkcję do zdarzenia OnClick przycisku. Wewnątrz funkcji, właściwość Text przycisku jest zmodyfikowana na "Witaj świecie". Poniższy diagram pokazuje powyższą sekwencję.
-
-
-Nasza aplikacja PRADO składa się z trzech plików index.php, Home.page and Home.php, które są zorganizowane w poniższy sposób,
-
-
-gdzie każdy katalog należy rozumieć następująco. Zauważ, że powyższa struktura katalogów jest rozszerzalna. Na przykład, można przenieść katalog protected poza katalog WWW. Będziesz wiedział jak tego dokonać, jeśli przejdziesz przez ten przewodnik.
-
-Trzy pliki, krórych potrzebujemy, kolejno oznaczają
-
-Aplikacja jest teraz gotowa i jest dostępna poprzez adres http://adres-serwera/helloworld/index.php, zakładając, że helloworld znajduje się bezpośrenio w KataloguGłównymDokumentó serwera (ang. DocumentRoot). Spróbuj zmienić TButton w Home.page na TLinkButton i zobacz co się stanie.
-
-Kompletne źródło kodu dla tego demo można znaleźć w wydaniu PRADO. Możesz również spróbować demo online.
-
-Jeśli widzisz tą stronę z poziomu własnego serwera, zakończyłeś właśnie instalację.
-
-Minimalne wymagania PRADO to serwer internetowy wspierający PHP5. PRADO zostało przetestowane na serwerze Apache na Windowsie oraz Linuxie. Jest wielce prawdopodobne, że może również działać na innych platformach z innymi serwerami internetowymi dopóki wspierają one PHP5.
-
-Instalacja PRADO składa się głównie z jego pobrania oraz rozpakowania.
-
-Twoja instalacja PRADO jest zakończona i możesz zacząć zabawę z aplikacjami demo zawartymi w PRADO znajdującymi się pod adresem http://adres-serwera/prado/demos/. Tutaj zakładamy, że PRADO jest rozpakowane do katalogu prado w katalogu głównym serwera.
-
-Jeśli spotkasz się z jakimkolwiek problemem w aplikacjach demo, proszę użyj skryptu sprawdzającego wymagania do korzystania z PRADO dostępnego poprzez http://adres-serwera/prado/requirements/index.php, aby najpierw sprawdzić czy Twoja konfiguracja serwera spełnia wszystkie warunki wymagane przez PRADO.
-
-Niniejszy przewodnik powstał by pomóc Tobie w szybkim rozpoczęciu budowania Twojej własnej aplikacji internetowej bazującej na PRADO w wersji 3.x
-
-Jeśli jesteś już użytkownikiem PRADO #.x i chciałbyś dowiedzieć się jakie rozszerzenia są dostępne dla każdej nowej wersji, proszę sprawdź nowe właściwości.
-Następujące sekcje są pomocne dla początkujących.
-
-Możesz odwoływać się do następujących zasobów jeśli czujesz, że ten przewodnik nie spełnia wszystkich twoich oczekiwań.
-
-Poniższa strona podsumowuje główne możliwości, które zostały wprowadzone w każnym z wydań PRADO.
-
-PRADO 3.0 nie jest kompatybilne wstecz z wcześniejszymi wersjalmi PRADO.
-
-Dobrą wiadomością jest, że własciwości oraz zdarzenia większości kontrolek pozostają niezmienione a składnia szablonów kontrolek pozostaje w dużej mierze niezmieniona. Dlatego więc, wiedza develoiperów dotycząca wcześniejszych wersji PRADO wciąż znajduje zastosowanie w wersji 3.0.
-
-Kolejno podsumujemu najbardziej znaczące zmiany w wersji 3.0 aby pomóc developerom aktualizację ich aplikacji PRADO z wersji 2.x oraz 1.x jeśli wystąpi taka potrzeba.
-
-Wersja 3.0 całkowicie zarzuciła potrzebę występowania pliku specyfikującego komponent. Polega ona obecnie bardziej na konwencji definiowania właściwości komponentu i jego zdarzeń. Uszczegóławiając, właściwość (ang. property) jest definiowana poprzez istnienie metod: getterów i/lub setterów (ang. getter and/or setter methods), natomiast zdarzenie jest zdefiniowane poprzez istnienie metod z przedrostniem on (ang. on-methods). Zarówno właściwości jak i nazwy zdarzeń są w wersji 3.0 nie są wrażliwe na wielkość liter. W konsekwencji developerzy, są teraz zobowiązaniu do troszczenia się konwersję typów, kiedy właściwość komponentu jest ustawiana. Na przykład, następujący kod jest używany do zdefiniowania metody będącej setterem dla właściwości Enabled (przyp. tłum. ang enabled - dostępny, umożliwiony) TControl, która jest typu boolowskiego: boolean,
-
-gdzie TPropertyValue::ensureBoolean() jest używana aby ipewnić się, że wartość wejściowa jest typu boolean. Dziejse się tak ponieważ, gdy watość jest konfigurowana w szablonie, wartość łańcuchowa (ang. string value) jest przekazywana do settera. W poprzednich wersjach PRADO znało typ właściwości bazując na pliku specyfikacji i wykonywało konwersję typów za Ciebie.
-
-Kontroler aplickacji implementuje teraz architekturę modułową. Moduły mogą być podłączone i skonfigurowane w specyfikacji aplikacji. Każdy moduł obejmuje określoną funkcjonalność a wszystkie one są koordynowane przez cykl życia aplickacji (ang. application lidecycle). Konecpcja modułów w wersji 2.x została zastąpiona w wersji 3.0 przez katalogi stron (ang. page directories). W wyniku tego format specyfikacji aplikacji (ang. application specification) w wersji 3.0 różni się od wersji wcześniejszych.
-
-Strony w wersji 3.0 są zorganizowane w katalogach, które mogą zostać porównane do koncepcji modułów w wersji 2.x. Strony są dostępne poprzez ścieżkę do nich. Na przykład, adres URL index.php?page=Kontrolki.Przyklady.Przyklad1 będzie używany do dostępu do strony nazwanej Przyklad1 przechowywanej w katalogu [ŚcieżkaBazowa]/Kontrolki/Przyklad, gdzie [ŚcieżkaBazowa] oznacza główny katalog stron (ang. root page path). Nazwa pliku szablonu strony musi kończyć się rozszerzeniem .page, głównie, aby odróżnić szablony stron od "niestronowych" (ang. non-paged) szablonów kontrolek, których nazwa musi być zakończona rozszerzeniem .tpl.
-
-Wersja 3.0 redefiniuje zależności pomiędzy kontrolkami. W szczególności, relacja rodzic-dziecko (parent-child relationship teraz odnosi się do relacji zawierajacej się w prezentacji kontrolek. Nowa relacja naming-container (przyp tłum. ang. naming - nazywanie, container - kontener) została wprowadzona dla lepszego zarządzania identyfikatorami ID kontrolek. Aby uzyskać więcej informacji zobacz sekcję kontrolki.
-
-Składnia szblonów kontrolek w wersji 3.0 została podobna do tej we wcześniejszych wersjach, ale z wieloma rozszerzeniami. Główna zmiana dotyczy wyrażenia wiążącego dane (ang. databind expression), które jest wykonywane następująco
-
-Tagi formuł oraz wyrażeń (ang. expression and statement tags) zostały zmienione w podobny sposób. Aby uzyskać więcej szczegółów zobacz sekcję definiowanie szablonów (ang. template definition).
-
-Tematy w wersji 3.0 są definiowane jak szablony kotnrolek z kilkoma obwarowaniami.
-
-本教程旨在帮助您快速掌握用PRADO v3.x构建Web应用。
-
-如果您觉得本教程没能满足您的需求,您也可以参考以下资源:
-
-SOAP membentuk lapisan dasar dari tumpukan layanan Web. Ia menyediakan cara yang rapi agar aplikasi PHP saling berkomunikasi atau dengan aplikasi yang ditulis dalam bahasa lain. PRADO menyediakan TSoapService yang membuat pengembagan aplikasi server SOAP menjadi tugas yang sangat mudah.
-
-Untuk menggunakan TSoapService, konfigurasi itu dalam spesifikasi aplikasi seperti berikut:
-
-Contoh menetapkan penyedia layanan SOAP bernama stockquote yang mengimplementasikan metode SOAP getPrice dalam kelas penyedia StockQuote,
-
-Dengan kode sederhana di atas, kita sudah menyelesaikan layanan SOAP sederhana yang membolehkan aplikasi lain untuk meng-query harga dari stok tertentu. Sebagai contoh, umumnya klien SOAP bisa ditulis seperti berikut guna mendapatkan harga stok atas IBM,
-
-Perhatikan URL yang digunakan untuk membentuk SoapClient (kelas disediakan oleh ekstensi SOAP PHP). Ini adalah URL untuk WSDL yang menjelaskan protokol komunikasi untuk layanan SOAP yang baru kita implementasikan. WSDL sering kali terlalu rumit untuk ditulis secara manual. Kebetulan, TSoapService bisa membuat ini bagi kita menggunakan generator WSDL. Secara umum, URL untuk membuat WSDL secara otomatis dalam PRADO mempunyai format berikut:
-
-Agar generator WSDL membuat WSDL untuk layanan SOAP, kelas penyedia perlu untuk mengikuti sintaks tertentu. Dalam keadaan tertentu, untuk metode yang akan diperlihatkan sebagai metode SOAP, kata kunci @soapmethod harus muncul dalam komentar phpdoc terhadap metode dengan baris berikut yang menetapkan parameter metode dan nilai hasil:
-
-Parameter yang benar dan tipe hasil termasuk: string, int, boolean, float, array, mixed, dll. Anda dapat juga menetapkan nama kelas sebagai tipe, yang menterjemahkan ke dalam tipe SOAP kompleks. Sebagai contoh, untuk tipe kompleks Contact
- Untuk obyek soap kompleks, properti obyek ditetapkan dengan kata kunci @soapproperty dalam phpdocs. Selanjutnya, nama tipe properti harus ditetapkan sebagai @var type $name di mana type adalah tipe apapun yang benar seperti telah disebutkan sebelumnya dan $name akan mendefinisikan properti name (catatan bahwa jika kelas Anda adalah TComponent, Anda bisa menyediakan properti pengambil/penentu).
-
-Sebuah array dari obyek yang kompleks juga bisa dihasilkan dengan menambahkan pasangan yang dilindungi kurung kotak setelah nama tipe. Sebagai contoh, untuk menghasilkan array dari tipe Contact, kita mendefinisikan @return Contact[] ....
- Piranti semacam itu tersedia untuk Mac OS X Tiger dari
-http://www.ditchnet.org/soapclient/
-
-TSoapService bisa dikonfigurasi dan dikustomisasi dalam beberapa cara. Dalam contoh di atas, elemen <soap> sebenarnya menetapkan sebuah layanan SOAP menggunakan implementasi standar TSoapServer. Atribut dalam <soap> dikirimkan ke TSoapServer sebagai nilai properti awalnya. Sebagai contoh, atribut provider menginisialisasi properti Provider dari TSoapServer. Dengan menyetel SessionPersistent menjadi true dalam elemen <soap>, turunan penyedia akan sama di dalam sesi pengguna. Anda bisa mengembangkan kelas server SOAP sendiri dan menggunakannya dengan menetapkan atribut class dari <soap>.
- Standarnya, server SOAP PHP akan membuat obyek dari tipe StdClass ketika obyek diterima dari klien. Server soap bisa dikonfigurasi untuk secara otomatis membuat obyek dari obyek tipe tertentu diterima sebagai parameter metode. Sebagai contoh, jika kita mempunyai sebuah metode Soap yang menerima obyek Contact sebagai parameter.
- To install Prado, simply download the latest version of Prado from
- http://www.pradosoft.com
+ To install Prado, simply download the latest version of Prado from the
+ Prado project website
and unzip the file to a directory not accessible by your web server
(you may unzip it to a directory accessible by the web server if you wish
to see the demos and test). For further detailed installation, see the
diff --git a/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page b/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page
deleted file mode 100755
index 568e920f..00000000
--- a/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page
+++ /dev/null
@@ -1,755 +0,0 @@
- This tutorial introduces the Prado web application framework's
- ActiveRecord
- and Active Controls to build a Chat
- web application. It is assumed that you
- are familiar with PHP and you have access to a web server that is able to serve PHP5 scripts.
- This basic chat application will utilize the following ideas/components in Prado.
- In this tutorial you will build an AJAX Chat web application that allows
- multiple users to communicate through their web browser.
- The application consists of two pages: a login page
- that asks the user to enter their nickname and the main application chat
- page.
- You can try the application locally or at
- Pradosoft.com.
- The main application chat page is shown bellow.
- class="figure" />
- The download and installation steps are similar to those in
- the Currency converter tutorial.
- To create the application, we run from the command line the following.
- See the Command Line Tool
- for more details.
- The above command creates the necessary directory structure and minimal
- files (including "index.php" and "Home.page") to run a Prado web application.
- Now you can point your browser's URL to the web server to serve up
- the index.php script in the chat directory.
- You should see the message "Welcome to Prado!"
- The first task for this application is to ensure that each user
- of the chat application is assigned with a unique (chosen by the user)
- username. To achieve this, we can secure the main chat application
- page to deny access to anonymous users. First, let us create the Login
- page with the following code. We save the Login.php and Login.page
- in the chat/protected/pages/ directory (there should be a Home.page
- file created by the command line tool).
- The login page contains
- a Now we wish that if the user is trying to access the main application
-page, Home.page, before they have logged in, the user is presented with
-the Login.page first. We add a chat/protected/application.xml configuration
-file to import some classes that we shall use later.
- If you now try to access the Home page by pointing your browser
-to the index.php you will be redirected to the Login page.
- The To implement a custom user manager module class we just need
-to extends the TModule class and implement the IUserManager
-interface. The getGuestName(), getUser() and validateUser()
-methods are required by the IUserManager interface.
-We save the custom user manager class as App_Code/ChatUserManager.php.
-
-The getGuestName()
-method simply returns the name for a guest user and is not used in our application.
-The getUser() method returns a TUser object if the username
-exists in the database, the TUser object is set with role of "normal"
-that corresponds to the <authorization> rules defined in our
-config.xml file. The addNewUser() and usernameExists()
-method uses the ActiveRecord corresponding to the chat_users table to
-add a new user and to check if a username already exists, respectively.
- The next thing to do is change the config.xml configuration to use
-our new custom user manager class. We simply change the <module>
-configuration with id="users". To perform authentication, we just want the user to enter a unique
-username. We add a
-
-In the createNewUser method, when the validation passes (that is,
-when the user name is not taken) we add a new user. Afterward we perform
-a manual login process:
-Finally, we redirect the client to the default Home page.
- If you try to perform a login now, you will receive an error message like
-"Property 'ChatUserRecord::$last_activity' must not be null as defined
-by column 'last_activity' in table 'chat_users'.". This means that the $last_activity
-property value was null when we tried to insert a new record. We need to either
-define a default value in the corresponding column in the table and allow null values or set the default
-value in the ChatUserRecord class. We shall demonstrate the later by
-altering the ChatUserRecord with the addition of a set getter/setter
-methods for the last_activity property.
-
- Now we are ready to build the main chat application. We use a simple
-layout that consist of one panel holding the chat messages, one panel
-to hold the users list, a textarea for the user to enter the text message
-and a button to send the message.
- We should have some fun before we proceeding with setting up the chat buffering. We want
-to see how we can update the current page when we receive a message. First, we add
-an OnClick event handler for the Send button.
-
- To append or add some content to the message list panel, we need to use
-some methods in the
- To send a message to all the connected users we need to buffer or store
-the message for each user. We can use the database to buffer the messages. The
-chat_buffer table is defined as follows.
- We finally arrive at the guts of the chat application logic. First, we
-need to save a received message into the chat buffer for all the
-current users. We add this logic in the ChatBufferRecord class.
-
- The next piece of the logic is to retrieve the users' messages from the buffer.
-We simply load all the messages for a particular username and format that message
-appropriately (remember to escape the output to prevent Cross-Site Scripting attacks).
-After we load the messages, we delete those loaded messages and any older
-messages that may have been left in the buffer.
- Now comes to put the application flow together. In the Home.php we update
-the Send buttons OnClick event handler to use the application
-logic we just implemented.
- At this point the application is actually already functional, just not very
-user friendly. If you open two different browsers, you should be able to communicate
-between the two users whenever the Send button is clicked.
- The next part is perhaps the more tricker and fiddly than the other tasks. We
-need to improve the user experience. First, we want a list of current users
-as well. So we add the following method to Home.php, we can call
-this method when ever some callback event is raised, e.g. when the Send
-button is clicked.
- Actually, we want to periodically update the messages and user list as new
-users join in and new message may arrive from other users. So we need to refresh
-the message list as well. Next, we need to redirect the user back to the login page if the user has
-been inactive for some time, say about 5 mins, we can add this check to any stage
-of the page life-cycle. Lets add it to the onLoad() stage.
- The last few details are to periodically check for new messages and
-refresh the user list. We can accomplish this by polling the server using a
- The final piece requires us to use some javascript. We want that when the
-user type some text in the textarea and press the Enter key, we want it
-to send the message without clicking on the Send button. We add to the
-Home.page some javascript.
-
- This completes the tutorial on making a basic chat web application using
-the Prado framework. Hope you have enjoyed it.
- This tutorial introduces the Prado web application framework and teaches
- you how to build a simple web application in a few simple steps. This
- tutorial assumes that you are familiar with PHP and you have access
- to a web server that is able to serve PHP5 scripts.
- In this tutorial you will build a simple web application that converts
- a dollar amount to an other currency, given the rate of that currency
- relative to the dollar. The completed application is shown bellow.
- class="figure" />
- You can try the application locally or at
- Pradosoft.com.
- Notice that the application still functions exactly the same if javascript
- is not available on the user's browser.
- To install Prado, simply download the latest version of Prado from
- http://www.pradosoft.com
- and unzip the file to a directory not accessible by your web server
- (you may unzip it to a directory accessible by the web server if you wish
- to see the demos and test). For further detailed installation, see the
- Quickstart Installation guide.
- The quickest and simplest way to create a new Prado web application is
- to use the command tool prado-cli.php found in the framework
- directory of the Prado distribution. We create a new application by running
- the following command in your
- command prompt or console. The command creates a new directory named
- currency-converter in your current working directory.
- You may need to change to the appropriate directory
- first.
- See the Command Line Tool
- for more details.
- The above command creates the necessary directory structure and minimal
- files (including "index.php" and "Home.page") to run a Prado web application.
- Now you can point your browser's url to the web server to serve up
- the index.php script in the currency-converter directory.
- You should see the message "Welcome to Prado!"
- We start by editing the Home.page file found in the
- currency-converter/protected/pages/ directory. Files ending
- with ".page" are page templates that contains HTML and Prado controls.
- We simply add two textboxes, three labels and one button as follows.
-
- If you refresh the page, you should see something similar to the following figure.
- It may not look very pretty or orderly, but we shall change that later using CSS.
- class="figure" />
-
- The first component we add is a
- The next two pair of component we add is the
- The next pair of components are similar and defines the textbox
- to hold the dollar value to be converted.
- The TLabel with ID value "total" defines a simple label.
- Notice that the ForControl property is absent. This means that this
- label is simply a simple label which we are going to use to display the
- converted total amount.
- The final component is a
- If you tried clicking on the "Convert" button then the page will refresh
- and does not do anything else. For the button to do some work, we need
- to add a "Home.php" to where "Home.page" is. The Home class
- should extends the
-
- Prado uses PHP's __autoload method to load classes. The convention
- is to use the class name with ".php" extension as filename.
- So far there is nothing interesting about Prado, we just declared some
- "web components" in some template file named Home.page and created
- a "Home.php" file with a Home class. The more interesting
- bits are in Prado's event-driven architecture as we shall see next.
- We want that when the user click on the "Convert" button, we take the
- values in the textbox, do some calculation and present the user with
- the converted total. To handle the user clicking of the "Convert" button
- we simply add an OnClick property to the "Convert" button in
- the "Home.page" template and add a corresponding event handler method
- in the "Home.php".
-
- The value of the OnClick, "convert_clicked", will be the method
- name in the "Home.php" that will called when the user clicks on the
- "Convert" button.
-
- If you run the application in your web browser, enter some values and click
- the "Convert" button then you should see that calculated value displayed next
- to the "Amount in Other Currency" label.
- In the "convert_clicked" method the first parameter, $sender,
- corresponds to the object that raised the event, in this case,
- the "Convert" button. The second parameter, $param contains
- any additional data that the $sender object may wish to have added.
- We shall now examine, the three lines that implements the simply currency
- conversion in the "convert_clicked" method.
-
- The statement $this->currencyRate corresponds to the
- TTextBox component with ID value "currencyRate" in the
- "Home.page" template. The Text property of the TTextBox
- contains the value that the user entered. So, we obtain this
- value by $this->currencyRate->Text which we convert the
- value to a float value.
-
- The next line does a similar things, it takes the user value from
- the TTextBox with ID value "dollars and converts it to
- a float value.
- The third line calculates the new amount and set this value in the
- Text property of the TLabel with ID="total".
- Thus, we display the new amount to the user in the label.
- The way we convert the user entered value to float ensures that the
- total amount is always a number. So the user is free to enter what
- ever they like, they could even enter letters. The user's experience
- in using the application can be improved by adding validators
- to inform the user of the allowed values in the currency rate and the
- amount to be calcuated.
- For the currency rate, we should ensure that
- To ensure 1 we add one
- For the amount to be calculated, we should ensure that
- To ensure 1 we just add another TRequiredFieldValidator, for 2
- we could use a
- Now if you try to enter some invalid data in the application or left out
- any of the fields the validators will be activated and present the user
- with error messages. Notice that the error messages are presented
- without reloading the page. Prado's validators by default validates
- using both javascript and server side. The server side validation
- is always performed. For the server side, we
- should skip the calculation if the validators are not satisfied. This can
- done as follows.
- In this simple application we may further improve the user experience
- by increasing the responsiveness of the application. One way to achieve
- a faster response is calculate and present the results without reloading
- the whole page.
- We can replace the TButton with the Active Control counter part,
-
- The server side logic remains the same, we just need to import the
- Active Controls name space as they are not included by default. We
- add the following line to the begin of "Home.php".
- If you try the application now, you may notice that the page no longer
- needs to reload to calculate and display the converted total amount.
- However, since there is not page reload, there is no indication or not obvious
- that by clicking on the "Convert" button any has happened.
- We can further refine the user experience by change the text of "total" label
- to "calculating..." when the user clicks on the "Convert" button. The text of
- the "total" label will still be updated with the new calculate amount as before.
- To indicate that the calculation is in progress, we can change the text
- of the "total" label as follows. We add a ClientSide.OnLoading property
- to the "Convert" button (since this button is responsible for requesting
- the calculation).
- The ClientSide.OnLoading and various
- So far we have built a simple currency converter web application with
- little attention of the looks and feel. Now we can add a stylesheet
- to improve the overall appearance of the application. We can simply
- add the stylesheet inline with the template code or we may create
- a "theme".
- To create and use a theme with Prado applications, we simply create a new
- directory "themes/Basic" in the currency-converter directory.
- You may need to create the themes directory first. Any
- directory within the themes are considered as a theme with the
- name of the theme being the directory name. See the
- Themes and Skins for further details.
- We simply create a CSS file named "common.css" and save it in the
- themes/Basic directory. Then we add the following code
- to the beginning of "Home.page" (we add a little more HTML as well).
-
- The first line <%@ Theme="Basic" %> defines the
- theme to be used for this page. The
- Tutorial ini memperkenalkan dasar penyambungan ke sebuah database
- menggunakan ActiveRecord
- dan menggunakan Kerangka Rekaman Aktif untuk secara cepat membangun sebuah buku alamat sederhana.
- Tutorial ini memperkenalkan kerangka kerja aplikasi web Prado
- ActiveRecord
- dan Kontrol Aktif untuk membangun aplikasi web Chat. Diasumsikan bahwa Anda sudah terbiasa dengan PHP dan akan telah mengakses server web yang dapat melayani naskah PHP5.
- Aplikasi chat dasar ini akan memanfaatkan ide/komponen berikut dalam Prado.
- Dalam tutorial ini Anda akan membangun sebuah aplikasi web Chat AJAX yang membolehkan
- multipel pengguna untuk berkomunikasi melalui web browser mereka.
- Aplikasi terdiri dari dua halaman: halaman masuk yang menanyakan pada
- pengguna untuk memasukkan nama panggilannya dan halaman aplikasi chat utama.
- Anda dapat mencoba aplikasi secara lokal atau di
- Pradosoft.com.
- Aplikasi chat utama ditampilkan di bawah ini.
- class="figure" />
- Langkah download dan instalasi mirip dengan
- Tutorial pengubah kurs.
- Untuk membuat aplikasi, kita menjalankan dari baris perintah berikut.
- Lihat Piranti Baris Perintah
- untuk lebih jelasnya.
- Perintah di atas membuat struktur direktori yang diperlukan dan file minimal (termasuk "index.php" dan "Home.page") untuk menjalankan aplikasi web Prado.
- Sekarang Anda dapat mengarahkan URL browser Anda ke server web untuk melayani
- naskah index.php dalam direktori chat.
- Anda seharusnya melihat pesan "Welcome to Prado!"
- Tugas pertama untuk aplikasi ini adalah memastikan bahwa setiap pengguna
- dari aplikasi chat memiliki nama pengguna (dipilih oleh pengguna)
- unik. Untuk melaksanakan ini, kita akan mengamankan halaman aplikasi chat utama
- untuk menolak akses bagai pengguna anonim. Pertama, mari kita membuat halaman Login
- dengan kode berikut. Kita simpan Login.php dan Login.page
- dalam direktori chat/protected/pages/ (di sana harus ada file Home.page
- yang dibuat oleh piranti baris perintah).
- Halaman login berisi
- a Sekarang kita menginginkan bahwa jika pengguna mencoba untuk mengakses halaman aplikasi utama, Home.page, sebelum masuk, pengguna diberi Login.page lebih dulu. Kita menambahkan file konfigurasi chat/protected/application.xml untuk mengimpor beberapa kelas yang harus kita pakai nanti.
- Jika Anda mencoba untuk mengakses halaman Home dengan mengarahkan browser Anda ke
-index.php Anda akan dialihkan ke halaman Login.
- Kelas Untuk menerapkan modul kelas kustom manajer pengguna kita cukup memperluas kelas TModule dan menerapkan antarmuka IUserManager. Metode getGuestName(), getUser() dan validateUser() diperlukan oleh antarmuka IUserManager.
-Kita menyimpan kelas manajer pengguna kustom sebagai App_Code/ChatUserManager.php.
-
-Metode getGuestName()
-mengembalikan nama untuk pengguna tamu dan tidak dipakai dalam aplikasi kita.
-Metode getUser() mengembalikan obyek TUser jika nama pengguna ada dalam database, obyek TUser disetel dengan aturan "normal"
-yang terkait ke aturan <otorisasi> yang didefinisikan dalam file
-config.xml kita. Metode addNewUser() dan usernameExists()
-menggunakan ActiveRecord terkait dengan tabel chat_users masing-masing untuk menambah pengguna baru dan untuk memeriksa apakah nama pengguna sudah ada atau belum.
- Hal berikutnya yang dilakukan adalah mengubah konfigurasi config.xml untuk menggunakan kelas manajer pengguna kustom baru kita. Kita cukup mengubah konfigurasi <module>
-dengan id="users". Untuk melakukan otentikasi, kita menginginkan pengguna untuk memasukkan nama pengguna unik. Kita menambahkan
-
-Dalam metode createNewUser, Ketika validasi lulus (yaitu ketika nama pengguna belum dipakai) kita menambahkan pengguna baru. Setelah itu kita melakukan proses login secara manual:
-Akhirnya, kita mengalihkan klien ke halaman standar Home.
- Jika Anda mencoba untuk melakukan login sekarang, Anda akan menerima pesan kesalahan seperti
-"Property 'ChatUserRecord::$last_activity' must not be null as defined
-by column 'last_activity' in table 'chat_users'.". Ini berarti bahwa nilai properti $last_activity adalah null dalam kolom terkait pada tabel dan memboleh nilai null atau menetapkan nilai standar dalam kelas ChatUserRecord. Kita akan mendemonstrasikannya nanti dengan mengubah ChatUserRecord dengan tambahan dari metode setelan pengambil/pengetap untuk properti last_activity.
-
- Sekarang kita siap untuk membangun aplikasi chat utama. Kita menggunakan tata letak sederhana yang terdiri dari satu panel yang menampung pesan chat, satu panel untuk menampung daftar pengguna, area teks untuk pengguna memasukan pesan teks dan tombol untuk mengirimkan pesan.
- Kita sudah mempunyai beberapa kesenangan sebelum kita melanjutkan dengan penyiapan bufer chat. Kita ingin melihat bagaimana kita dapat memutakhirkan halaman saat ini ketika kita menerima sebuah pesan. Pertama, kita menambahkan sebuah tombol
-OnClick event handler for the Send.
-
- Untuk menambah atau menambahkan beberapa konten ke panel daftar pesan, kita perlu memakai beberapa metode dalam kelas
- Untuk mengirimkan pesan ke seluruh pengguna yang tersambung kita memerlukan bufer atau menyimpan pesan untuk setiap pengguna. Kita dapat menggunakan database untuk membufer pesan. Tabel
-chat_buffer didefinisikan sebagai berikut.
- Akhirnya kita tiba di kanal logika aplikasi chat. Pertama, kita perlu menyimpan pesan yang diterima ke dalam bufer chat untuk semua pengguna saat ini. Kita menambahkan logika ini dalam kelas ChatBufferRecord.
-
- Logika berikutnya adalah untuk mengambil pesan pengguna dari bufer.
-Kita cukup mengambil semua pesan untuk nama pengguna tertentu dan membentuk pesan itu secar benar (ingat untuk meng-escape output guna menghindari serangan Penaskahan Situs-Silang).
-Setelah kita ambil pesan, kita hapus pesan yang diambil dan pesan lainnya yang lebih lama yang mungkin tertinggal dalam bufer.
- Sekarang waktunya untuk menyatukan alur aplikasi secara keseluruhan. Dalam Home.php kita memutakhirkan tombol Send pengendali event OnClick untuk menggunakan logika aplikasi yang baru saja kita implementasikan.
- Pada titik ini aplikasi sebenarnya sudah berfungsi, cuma tidak bersahabat. Jika Anda membuka dua browser berbeda, Anda seharusnya bisa berkomunikasi diantara dua pengguna kapan saja tombol Send diklik.
- Bagian berikutnya barangkali lebih rumit dan mengakali daripada tugas lainnya. Kita perlu untuk meningkatkan pengalaman pengguna. Pertama, kita menginginkan daftar pengguna saat ini juga. Maka kita menambahkan metode berikut ke Home.php, kita dapat memanggil metode ini kapan saja beberapa event callback dimunculkan, misalnya saat tombol Send diklik.
- Sebenarnya, kita menginginkan untuk secara
-periodik memutakhirkan pesan dan daftar pengguna saat pengguna baru bergabung
-dan pesan baru yang datang dari pengguna lainnya. Maka kita perlu untuk menyegarkan
-daftar pesan juga. Selanjutnya, kita perlu mengalihkan pengguna
-kembali ke halaman login jika pengguna tidak aktif untuk beberapa waktum
-katakanlah 5 menit, kita menambahkan pemeriksaan ini ke setiap tahap dari masa hidup
-halaman. Mari menambahkannya ke tahapan onLoad().
- Beberapa rincian terakhir secara periodeik memeriksa
-pesan baru dan menyegarkan daftar pengguna. Kita bisa melakukan ini dengan menanyakan
-server menggunakan kontrol
- Langkah terakhir memerlukan kita untuk menggunakan beberapa javascript. Kita menginginkan bahwa saat pengguna mengetikan beberapa teks dalam area teks dan menekan tombol Enter, kita menginginkannya untuk mengirimkan pesan tanpa mengklik tombol Send. Kita menambahkan beberapa javascript ke
-Home.page.
-
- Ini melengkapi tutorial untuk membuat aplikasi chat web menggunakan kerangka kerja Prado. Diharapkan Anda menikmatinya.
- Tutorial ini memperkenalkan kerangka kerja aplikasi web Prado dan mengajarkan Anda bagaimana untuk
- membangun aplikasi web sederhana dalam beberapa langkah sederhana. Tutorial
- ini menganggap bahwa Anda terbiasa dengan PHP dan Anda telah mengakses
- server web yang dapat melayani naskah PHP5.
- Dalam tutorial ini Anda akan membangun aplikasi web sederhana yang mengubah
- nilai dolar ke kurs lain, nilai kurs yang disediakan untuk kurs tersebut relatif terhadap dolar. Aplikasi lengkap ditampilkan di bawah ini.
- class="figure" />
- Anda dapat mencoba aplikasi secara lokal atau di
- Pradosoft.com.
- Catatan bahwa aplikasi masih berfungsi sama persis apabila javascript tidak tersedia pada browser pengguna.
- Untuk menginstalasi Prado, cukup download versi terbaru Prado dari
- http://www.pradosoft.com
- dan uraikan file ke sebuah direktori yang tidak dapat diakses oleh server web Anda (Anda dapat menguraikannya ke sebuah direktori yang dapat diakses oleh server web jika Anda ingin melihat demo dan pengujian). Untuk instalasi lebih rinci, lihat bimbingan
- Instalasi Cepat.
- Cara tercepat dan termudah untuk membuat aplikasi web Prado baru adalah menggunakan piranti perintah prado-cli.php yang ditemukan dalam direktori framework
- pada distribusi Prado. Kita membuat aplikasi baru dengan menjalankan perintah berikut dalam prompt perintah atau konsol Anda. Perintah membuat direktori baru bernama currency-converter dalam direktori kerja Anda saat ini.
- Anda perlu mengubahnya ke direktori yang benar terlebih dahulu.
- Lihat Piranti Baris Perintah
- untuk lebih jelasnya.
- Perintah di atas membuat struktur direktori yang diperlukan dan file minimal (termasuk "index.php" dan "Home.page") untuk menjalankan aplikasi Prado.
- Sekarang Anda dapat mengarahkan url browser Anda ke server web untuk melayani naskah index.php dalam direktori currency-converter.
- Seharusnya Anda melihat pesan "Welcome to Prado!"
- Kita mulai dengan mengedit file Home.page yang ditemukan dalam direktori currency-converter/protected/pages/. File yang berakhiran dengan ".page" adalah template halaman yang berisi HTML dan kontrol Prado.
- Kita cukup menambah dua kotak teks, tiga label dan satu tombol seperti berikut.
-
- Jika Anda menyegarkan halaman, Anda akan melihat sesuatu mirip dengan gambar berikut.
- Ia mungkin terlihat tidak cukup bagus atau berurut, tapi kita akan mengubahnya nanti dengan menggunakan CSS.
- class="figure" />
-
- Komponen pertama yang kita tambahkan adalah
- Dua pasang komponen berikutnya yang kita tambahkan adalah
- Pasangan komponen berikutnya adalah sama dan mendefinisikan
- kotak teks guna menampung nilai dolar yang akan dikonversi.
- TLabel dengan nilai ID "total" mendefinisikan label sederhana.
- Catatan bahwa properti ForControl tidak ada. Ini berarti bahwa label ini
- merupakan sebuah label yang akan dipakai untuk menampilkan jumlah total yang dikonversi.
- Komponen terakhir adalah
- Jika Anda mencoba mengklik pada tombol "Convert" kemudian halaman akan menyegarkan
- dan tidak melakukan apapun. Agar tombol melakukan beberapa pekerjaan, kita perlu
- menambahkan "Home.php" ke di mana "Home.page" berada. Kelas Home harus
- memperluas
- Prado menggunakan metode PHP __autoload untuk mengambil kelas. Konvensi
- adalah untuk menggunakan nama kelas dengan ekstensi ".php" sebagai nama file.
- Sejauh ini tidak ada hal menarik mengenai Prado, kita hanya mendeklarasikan beberapa
- "komponen web" dalam beberapa file template bernama Home.page dan membuat
- sebuah file "Home.php" dengan kelas Home. Sedikit yang lebih menarik adalah
- arsitektur kendali-event Prado seperti yang akan kita lihat nanti.
- Kita menginginkan bahwa saat pengguna mengklik tombol "Convert", kita mengambil
- nilai dalam kotak teks, melakukan beberapa perhitungan dan menyajikan kepada pengguna dengan
- total nilai yang dikonversi. Untuk menangani pengguna mengklik pada tombo "Convert",
- kita cukup menambahkan sebuah properti OnClick ke tombol "Convert" dalam
- template "Home.page" dan menambahkan metode pengendali event terkait dalam "Home.php".
-
- Nilai dari OnClick, "convert_clicked", akan menjadi nama metode
- dalam "Home.php" yang akan dipanggil saat pengguna mengklik tombol "Convert".
-
- Jika Anda menjalankan aplikasi dalam web browser Anda, masukkan beberapa nilai
- dan klik tombol "Convert" kemudian Anda akan melihat nilai yang dihitung ditampilkan
- di dekat label "Amount in Other Currency".
- Dalam metode "convert_clicked" parameter pertama, $sender,
- berhubungan dengan obyek yang memunculkan event, dalam hal ini, tombol
- "Convert". Parameter kedua, $param berisi data tambahan lain
- di mana obyek $sender yang ingin ditambahkan.
- Sekarang kita akan memeriksa, tiga baris yang mengimplementasikan konversi
- kurs sederhana dalam metode "convert_clicked".
-
- Pernyataan $this->currencyRate berhubungan dengan komponen
- TTextBox dengan nilai ID "currencyRate" dalam template
- "Home.page". Properti Text dari TTextBox berisi
- nilai yang dimasukan oleh pengguna. Maka kita memperoleh nilai ini dengan
- $this->currencyRate->Text yang kita konversi nilainya ke nilai
- pecahan.
-
- Baris berikutnya melakukan hal yang mirip, ia mengambil nilai pengguna
- dari TTextBox dengan nilai ID "dollars dang mengubahnya
- ke nilai pecahan.
- Baris ketiga menghitung jumlah baru dan menyetel nilai ini dalam properti
- Text dari TLabel dengan ID="total".
- Selanjutnya, kita tampilkan jumlah baru ke pengguna dalam label.
- Cara kita mengubah nilai yang dimasukan oleh pengguna ke pecahan memastikan bahwa jumlah total selalu sebuah angka. Maka pengguna bebas untuk memasukan apapun yang mereka sukai, bahkan mereka dapat memasukan huruf. Pengalaman pengguna dalam pemakaian aplikasi dapat ditingkatkan dengan menambahkan validator untuk memberitahu pengguna atas nilai yang dibolehkan dalam kurs mata uang dan jumlah yang akan dihitung.
- Untuk kurs mata uang, kita harus memastikan bahwa
- Untuk memastikan poin 1 kita menambahkan satu
- Untuk jumlah yang dihitung, kita harus memastikan bahwa
- Untuk memastikan 1 kita cukup menambahkan TRequiredFieldValidator lainnya, untuk 2
- kita dapat menggunakan
- Sekarang jika Anda mencoba memasukan beberapa data tidak benar dalam aplikasi atau membiarkan field kosong
- validators akan diaktifkan dan menyajikan pesan kesalahan kepada pengguna. Catatan bahwa pesan kesalahan disajikan tanpa mengambil ulang halaman. Validator Prado standarnya memvalidasi javascript dan di dalam server. Validasi di dalam server selalu dilakukan. Untuk sisi server, kita harus melewati perhitungan jika validator tidak memuaskan. Ini dapat dilakukan seperti berikut.
- Dalam aplikasi sederhana selanjutnya kita dapat
-memperbaiki pengalaman pengguna dengan meningkatkan tanggapan aplikasi. Satu cara untuk mencapai respon tercepat adalah menghitung dan menyajikan hasil tanpa mengambil ulang seluruh halaman.
- Kita dapat mengganti TButton dengan pasangan Kontrol Aktif,
-
- Logika di dalam server tetap sama, kita hanya perlu mengimpor
- ruang nama Kontrol Aktif karena secara standar tidak disertakan. Kita menambahkan baris berikut ke awal "Home.php".
- Jika Anda mencoba aplikasi sekarang, Anda akan melihat bahwa halaman tidak perlu lagi mengambil ulang untuk menghitung dan menampilkan jumlah total yang dikonversi.
- Akan tetapi, karena di sana tidak ada pengambilan halaman ulang, tidak ada petunjuk atau tidak jelas bahwa dengan mengklik pada tombol "Convert" telah terjadi.
- Selanjutnya kita bisa memperbaiki pengalaman pengguna dengan mengunah label teks "total" menjadi "calculating..." saat pengguna mengklik tombol "Convert". Label teks "total" masih dimutakhirkan dengan jumlah perhitungan baru seperti sebelumnya.
- Untuk mengindikasikan bahwa perhitungan sedang berlangsung, kita dapat mengubah label teks "total" sebagai berikut. Kita menambahkan properti ClientSide.OnLoading ke tombol "Convert" (karena tombol ini bertanggung jawab terhadap permintaan perhitungan).
- ClientSide.OnLoading dan berbagai
- Sejauh ini kita telah membangun aplikasi web pengubah kurs sederhana dengan sedikit perhatian terhadap penampilannya. Sekarang kita dapat menambahkan stylesheet guna meningkatkan penampilan secara keseluruhan aplikasi. Kita cukup menambahkan inline stylesheet dengan kode template atau kita membuat sebuah "tema".
- Untuk membuat dan menggunakan tema dengan aplikasi Prado, kita membuat direktori baru "themes/Basic" dalam direktori currency-converter.
- Anda mungkin perlu untuk membuat direktori themes lebih dahulu. Direktori apapun di dalam themes dianggap sebagai tema dengan nama temanya adalah nama direktori. Lihat
- Tema dan Skin untuk lebih jelasnya.
- Kita cukup dengan membuat file CSS bernama "common.css" dan menyimpannya dalam direktori
- themes/Basic. Kemudian kita menambahkan kode berikut ke awal "Home.page" (kita menambahkan sedikit kode HTML juga).
-
- Baris pertama <%@ Theme="Basic" %> mendefinisikan tema
- yang dipakai untuk halaman ini.
- <%# $this->Page->HighlightSearch($this->DataItem->text) %>
-Copyright 2004-<%= date('Y') %> by The PRADO Group (http://www.pradosoft.com)
diff --git a/demos/sqlmap/protected/pages/Manual/Installing.page b/demos/sqlmap/protected/pages/Manual/Installing.page
index bb083996..65288f22 100755
--- a/demos/sqlmap/protected/pages/Manual/Installing.page
+++ b/demos/sqlmap/protected/pages/Manual/Installing.page
@@ -14,7 +14,7 @@ first time. The official site for SQLMap PHP DataMapper is http://www.pradosoft.com.
+ The official site for SQLMap PHP DataMapper is https://github.com/pradosoft/prado.
The DataMapper
is availabe as a source distribution in the form of a ZIP archive. To download
the distributions, follow the link to the Downloads area on the web site, and
@@ -29,20 +29,20 @@ built into newer versions of Windows. As expected, the SqlMap.config file should be (by default) placed where the DataMapper
can find them at runtime.Web Site Administration Tool
+ Web Site Administration Tool
Requirements
+ Requirements
Usage
+ Usage
Active Record classes generation
+ Active Record classes generation
<%= Prado::poweredByPrado() %>
diff --git a/demos/blog-tutorial/protected/layout/fr/MainLayout.tpl b/demos/blog-tutorial/protected/layout/fr/MainLayout.tpl
deleted file mode 100755
index 31464213..00000000
--- a/demos/blog-tutorial/protected/layout/fr/MainLayout.tpl
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Creating Contact Page
@@ -35,7 +35,7 @@ We first create the template file for the Contact page.
-
Initial Setup
Application Configuration
Homepage
The pages Directory
Sharing Common Layout
-
Création de la page Contact
-
-
-
-Création de la page gabarit
-
-Contact
-
-<com:TTextBox ID="Name" />
-
-
-Votre email:
-<com:TRequiredFieldValidator ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator ControlToValidate="Email"
- ErrorMessage="Vous avez saisi un email invalide."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-
-Commentaires:
-<com:TRequiredFieldValidator ControlToValidate="Feedback"
- ErrorMessage="Veuillez saisir un commentaire."
- Display="Dynamic" />
-
-<com:TTextBox ID="Feedback"
- TextMode="MultiLine"
- Rows="10"
- Columns="40" />
-
-
-<com:TButton Text="Envoyer" OnClick="submitButtonClicked" />
-
-</com:TForm>
-
-
-
-
-<com:TTextBox ID="Email" />
-
-
-
-
-Création du fichier de classe PHP
-
-Test
-
-Installation
-
-Les fichiers initiaux
-
-Le script principal de l'application
-
-Le fichier de configuration de l'application
-La page d'accueil
-
-Welcome to PRADO!
-
-
-Les dossiers initiaux
-
-Le dossier protected
-
-Les dossiers protected/runtime et assets
-
-Le dossier pages
-
-Personnalisation
-
-Partager les modèles de gabarit
-
-Création du gabarit principal
-
-Mon blog PRADO
-
-
-
-
-Utilisation du gabarit principal
-Contact
-Autres possibilités pour spécifier le gabarit principal
-
-Membuat Halaman Kontak
-
-
-
-Membuat Template Halaman
-
-Contact
-
-<com:TTextBox ID="Name" />
-
-
-Your Email:
-<com:TRequiredFieldValidator ControlToValidate="Email"
- ErrorMessage="Please provide your email address."
- Display="Dynamic" />
-<com:TEmailAddressValidator ControlToValidate="Email"
- ErrorMessage="You entered an invalid email address."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-
-Feedback:
-<com:TRequiredFieldValidator ControlToValidate="Feedback"
- ErrorMessage="Please provide your feedback."
- Display="Dynamic" />
-
-<com:TTextBox ID="Feedback"
- TextMode="MultiLine"
- Rows="10"
- Columns="40" />
-
-
-<com:TButton Text="Submit" OnClick="submitButtonClicked" />
-
-</com:TForm>
-
-
-
-
-<com:TTextBox ID="Email" />
-
-
-
-
-Membuat Kelas Halaman
-
-Pengujian
-
-Persiapan Awal
-
-File Awal
-
-Naskah Entri
-
-Konfigurasi Aplikasi
-Homepage
-
-Welcome to PRADO!
-
-
-Direktori Awal
-
-Direktori protected
-
-Direktori protected/runtime dan assets
-
-Direktori pages
-
-Kustomisasi
-
-Berbagi Tata Letak Umum
-
-Membuat Kontrol Master
-
-My PRADO Blog
-
-
-
-Menggunakan Kontrol Master
-Contact
-Cara Alternatif Menetapkan Master
-
-Creating Active Record Classes
Creating Database
Connexion à la base
-
-
-Création des classes Active Record
-
-Relations entre Posts et Users
-Création de la base
-<
-Melakukan Koneksi DB
-
-Membuat Kelas Rekaman Aktif
-
-Hubungan Antara Tulisan dan Pengguna
-Membuat Database
-
-Authentication and Authorization
Creating Page Template
-
-
@@ -184,7 +184,7 @@ class EditUser extends TPage
Adding Permission Check
diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page
index 66d7dc80..d3a48e44 100755
--- a/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page
+++ b/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page
@@ -23,7 +23,7 @@ We create two files protected/pages/users/LoginUser.page and protec
Creating Page Template
Adding Permission Check
Authentification et Autorisation
-
-
-Création de la page d'administration des utilisateurs AdminUser
-
-
-
-
-Création du gabarit
-
-
-
-
-Administration des comptes utilisateurs
-
-Créer un nouvel utilisateur
-
-
-<com:TDataGrid ID="UserGrid"
- DataKeyField="username"
- AutoGenerateColumns="false"
- OnDeleteCommand="deleteButtonClicked">
-
- <com:THyperLinkColumn
- HeaderText="Pseudo"
- DataTextField="username"
- DataNavigateUrlField="username">
- <prop:DataNavigateUrlFormatString>#
- $this->Service->constructUrl('users.EditUser',array('username'=>{0}))
- </prop:DataNavigateUrlFormatString>
- </com:THyperLinkColumn>
-
- <com:TBoundColumn
- HeaderText="Email"
- DataField="email" />
-
- <com:TCheckBoxColumn
- HeaderText="Administrateur"
- DataField="role" />
-
- <com:TButtonColumn
- HeaderText="Commande"
- Text="Supprimer"
- ButtonType="PushButton"
- CommandName="delete" />
-
-</com:TDataGrid>
-
-</com:TContent>
-Création du fichier de classe
-
-
-Test
-
-Création de la page de mise à jour des utilisateurs EditUser
-
-
-
-
-Création du gabarit
-
-
-
-
-Mise à jour utilisateur
-
-Pseudo:
-<com:TLabel ID="Username" />
-
-
-Mot de passe:
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-Confirmation mot de passe:
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Différence entre le mot de passe et la confirmation."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-
-Email:
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="Vous avez indiqué un email invalide."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-<com:TControl Visible="<%= $this->User->IsAdmin %>">
-
-Role:
-
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Utilisateur standard" Value="0" />
- <com:TListItem Text="Administrateur" Value="1" />
-</com:TDropDownList>
-</com:TControl>
-
-
-Prénom:
-
-<com:TTextBox ID="FirstName" />
-
-
-Nom:
-
-<com:TTextBox ID="LastName" />
-
-
-<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
-
-</com:TContent>
-Création du fichier de classe
-
-
-Ajout de la vérification des droits d'accès
-Test
-
-Création de la page LoginUser
-
-
-
-
-Création du gabarit
-
-Connexion
-
-Votre nom:
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Veuillez indiquer votre nom."
- Display="Dynamic" />
-
-<com:TTextBox ID="Username" />
-
-
-Mot de passe:
-<com:TCustomValidator
- ControlToValidate="Password"
- ErrorMessage="vous avez saisi un mot de passe invalide."
- Display="Dynamic"
- OnServerValidate="validateUser" />
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-<com:TButton Text="Envoyer" OnClick="loginButtonClicked" />
-
-</com:TContent>
-Création de la classe
-
-Test
-
-Ajout des liens de connexion/déconnexion à notre gabarit principal
-
-<%= PRADO::poweredByPrado() %>
-Création de la page nouvel utilisateur NewUser
-
-
-
-
-Création du gabarit
-Création nouvel utilisateur
-
-Pseudo:
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Veuillez indiquer un pseudo."
- Display="Dynamic" />
-<com:TCustomValidator
- ControlToValidate="Username"
- ErrorMessage="Désolé, le pseudo choisi est déjà utilisé. Veuillez en saisir un autre."
- OnServerValidate="checkUsername"
- Display="Dynamic" />
-
-<com:TTextBox ID="Username" />
-
-
-Mot de passe:
-<com:TRequiredFieldValidator
- ControlToValidate="Password"
- ErrorMessage="Veuillez indiquer un mot de passe."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-Confirmation mot de passe:
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Différence entre le mot de passe et la confirmation."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-
-Email:
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="Vous avez indiqué un mot de passe invalide."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-
-Rôle:
-
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Utilisateur standard" Value="0" />
- <com:TListItem Text="Administrateur" Value="1" />
-</com:TDropDownList>
-
-
-Prénom:
-
-<com:TTextBox ID="FirstName" />
-
-
-Nom:
-
-<com:TTextBox ID="LastName" />
-
-
-<com:TButton Text="Ajouter" OnClick="createButtonClicked" />
-
-</com:TContent>
-Création du fichier de classe
-
-Test
-Ajout de la vérification des droits d'accès
-Vue d'ensemble de la gestion des utilisateurs
-
-
-
-
-
-
-Otentikasi dan Otorisasi
-
-Membuat Halaman AdminUser
-
-
-
-
-Membuat Template Halaman
-
-
-
-Manage User Accounts
-
-Create New User
-
-
-<com:TDataGrid ID="UserGrid"
- DataKeyField="username"
- AutoGenerateColumns="false"
- OnDeleteCommand="deleteButtonClicked">
-
- <com:THyperLinkColumn
- HeaderText="Username"
- DataTextField="username"
- DataNavigateUrlField="username">
- <prop:DataNavigateUrlFormatString>#
- $this->Service->constructUrl('users.EditUser',array('username'=>{0}))
- </prop:DataNavigateUrlFormatString>
- </com:THyperLinkColumn>
-
- <com:TBoundColumn
- HeaderText="Email"
- DataField="email" />
-
- <com:TCheckBoxColumn
- HeaderText="Administrator"
- DataField="role" />
-
- <com:TButtonColumn
- HeaderText="Command"
- Text="Delete"
- ButtonType="PushButton"
- CommandName="delete" />
-
-</com:TDataGrid>
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Pengujian
-Membuat Halaman EditUser
-
-
-
-
-Membuat Template Halaman
-
-
-
-
-Edit User
-
-Username:
-<com:TLabel ID="Username" />
-
-
-Password:
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-Re-type Password:
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Your password entries did not match."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-
-Email Address:
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Please provide your email address."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="You entered an invalid email address."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-<com:TControl Visible="<%= $this->User->IsAdmin %>">
-
-Role:
-
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Normal User" Value="0" />
- <com:TListItem Text="Administrator" Value="1" />
-</com:TDropDownList>
-</com:TControl>
-
-
-First Name:
-
-<com:TTextBox ID="FirstName" />
-
-
-Last Name:
-
-<com:TTextBox ID="LastName" />
-
-
-<com:TButton Text="Save" OnClick="saveButtonClicked" />
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Menambah Pemeriksaan Perijinan
-Pengujian
-Membuat Halaman LoginUser
-
-
-
-
-Membuat Template Halaman
-
-Login
-
-Username:
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Please provide your username."
- Display="Dynamic" />
-
-<com:TTextBox ID="Username" />
-
-
-Password:
-<com:TCustomValidator
- ControlToValidate="Password"
- ErrorMessage="Your entered an invalid password."
- Display="Dynamic"
- OnServerValidate="validateUser" />
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-<com:TButton Text="Login" OnClick="loginButtonClicked" />
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Pengujian
-
-Menambahkan Link Login/Logout ke Master
-
-
-<%= PRADO::poweredByPrado() %>
-Membuat Halaman NewUser
-
-
-
-
-Membuat Template Halaman
-Create New User
-
-Username:
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Please provide a username."
- Display="Dynamic" />
-<com:TCustomValidator
- ControlToValidate="Username"
- ErrorMessage="Sorry, your username is taken by someone else. Please choose another username."
- OnServerValidate="checkUsername"
- Display="Dynamic" />
-
-<com:TTextBox ID="Username" />
-
-
-Password:
-<com:TRequiredFieldValidator
- ControlToValidate="Password"
- ErrorMessage="Please provide a password."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password" TextMode="Password" />
-
-
-Re-type Password:
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Your password entries did not match."
- Display="Dynamic" />
-
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-
-Email Address:
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Please provide your email address."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="You entered an invalid email address."
- Display="Dynamic" />
-
-<com:TTextBox ID="Email" />
-
-
-Role:
-
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Normal User" Value="0" />
- <com:TListItem Text="Administrator" Value="1" />
-</com:TDropDownList>
-
-
-First Name:
-
-<com:TTextBox ID="FirstName" />
-
-
-Last Name:
-
-<com:TTextBox ID="LastName" />
-
-
-<com:TButton Text="Create" OnClick="createButtonClicked" />
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Pengujian
-Menambahkan Pemeriksaan Perijinan
-Tinjauan Manajemen Pengguna
-
-
-
-
-
-
Creating Page Template
Création de la page modification d'un message EditPost
-
-
-Création du gabarit
-Modification message
-
-Titre:
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Veuillez indiquer un titre."
- Display="Dynamic" />
-
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-
-Message:
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Veuillez indiquer le contenu du message."
- Display="Dynamic" />
-
-<com:THtmlArea ID="ContentEdit" />
-
-
-<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
-
-</com:TContent>
-Création du fichier de classe
-
-
-Test
-Création de la page d'affichage des messages ListPost
-
-Création du gabarit
-
-
-Création du fichier de classe
-Création du PostRenderer
-
-Création du gabarit pour PostRenderer
-
-<com:THyperLink Text="<%# $this->Data->title %>"
- NavigateUrl="<%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
-
-
-
-Heure:
-<com:TLiteral Text="<%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
-Création du fichier de classe pour PostRenderer
-
-Test
-Création de la page nouveau message NewPost
-
-Création du gabarit
-Création nouveau message
-
-Titre:
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Veuillez indiquer un titre."
- Display="Dynamic" />
-
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-
-Message:
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Veuillez indiquer le contenu du message."
- Display="Dynamic" />
-
-<com:THtmlArea ID="ContentEdit" />
-
-
-<com:TButton Text="Ajouter" OnClick="createButtonClicked" />
-
-</com:TContent>
-Création du fichier de classe
-Test
-Création de la page détail d'un message ReadPost
-
-Création du gabarit
-
-<com:TLiteral Text="<%= $this->Post->title %>" />
-
-
-<com:TControl Visible="<%= $this->canEdit() %>">
- Modifier |
- <com:TLinkButton Text="Supprimer"
- OnClick="deletePost"
- Attributes.onclick="javascript:if(!confirm('Etes vous sûr ?')) return false;" />
-</com:TControl>
-
-
-Heure:
-<com:TLiteral Text="<%= date('m/d/Y h:m:sa', $this->Post->create_time) %>" />
-Création du fichier de classe
-
-Test
-Vue d'ensemble de la gestion des messages
-
-
-
-
-Membuat Halaman EditPost
-
-Membuat Template Halaman
-Edit Post
-
-Title:
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Please provide a title."
- Display="Dynamic" />
-
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-
-Content:
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Please provide content."
- Display="Dynamic" />
-
-<com:THtmlArea ID="ContentEdit" />
-
-
-<com:TButton Text="Save" OnClick="saveButtonClicked" />
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Pengujian
-Membuat Halaman ListPost
-
-Membuat Template Halaman
-
-
-
-Membuat Kelas Halaman
-
-Membuat PostRenderer
-
-Membuat Template Penyaji
-
-<com:THyperLink Text="<%# $this->Data->title %>"
- NavigateUrl="<%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
-
-
-
-Time:
-<com:TLiteral Text="<%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
-Membuat Kelas Penyaji
-Pengujian
-Membuat Halaman NewPost
-
-Membuat Template Halaman
-Membuat Tulisan Baru
-
-Title:
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Please provide a title."
- Display="Dynamic" />
-
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-
-Content:
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Please provide content."
- Display="Dynamic" />
-
-<com:THtmlArea ID="ContentEdit" />
-
-
-<com:TButton Text="Create" OnClick="createButtonClicked" />
-
-</com:TContent>
-Membuat Kelas Halaman
-
-Pengujian
-Membuat Halaman ReadPost
-
-Membuat Template Halaman
-
-<com:TLiteral Text="<%= $this->Post->title %>" />
-
-
-<com:TControl Visible="<%= $this->canEdit() %>">
- Edit |
- <com:TLinkButton Text="Delete"
- OnClick="deletePost"
- Attributes.onclick="javascript:if(!confirm('Are you sure?')) return false;" />
-</com:TControl>
-
-
-Time:
-<com:TLiteral Text="<%= date('m/d/Y h:m:sa', $this->Post->create_time) %>" />
-Membuat Kelas Halaman
-
-Pengujian
-Tinjauan Manajemen Tulisan
-
-
-
-
-Using Themes and Skins
Creating Theme
@@ -17,7 +17,7 @@ To create a theme named Basic, we create a subdirectory theme/Basic
Gestion et journalisation d'erreur
-
-Personnalisation de la gestion d'erreur
-
-
-
-Mon Blog
-Journalisation des erreurs
-
-Test
-Amélioration des performances
-
-Changer le mode de fonctionnement de l'application
-
-Enabling Caching
-
-Utilisation de pradolite.php
-
-Autres techniques
-
-Résumé
-
-
-
-
-
-Utilisation des Thèmes et des Skins
-
-Création des thèmes
-
-Création de la feuille de style
-
-
Création du fichier de Skin
-
-
Utilisation du thème
-
-Test
-Penanganan Kesalahan dan Pencatatan
-
-Mengkustomisasi Penanganan Kesalahan
-
-
-
-My PRADO Blog
-Mencatat Kesalahan
-
-Pengujian
-Penyesuaian Performansi
-
-Mengubah Mode Aplikasi
-
-Menghidupkan Cache
-
-Menggunakan pradolite.php
-
-Teknik Lain
-
-Ringkasan
-
-
-
-
-Menggunakan Tema dan Skin
-
-Membuat Tema
-
-Membuat File Stylesheet
-
-
Membuat File Skin
-
-
Menggunakan Tema
-
-Pengujian
-Welcome to the PRADO Blog Tutorial
Bienvenue dans ce tutoriel de développement d'un Blog
-
-Buts à atteindre
-Gestion des utilisateurs
-
-
-
-Gestion des messages
-
-
-
-Maintenance de l'outil
-
-
-
-Selamat datang di Tutorial Blog PRADO
-
-Analisis Persyaratan
-
-Manajemen Pengguna
-
-
-
-Manajemen Tulisan
-
-
-
-Pemeliharan Sistem
-
-
-
-
-
+
<%= Prado::poweredByPrado() %>
diff --git a/demos/quickstart/protected/controls/SampleLayout.tpl b/demos/quickstart/protected/controls/SampleLayout.tpl
index ba286f0f..8acc57c0 100755
--- a/demos/quickstart/protected/controls/SampleLayout.tpl
+++ b/demos/quickstart/protected/controls/SampleLayout.tpl
@@ -19,7 +19,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -25,8 +25,8 @@ A text hyperlink with css style:
Welcome to
@@ -55,7 +55,7 @@ A hyerplink with body contents as link text:
TActiveButton
-Diagram Kelas TActiveButton
-Menambah Perilaku Sisi Klien
-
-TActiveCheckBox
-TActiveCustomValidator
-TActiveHyperLink
-TActivePager
-
-
-
-
-
-Kontrol Aktif (kontrol AJAX-dihidupkan)
-Kontrol Aktif Standar
-
-
-
-Kontrol List Aktif
-
-
-
-Kontrol Aktif Diperluas
-
-
-
-
-
-Kemampuan Kontrol Aktif
-
-
-
-
-
- Nama Kontrol
- Memicu Callback
- Kembali ke PostBack
-
-
-
- TActiveButton
-
- Ya
- Ya
-
-
-
- TActiveCheckBox
-
- Ya
- Ya
-
-
-
- TActiveCustomValidator
-
- Ya
- Ya
-
-
-
- TActiveHyperLink
-
- Tidak Ya
-
-
-
- TActiveImage
-
- Tidak Ya
-
-
-
- TActiveImageButton
-
- Ya Ya
-
-
-
- TActiveLabel
-
- Tidak Ya
-
-
-
- TActiveLinkButton
-
- Ya Tidak
-
-
-
- TActivePanel
-
- Tidak Ya
-
-
-
- TActiveRadioButton
-
- Ya Ya
-
-
-
- TActiveTextBox
-
- Ya Ya
-
-
-
-
- TCallbackOptions
-
- Tidak N/A
-
-
-
- TActiveCheckBoxList
-
- Ya Ya
-
-
-
- TActiveDropDownList
-
- Ya Ya
-
-
-
- TActiveListBox
-
- Ya Ya
-
-
-
- TActiveRadioButtonList
-
- Ya Ya
-
-
-
- TAutoComplete
-
- Ya
- Tidak
-
-
-
- TCallback
-
- Ya Tidak
-
-
-
- TEventTriggeredCallback
-
- Ya Tidak
-
-
-
- TInPlaceTextBox
-
- Ya Tidak
-
-
-
- TTimeTriggeredCallback
-
- Ya Tidak
-
-
- TValueTriggeredCallback
-
- Ya Tidak
- Kelas Infrastruktur Kontrol Aktif
-
-
-
-Internasionlisasi dalam PRADO
-
-Pengenalan
-
-
-
-
-Contoh
-Tanggal: pola lengkap, kultur en_GB
-Contoh:
-Hasil:
-
-
-
-Tanggal: pola pendek
-Contoh:
-Hasil:
-
-
-
-Pola standar tanggal dari <%= $this->Page->CurrentCulture %>
-Contoh:
-Hasil:
-
-
-
-Format standar kurs
-Contoh:
-Hasil:
-
-
-Currency, de_DE culture with Euro
-Contoh:
-Hasil:
-
-
-
-
-Kurs, format US dengan Euro
-Contoh:
-Hasil
-
-
-
-Contoh terjemahan
-ContohExample:
-Hasil:
-
-Contoh:
-Hasil:
-
-
-
-Menggunakan tag lokalisasi
-Contoh:
-Hasil:
-<%[ Goodbye ]%>
-
-
-
-
-Menterjemahkan menggunakan katalog berbeda
-Contoh:
-Hasil:
-
-
-
-
-Translasi dengan substitusi parameter
-Contoh:
-Hasil:
-
-PRADO 國際化
-
- 簡介
-
-
-
-
- 例子
- 日期:完整格式,en_GB語言設置
- 例:
-結果:
-
-
-
- 日期:短格式
- 例:
-結果:
-
-
-
- 日期:<%= $this->Page->CurrentCulture %>的缺省模式
- 例:
-結果:
-
-
-
- 貨幣,缺省格式
- 例:
-結果:
-
-
- 貨幣,de_DE語言以及歐幣
- 例:
-結果:
-
-
-
-
- 貨幣, 美國格式以及歐幣
- 例:
-結果:
-
-
-
- 翻譯實例
- 例:
-結果:
-
- 例:
-結果:
-
-
-
-Using localization tag
-Example:
-Result:
-<%[ Goodbye ]%>
-
-
-
- 用不同目錄進行翻譯
- 例:
-結果:
-
-
-
-
- 用參數替換進行翻譯
- 例:
-結果:
-
-Assets
-Asset Publishing
-
-
-Customization
-Performance
-A Toggle Button Example
-Autenticación y Autorizacion
-Funcionamiento de la Autenticación y Autorizacion en PRADO
-Using PRADO Auth Framework
-
-
-
-
-
-Using TUserManager
-Using TDbUserManager
-Collections
-Using TList
-
-
-
-Using TList-based component properties
-Extending TList
-Using TMap
-
-
-
-Using of TAttributeCollection
-Error Handling and Reporting
-Exception Classes
-
-
-Raising Exceptions
-Error Capturing and Reporting
-Customizing Error Display
-Internationalization (I18N) and Localization (L10N)
-Separate culture/locale sensitive data
-
-
-
-
-Configuration
-What to do with messages.xml?
-Setting and Changing Culture
-Localizing your PRADO application
-There are two areas in your application that may need message or string localization, in PHP code and in the templates. To localize strings within PHP, use the localize function detailed below. To localize text in the template, use the TTranslate component.
-Using localize function to translate text within PHP
-
-Compound Messages
-
-I18N Components
-
-TTranslate
-TDateFormat
-
-
-TNumberFormat
-
-
-
-
-
-TTranslateParameter
-TChoiceFormat
-
-
-
-
-Logging
-Using Logging Functions
-Message Routing
-
-
-Message Filtering
-Master and Content
-Master vs. External Template
-Performance Tuning
-Caching
-Using pradolite.php
-Changing Application Mode
-Reducing Page Size
-Other Techniques
-Introduction to Javascript
-This guide is based on the
-Quick guide to somewhat advanced JavaScript tour of some OO features by Sergio Pereira.
-
-Hey, I didn't know you could do that
-JSON (JavaScript Object Notation)
-What do you mean? A function is an object too?
-Arrays, items, and object members
-Enough about objects, may I have a class now?
-Functions as arguments, an interesting pattern
-This is this but sometimes this is also that
-Javascript in PRADO, Questions and Answers
-How do I include the Javascript libraries distributed with Prado?
-
-The available packaged libraries included in Prado are
-
-
-
-Security
-
-Viewstate Protection
-Cross Site Scripting Prevention
-Cookie Attack Prevention
-
-
-Persistent State
-View State
-Control State
-Application State
-Session State
-Themes and Skins
-
-Introduction
-Understanding Themes
-Using Themes
-Theme Storage
-Creating Themes
-Assets
-Penerbitan Asset
-
-
-Kustomisasi
-Performansi
-Contoh Tombol Toggle
-Otentikasi dan Otorisasi
-Bagaimana Kerangka Kerja Otentikasi PRADO Bekerja
-Menggunakan Kerangka Kerja Otentikasi PRADO
-
-
-
-
-
-Menggunakan TUserManager
-Menggunakan TDbUserManager
-Koleksi
-Menggunakan TList
-
-
-
-Menggunakan properti komponen berbasis-TList
-Memperluas TList
-Menggunakan TMap
-
-
-
-Penggunaan TAttributeCollection
-Penanganan Kesalahan dan Laporan
-Kelas Eksepsi
-
-
-Memunculkan Eksepsi
-Penangkapan Kesalahan dan Pelaporan
-Mengkustomisasi Tampilan Kesalahan
-Internasionalisasi (I18N) dan Lokalisasi (L10N)
-Pisahkan data sensitif kultur/lokal
-
-
-
-
-Konfigurasi
-Apa yang harus dilakukan dengan messages.xml?
-Menyetel dan Mengubah Kultur
-Melokalisir aplikasi PRADO Anda
-Ada dua area dalam aplikasi Anda yang mungkin membutuhkan lokalisasi pesan atau string, dalam kode PHP dan dalam template. Untuk melokalisasi string di dalam PHP, gunakan fungsi localize yang dijelaskan di bawah. Untuk melokalisasi teks dalam template, gunakan komponen TTranslate.
-Menggunakan fungsi localize untuk mennerjemahkan teks dalam PHP
-
-Pesan Gabungan
-
-Komponen I18N
-
-TTranslate
-TDateFormat
-
-
-TNumberFormat
-
-
-
-
-
-TTranslateParameter
-TChoiceFormat
-
-
-
-
-Pencatatan
-Menggunakan Fungsi Pencatatan
-Pengalihan Pesan
-
-
-Penyaringan Pesan
-Master dan Konten
-Master vs. Template Eksternal
-Penyesuaian Performansi
-Caching
-Menggunakan pradolite.php
-Mengubah Mode Aplikasi
-Mengurangi Ukuran Halaman
-Teknik Lainnya
-Pengenalan Javascript
-Bimbingan ini berdasarkan pada
-Bimbingan cepat bagi tur JavaScript tingkat lanjut dengan beberapa fitur OO oleh Sergio Pereira.
-
-Hey, Saya tidak tahu Anda bisa melakukannya
-JSON (JavaScript Object Notation)
-Apa yang Anda maksud? Fungsi juga adalah sebuah obyek?
-Arrays, items, and object members
-Cukup tentang obyek, boleh saya memiliki kelas sekarang?
-Fungsi sebagai argumen, pola yang menarik
-this ini tapi kadang-kadang juga this itu
-Javascript dalam PRADO, Pertanyaan dan Jawaban
-Bagaimana saya menyertakan librari Javascript yang didistribusikan dengan Prado?
-
-Paket librari yang tersedia disertakan dalam Prado adalah
-
-
-
-Keamanan
-
-Perlindungan Kondisi Tampilan
-Pencegahan Penaskahan Situs Silang
-Pencegahan Serangan Cookie
-
-
-Kondisi Persisten
-Kondisi Tampilan
-Kondisi Kontrol
-Kondisi Aplikasi
-Kondisi Sesi
-Tema dan Skin
-
-Pengenalan
-Memahami Tema
-Menggunakan Tema
-Penyimpanan Tema
-Membuat Tema
-Konfigurasi Aplikasi
-
-
-
-
-Tinjauan Konfigurasi
-Konfigurasi Halaman
-Template: Bagian I
-Tag Komponen
-ID Komponen
-Tag Kontrol Template
-Tag kontrol template digunakan untuk mengkonfigurasi nilai properti awal dari kontrol yang memiliki template. Formatnya adalah sebagai berikut,
-Tag Komentar
-Tag Include
-Template: Bagian II
-
-
-Tag Konten Dinamis
-Tag Ekspresi
-Tag Pernyataan
-Tag Databind
-Tag Parameter
-Tag Asset
-Tag Lokalisasi
-Template: Bagian III
-
-
-Tag Properti Dinamis
-Tag Ekspresi
-Tag Databind
-Tag Parameter
-Tag Asset
-Tag Lokalisasi
-Pemetaan URL (URL bersahabat)
-
-
-
-
-Menetapkan Pola URL
-Membentuk URL Dikustomisasi
-
Welcome to
@@ -19,8 +19,8 @@ A text hyperlink with css style:
Welcome to
@@ -39,7 +39,7 @@ An image hyperlink:
A hyerplink with body contents as link text:
Inline frame with default settings:
-
@@ -17,7 +17,7 @@ Inline frame customized with margins and align:
MarginWidth="100"
MarginHeight="100"
Align="Right"
- FrameUrl="http://www.pradosoft.com/" />
+ FrameUrl="https://github.com/pradosoft/prado" />
diff --git a/demos/quickstart/protected/pages/Controls/id/Button.page b/demos/quickstart/protected/pages/Controls/id/Button.page
deleted file mode 100755
index 942b607f..00000000
--- a/demos/quickstart/protected/pages/Controls/id/Button.page
+++ /dev/null
@@ -1,16 +0,0 @@
-
@@ -26,7 +26,7 @@ Inline frame without scrollbars and border:
TButton
-TCaptcha
-TCheckBox
-TClientScript
-Menyertakan Bundel Librari Javascript dalam Prado
-
-
-Menyertakan File Javascript Kustom
-Menyertakan Blok Kode Javascript Kustom
-TColorPicker
-TConditional
-Kontrol Data
-
-
-
-TDataGrid
-
-Kolom
-
-
-
-Gaya Item
-Event
-
-
-
-
-
- Menggunakan TDataGrid
-
-Kolom yang Dibuat Secara Otomatis
-Kolom Ditetapkan secara Manual
-
-
-Berinteraksi dengan TDataGrid
-Pengurutan
-Lembaran
-Lembar Kustom
-Memperluas TDataGrid
-TDataList
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-TDatePicker
-
-
-
-
-
-
-MMM
atau MMMM
. Pengurai sisi-server tidak akan bisa menentukan tanggal yang benar jika MMM
atau MMMM
dipakai. Ketika InputMode sama dengan "DropDownList", seluruh pola dapat dipergunakan.TExpression
-TFileUpload
-
-
-THead
-THiddenField
-THtmlArea
-
- Windows XP MacOS X 10.4
-----------------------------------------------------
-MSIE 6 OK
-MSIE 5.5 SP2 OK
-MSIE 5.0 OK
-Mozilla 1.7.x OK OK
-Firefox 1.0.x OK OK
-Firefox 1.5b2 OK OK
-Safari 2.0 (412) OK(1)
-Opera 9 Preview 1 OK(1) OK(1)
-----------------------------------------------------
-(1) - sebagian bekerja
-----------------------------------------------------
-
-
-THyperLink
-TImage
-TImageButton
-TImageMap
-TInlineFrame
-
-
-
-TJavascriptLogger
-TKeyboard
-TLabel
-TLinkButton
-Kontrol Daftar
-
-
-
-
-
-
-TListBox
-TDropDownList
-TCheckBoxList
-
-
-
-TRadioButtonList
-TBulletedList
-
-
-
-TLiteral
-TMultiView
-
-
-
-Menulis Kontrol Baru
-Komposisi Kontrol yang Sudah Ada
-Komposisi dengan Menulis Template
-Komposisi dengan Penggantian createChildControls()
-Menggunakan LabeledTextBox
-Memperluas Kontrol yang Sudah Ada
-Memperluas TControl
-
-
-Properti dan metode penting lainnya termasuk:
-
-
-
-Memperluas TWebControl
-
-
-Membuat Kontrol dengan Fungsional Khusus
-TOutputCache
-TPager
-
-
-
-
-
-TPanel
-TPlaceHolder
-TRadioButton
-TRepeater
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-TSafeHtml
-
-
-
-TSlider
-
-
-
-
-Kontrol Standar
-
-
-
-TStatements
-TTabPanel
-
-
-
-
-
-
-TTable
-TTextBox
-TTextHighlighter
-Kontrol Validasi
-
-
-
-
-
-
-Kontrol Validasi Prado
-
-TRequiredFieldValidator
-TRegularExpressionValidator
-
-
-[\w]{6,}
(0\d{1,4}-|\(0\d{1,4}\) ?)?\d{1,4}-\d{4}
\d{3}(-(\d{4}|\d{2}))?
(\(\d{3}\)|\d{3}-)?\d{8}
\d{6}
\d{18}|\d{15}
((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}
\d{5}(-\d{4})?
\d{3}-\d{2}-\d{4}
TEmailAddressValidator
-TCompareValidator
-
-
-TDataTypeValidator
-TRangeValidator
-TCustomValidator
-TValidationSummary
-Berinteraksi dengan Validator
-Mereset atau Membersihkan Validator
-Validasi Kondisional Sisi Server dan Klien
-
-
-
-Contoh Validasi Kondisional
-TWizard
-Tinjauan
-
-
-
-
-Menggunakan TWizard
-
-Contoh Bimbingan Satu-Langkah
-Mengkustomisasi Gaya Bimbingan
-
-
-Mengkustomisasi Navigasi Bimbingan
-
-
-Menggunakan Template dalam Bimbingan
-
-
-Menggunakan Langkah Bimbingan Bertemplate
-Combining SqlMap with Active Records
diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page
deleted file mode 100755
index 8e81678e..00000000
--- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page
+++ /dev/null
@@ -1,1000 +0,0 @@
-Rekaman Aktif
-Kapan Menggunakannya
-
-
-Implikasi Desain
-Database yang Didukung
-
-
-Mendefinisikan Rekaman Aktif
-Menyiapkan koneksi database
-Menggunakan application.xml di dalam Kerangka Kerja Prado
-Mengambil data dari database
-findByPk()
- findAllByPks()
- find()
-
-
-
-findAll()
-findBy*() dan findAllBy*()
-findBySql() dan findAllBySql()
-count()
-Menyisipkan dan memutakhirkan rekaman
-Menghapus rekaman yang sudah ada
-deleteAll() dan deleteBy*()
-Transaksi
-Event
-Contoh Pencatatan
-Hubungan Rekaman Aktif
-Pemetaan Kunci Asing
-Hubungan Has Many
-Hubungan Belongs To
-Hubungan Has One
-Hubungan Leluhur Anak
-Kriteria Query untuk Obyek Terkait
-Pemetaan Tabel Asosiasi
-Tabel Asosiasi Mereferensi Dirinya
-Pengambilan Malas Obyek Terkait
-
-Pemetaan Kolom
-Referensi
-
-
-
-Data Access Object (DAO)
-
-
-Menetapkan Koneksi Database
-
-
-Menjalankan Pernyataan SQL
-
-
-Mengambil Hasil Query
-Menggunakan Transaksi
-
-
-Mengikat Parameter
-Mengikat Kolom
-Tampilan Scaffold Rekaman Aktif
-
-
-
-Menyiapkan Tampilan Scaffold
-
-
-TScaffoldListView
-
-
-
-
-TScaffoldEditView
-Menggabungkan tampilan daftar + edit
-
-Mengkustomisasi TScaffoldView
-Pemeta Data
-Kapan Menggunakannya
-Pemeta Data SqlMap
-Menyiapkan koneksi database dan menginisialisasi SqlMap
-Contoh cepat
-Menggabung SqlMap dengan Rekaman Aktif
-Referensi
-
-
-
-Rekord Aktywny (ang. Active Record)
-Kiedy używać?
-
-
-Implikacje modelu
-Wspierane bazy danych
-
-
-Definiowanie Aktywnego Rekordu
-Ustanawianie połączenia z bazą danych
-Używanie application.xml w frameworku Prado
-Ładowanie danych z tablicy
-findByPk()
- findAllByPks()
- find()
-
-
-
-findAll()
-findBy*() oraz findAllBy*()
-findBySql() oraz findAllBySql()
-count()
-Wstawianie i aktualizowanie rekordów
-Usuwanie istniejących obiektów
-deleteAll() oraz deleteBy*()
-Tranzakcje
-Zdarzenia
-Przykład z logowaniem
-Relacje dla Rekordu Aktywnego
-Mapowanie kluczów obcych
-Relacja posiada wiele (ang. has Many Relationship)
-Has One Relationship
-Belongs To Relationship
-Parent Child Relationships
-Query Criteria for Related Objects
-Association Table Mapping
-Self Referenced Association Tables
-Lazy Loading Related Objects
-
-Column Mapping
-References
-
-
-
-Aplikasi
-Organisasi Direktori
-
-
-
-Penyebaran Aplikasi
-
-
-
-Masa Hidup Aplikasi
-Arsitektur
-
-Komponen
-Properti Komponen
-Subproperti
-Event Komponen
-Namespace
-Penurunan Komponen
-Penurunan Komponen Dinamis
-Penurunan Komponen Statis
-Kontrol
-Susunan Kontrol
-Identifikasi Kontrol
-Wadah Penamaan
-ViewState dan ControlState
-Contoh: Permainan Hangman
-
-Untuk dilanjutkan...
-Modul
-Modul Permintaan
-Modul Respon
-Modul Sesi
-Modul Pengendali Kesalahan
-Modul Kustom
-Halaman
-PostBack
-Masa Hidup Halaman
-Layanan
-Layanan Halaman
-Applications
-Directory Organization
-
-
-
-Application Deployment
-
-
-
-Application Lifecycles
-アーキテクチャ
-
-
-このフレームワークはウェブプログラミングに集中するためのものであり、開発者がより生産性を上げられるようにコンポーネントベース、イベントドリブンなプログラミングが可能なつくりになっています。
-以下のクラスツリーは PRADO によって提供されている主要なクラスについて書かれたものです。
-Components
-Component Properties
-Subproperties
-Component Events
-Namespaces
-Component Instantiation
-Dynamic Component Instantiation
-Static Component Instantiation
-Controls
-Control Tree
-Control Identification
-Naming Containers
-ViewState and ControlState
-Sample: Hangman Game
-
-To be continued...
-Modules
-Request Module
-Response Module
-Session Module
-Error Handler Module
-Custom Modules
-Pages
-PostBack
-Page Lifecycles
-Services
-Page Service
-Aplikacja
-Organizacja folderów
-
-
-
-Osadzanie aplikacji
-
-
-
-Cykle życia aplikacji
-Architektura
-
-Komponenty
-Właściwości komponentu (ang. component properties)
-Subwłaściwości (ang. subproperties)
-Zdarzenia komponentu
-Przestrzenie nazw (ang. namespaces)
-Tworzenie instancji komponentu
-Dynamiczne tworzenie instancji komponentów
-Statyczne tworzenie instancji komponentów
-Kontrolki (ang. controls)
-Drzewko kontrolek
-Identyfikacja kontrolki
-Kontenery nazw (ang. naming containers)
-Stan widoku (ang. ViewState) oraz stan kontrolki (ang. ControlState)
-Przykład: wisielec
-
-Ciąg dalszy nastąpi...
-Moduły (ang. modules)
-Moduł żądania (ang. request module)
-Moduł odpowiedzi (ang. response module)
-Moduł sesji (ang. session module)
-moduł zarządzania błędami (ang. error handler module)
-Dodatkowe moduły (ang. custom modules)
-Strony (ang. pages)
-PostBack
-Cykl życia strony (ang. page lifecycles)
-Serwisy (ang. services)
-Serwis strony (ang. page service)
-Standalone package
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/Introduction.page
index 522e385c..2056b5e1 100755
--- a/demos/quickstart/protected/pages/GettingStarted/Introduction.page
+++ b/demos/quickstart/protected/pages/GettingStarted/Introduction.page
@@ -52,11 +52,7 @@ You may refer to the following resources if you find this tutorial does not fulf
-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page
deleted file mode 100755
index 0c6b4ee6..00000000
--- a/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page
+++ /dev/null
@@ -1,62 +0,0 @@
-Willkommen zum PRADO Quickstart Tutorial
-¿Que es PRADO?
-¿Proque PRADO?
-
-
-
-¿Qué es adecuado para utilizar PRADO
-
-¿Cómo se PRADO en comparación con otros Frameworks?
-
-
-¿Es PRADO lo suficientemente estable?
-
-Historia de PRADO
-Installing PRADO
-
-
-Bienvenido al Tutorial rápido de PRADO
-¿Cómo funciona PRADO?
- Examples and Demos
-
-
- Tutorials and Help
-
- Qu'est-ce que PRADO ?
-Pourquoi PRADO ?
-
-
-
-Pour quelles applications PRADO est-il adapté ?
-Comment est PRADO comparé à d'autres Frameworks ?
-PRADO est-il assez stable ?
-Histoire de PRADO
-Outil en ligne de commande
-Pré-requis
-Utilisation
-Créer un nouveau squelette de projet PRADO
-
-
-
-
-Shell interactif
-Ma première application PRADO
-
-
-
-
-
-Installer PRADO
-
-
-Bienvenue sur le tutorial de démarrage rapide de PRADO
-Nouvelles fonctionnalités
-
-Version 3.1.0
-
-
-
-
-Mise à jour à partir des versions v2.x et v1.x
-
-Définition des composants
-Contrôleur de l'application
-Pages
-Relation des contrôles
-Syntaxe des Templates
-Syntaxe des Thèmes
-Apa itu PRADO?
-Mengapa PRADO?
-
-
-
-Untuk Apa PRADO Paling Cocok?
-Bagaimana PRADO Bila Dibandingkan dengan Kerangka Kerja Lain?
-Apakah PRADO Cukup Stabil?
-Sejarah PRADO
-Piranti Baris Perintah
-Persyaratan
-Usage
-Membuat kerangka proyek Prado baru
-
-
-
-
-Shell Interaktif
-Aplikasi PRADO Pertama Saya
-
-
-
-
-
-Menginstalasi PRADO
-
-
-Selamat datang di Tutorial Cepat PRADO
-
-
-
-Fitur Baru
-
-Version 3.1.1
-
-
-
-Versi 3.1.0
-
-
-
-Meningkatkan dari v2.x dan v1.x
-
-Definisi Komponen
-Pengontrol Aplikasi
-Halaman
-Hubungan Kontrol
-Sintaks Template
-Sintaks Tema
-PRADO とは?
-なぜ PRADO を使うのですか?
-
-
-
-PRADO での開発はどの場面が適していますか?
-PRADO は他のフレームワークと比較してどのような点が異なっていますか?
-PRADO は安定していますか?
-PRADO の歴史
-Command Line Tool
-Requirements
-Usage
-Creating a new Prado project skeleton
-
-
-
-
-Interactive Shell
-初めての PRADO アプリケーション
-
-このアプリケーションは、ページに Click Me と書いてある送信ボタンを配置してあります。
-ユーザーがボタンをクリックすると、ボタン文字が Hello World に変わるというアプリケーションです。
-
-ひとつは、ページからサーバーに変数を送信して、その変数を利用して新しいページ(新しいボタン)を生成していることです。
-またもう一つは、Javascript の onclick を意識することなく利用し、ボタン文字を変更する事ができるということです。
-
-ボタンは、TButton オブジェクトを使用します。
-TButton では Text プロパティがボタン文字となり、ユーザーのクリック動作をサーバーサイドの OnClick イベントに対応付けます。
-Text プロパティを変更する内容を定義したメソッドを OnClick に対応付けるだけで、ボタンクリックのアクションを設定することができます。
-以下にアプリケーションのシーケンスを示します。
-
-
-
-
-
-例えば、helloworld プロジェクトを作りたいディレクトリへ移動し、php path/to/prado-cli.php -c helloworld とコマンド入力する事で、helloworld プロジェクトディレクトリを作成する事ができます。
-
-
-
-この例ではドキュメントルート配下に helloworld というディレクトリを配置しています。Home.page テンプレートファイル内の TButton を TLinkButton へ変更してみてどのようになるかも試してみてください。
-PRADO のインストール
-
-PRADO は Windows と Linux 両環境の Apache サーバーでテストされています。
-PHP5 がサポートされているのであれば、他の環境でも動作させることができるかもしれません。
-
-
-
-http://web-server-address/prado/demos/ 以下にPRADOデモアプリケーションが展開されますので、PRADOを利用したアプリケーションの動作を体験する事ができます。
-デモアプリケーションの動作が確認できていれば、DocumentRoot 配下に prado サブディレクトリが展開されたことになりますので、インストールは正常に完了しております。
-ようこそ PRADO クイックスタートチュートリアルへ
-
-
-
-新機能
-
-バージョン 3.1.0
-
-
-
-
-
-全てのコントロールにて Ajaxが有効になりました。(アクティブコントロール - active controls)
-アクティブコントロールは、通常のコントロールととても似た作りになっています。
-使用方法の詳細はチュートリアル アクティブコントロール をご覧下さい。
-TSoapService, TOutputCache, TSessionPageStatePersister, TFeedService, TJsonService, cache dependency classes, TXmlTransform.
-
-データコントロールにて、アイテムテンプレートを再利用して描画するよう改善しました。
-TRepeater, TDataList, TDataGrid などのコントロールでの構成がクリアなコードになりました。
-チュートリアルが更新されているので、詳細はチュートリアル TRepeater, TDataList, TDataGrid をご覧下さい。
-アプリケーション構造を外部ファイルにも定義できるようになり、テンプレートでの定義など柔軟なアプリケーション定義ができるようになりました
-認証処理時のユーザーアカウントをデータベースに簡単に保存できるようになりました。Upgrading from v2.x and v1.x
-
-Component Definition
-Application Controller
-Pages
-Control Relationship
-Template Syntax
-Theme Syntax
-Czym jest PRADO?
-Dlaczego PRADO?
-
-
-
-Do czego najlepiej nadaje się PRADO?
-Jak PRADO reprezentuje się na tle innych frameworków?
-Czy PRADO jest wystarczająco stabilne?
-Historia PRADO
-Narzędzie linii poleceń
-Wymagania
-Używanie
-Tworzenie szkieletu nowego projektu PRADO
-
-
-
-
-Interaktywna powłoka
-Moja pierwsza aplikacja w PRADO
-
-
-
-
-
-Instalacja PRADO
-
-
-Witamy w przewodniku SzybkiStart z PRADO
-
-
-
-Nowe możliwości
-
-Wersja 3.1.1
-
-
-
-wersja 3.1.0
-
-
-Aktualizowanie z wersji 2.x i 1.x
-
-Definicja komponentu (Component definition)
-Kontroler aplickacji (Application Controller)
-Strony (Pages)
-Zależności między kontrolkami (Control Relationship)
-Składnia szablonów (Template Syntax)
-Składnia tematów (Theme Syntax)
-欢迎使用PRADO快速教程
-
-
-
-
-Layanan SOAP
-
-
-
-Downloading and Installing Prado
- Building an AJAX Chat Application
-
-
-
- Download, Install and Create a New Application
- Authentication and Authorization
- Prado Chat Demo Login
- Securing the Home page
-Active Record for chat_users table
-Custom User Manager class
-Authentication
-
-
-
-Default Values for ActiveRecord
-Main Chat Application
-Prado Chat Demo
-Exploring the Active Controls
-Active Record for chat_buffer table
-Chat Application Logic
-';
- foreach($this->findAll() as $user)
- $content .= '
';
- return $content;
-}
-Putting It Together
-Improving User Experience
-Building a Simple Currency Converter
- Downloading and Installing Prado
- Creating a new Prado web Application
- Creating the Currency Converter User Interface
- Implementing Currency Conversion
-
- Adding Validation
-
-
-
-
- Improve User Experience With Active Controls
- Adding Final Touches
- Buku Alamat Sederhana
- Membangun Aplikasi Obrolan AJAX
-
-
-
- Download, Instalasi dan Buat Aplikasi Baru
- Otentikasi dan Otorisasi
- Prado Chat Demo Login
- Mengamankan halaman Home
-Rekaman Aktif untuk tabel chat_users
-Kelas Manajer Pengguna Kustom
-Otentikasi
-
-
-
-Nilai Standar untuk ActiveRecord
-Aplikasi Chat Utama
-Prado Chat Demo
-Menjelajah Kontrol Aktif
-Rekaman Aktif untuk tabel chat_buffer
-Logika Aplikasi Chat
-';
- foreach($this->findAll() as $user)
- $content .= '
';
- return $content;
-}
-Menyatukan Semuanya
-Memperbaiki Pengalaman Pengguna
-Membangun Pengubah Kurs Sederhana
- Men-download dan Menginstalasi Prado
- Membuat Aplikasi web Prado baru
- Membuat Antarmuka Pengguna Pengubah Kurs
- Mengimplementasikan Konversi Kurs
-
- Menambahkan Validasi
-
-
-
-
- Meningkatkan Pengalaman Pengguna Dengan Kontrol Aktif
-
- Menambahkan Sentuhan Akhir
-
-
-
-
-<%# $this->DataItem['type']%>:
- <%# $this->DataItem['name']%>
-<%= $this->FilePath %>
-
+Copyright 2004-<%= date('Y') %> by The PRADO Group (https://github.com/pradosoft/prado)
All rights reserved.
Setup the Distribution
-
+
+ file for each data source that your project has.
+
+
Valid XHTML 1.0 Transitional
diff --git a/demos/time-tracker/protected/App_Code/Dao/BaseDao.php b/demos/time-tracker/protected/App_Code/Dao/BaseDao.php
index 571a9d1a..b64139c0 100755
--- a/demos/time-tracker/protected/App_Code/Dao/BaseDao.php
+++ b/demos/time-tracker/protected/App_Code/Dao/BaseDao.php
@@ -3,9 +3,9 @@
* Base DAO class file.
*
* @author Wei Zhuo
* $cache=new TEACache; // TEACache may also be loaded as a Prado application module
* $cache->init(null);
* $cache->add('object',$object);
* $object2=$cache->get('object');
*
*
* If loaded, TEACache will register itself with {@link TApplication} as the
* cache module. It can be accessed via {@link TApplication::getCache()}.
*
* TEACache may be configured in application configuration file as follows
*
*
*
* @author Dario Rigolin
* $cache=new TEACache; // TEACache may also be loaded as a Prado application module
* $cache->init(null);
* $cache->add('object',$object);
* $object2=$cache->get('object');
*
*
* If loaded, TEACache will register itself with {@link TApplication} as the
* cache module. It can be accessed via {@link TApplication::getCache()}.
*
* TEACache may be configured in application configuration file as follows
*
*
*
* @author Dario Rigolin
*
* PHP configuration style:
*
diff --git a/framework/Util/TLogger.php b/framework/Util/TLogger.php
index 4a4b2161..6f188b0b 100644
--- a/framework/Util/TLogger.php
+++ b/framework/Util/TLogger.php
@@ -3,9 +3,9 @@
* TLogger class file
*
* @author Qiang Xue
*
* @author Fabio Bas