diff options
author | Fabio Bas <ctrlaltca@gmail.com> | 2015-12-07 15:57:51 +0100 |
---|---|---|
committer | Fabio Bas <ctrlaltca@gmail.com> | 2015-12-07 15:57:51 +0100 |
commit | 654a9cae43358c7eecf3b522e9876aa7815e2453 (patch) | |
tree | 545f2e42fdc6e824b247924adf083ad3fe51e61d /demos/blog-tutorial/protected/pages | |
parent | e99e35819d53dc48ae4e9a8491528a6b6011469f (diff) |
Move urls from pradosoft.com to github's project page; drop unmaintained quickstart tutorial translations
Diffstat (limited to 'demos/blog-tutorial/protected/pages')
102 files changed, 59 insertions, 5619 deletions
diff --git a/demos/blog-tutorial/protected/pages/Day1/CreateContact.page b/demos/blog-tutorial/protected/pages/Day1/CreateContact.page index 0d9fc026..ea7b9253 100755 --- a/demos/blog-tutorial/protected/pages/Day1/CreateContact.page +++ b/demos/blog-tutorial/protected/pages/Day1/CreateContact.page @@ -3,7 +3,7 @@ <h1>Creating Contact Page</h1>
<p>
-We have created a default page <tt>Home.page</tt> using the <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a>. The page is relatively static because it does not containt dynamic content. In this section, we will create an interactive page named <tt>Contact</tt>.
+We have created a default page <tt>Home.page</tt> using the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a>. The page is relatively static because it does not containt dynamic content. In this section, we will create an interactive page named <tt>Contact</tt>.
</p>
<p>
@@ -17,7 +17,7 @@ To create the <tt>Contact</tt> page, we need two files under the <tt>pages</tt> <img src="<%~ directories2.gif %>" class="output" />
<com:InfoBox>
-A <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">page</a> must have either a <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">template</a> file (extension <tt>.page</tt>) or a class file, or both:
+A <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Pages">page</a> must have either a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1">template</a> file (extension <tt>.page</tt>) or a class file, or both:
</p>
<ul>
@@ -35,7 +35,7 @@ We first create the template file for the <tt>Contact</tt> page. </p>
<p>
-We use template to organize the presentational layout of the feedback form. In the template, we use <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">textboxes</a> to collect user's name, email and feedback. And we use <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Validation">validators</a> 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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.TextBox">textboxes</a> to collect user's name, email and feedback. And we use <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Validation">validators</a> to ensure that the user provides all these information before submitting the feedback form. The whole template is as follows,
</p>
<com:TTextHighlighter CssClass="source" Language="prado">
@@ -86,11 +86,11 @@ We use template to organize the presentational layout of the feedback form. In t </com:TTextHighlighter>
<p>
-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 <tt><com:></tt> tags. Each <tt><com:></tt> tag refers to a <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Controls">control</a> whose properties are being initialized with name-value pairs in the tag. For example, the <tt><com:TButton></tt> refers to the <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Button">TButton</a> control which displays a button that users can click on to submit the feedback form. For complete template syntax, please refer to the <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">Quickstart Tutorial</a>.
+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 <tt><com:></tt> tags. Each <tt><com:></tt> tag refers to a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Controls">control</a> whose properties are being initialized with name-value pairs in the tag. For example, the <tt><com:TButton></tt> refers to the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Button">TButton</a> control which displays a button that users can click on to submit the feedback form. For complete template syntax, please refer to the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1">Quickstart Tutorial</a>.
</p>
<com:InfoBox>
-PRADO provides a control for every type of HTML input. For example, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> displays a text input field, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">TDropDownList</a> displays a combobox. Each control is a component that may be accessed in code as an object with configurable properties.
+PRADO provides a control for every type of HTML input. For example, <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.TextBox">TTextBox</a> displays a text input field, <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.List">TDropDownList</a> displays a combobox. Each control is a component that may be accessed in code as an object with configurable properties.
</com:InfoBox>
<p>
@@ -117,10 +117,10 @@ Below we summarize the controls that are used in the page template: </p>
<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TForm">TForm</a> displays an HTML form. Any input control must be enclosed within it. And most importantly, at most one <tt>TForm</tt> may appear in a page.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TTextBox">TTextBox</a> displays a text box to collect user text input.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TRequiredFieldValidator">TRequiredFieldValidator</a> ensures that the associated text box is not empty when the feedback is submitted.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TEmailAddressValidator">TEmailAddressValidator</a> ensures that the textbox contains a <i>valid</i> email address when the feedback is submitted.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TForm">TForm</a> displays an HTML form. Any input control must be enclosed within it. And most importantly, at most one <tt>TForm</tt> may appear in a page.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TTextBox">TTextBox</a> displays a text box to collect user text input.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TRequiredFieldValidator">TRequiredFieldValidator</a> ensures that the associated text box is not empty when the feedback is submitted.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TEmailAddressValidator">TEmailAddressValidator</a> ensures that the textbox contains a <i>valid</i> email address when the feedback is submitted.</li>
</ul>
<com:TipBox>
diff --git a/demos/blog-tutorial/protected/pages/Day1/Setup.page b/demos/blog-tutorial/protected/pages/Day1/Setup.page index 582d0399..b8df0705 100755 --- a/demos/blog-tutorial/protected/pages/Day1/Setup.page +++ b/demos/blog-tutorial/protected/pages/Day1/Setup.page @@ -3,7 +3,7 @@ <h1>Initial Setup</h1>
<p>
-We start by setting up the directories and the files that are required by most PRADO applications. We use the <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a> to achieve this goal.
+We start by setting up the directories and the files that are required by most PRADO applications. We use the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a> to achieve this goal.
</p>
<p>
@@ -11,7 +11,7 @@ Assume <tt>blog</tt> is the name of the directory to hold the whole blog system, </p>
<p>
-Under the <tt>blog</tt> directory, we run the <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a> with the following command (replace <tt>path/to</tt> with the actual path to the PRADO framework installation):
+Under the <tt>blog</tt> directory, we run the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a> with the following command (replace <tt>path/to</tt> with the actual path to the PRADO framework installation):
</p>
<com:TTextHighlighter CssClass="source cli">
php path/to/prado-cli.php -c .
@@ -60,7 +60,7 @@ The name of the entry script does not need to be <tt>index.php</tt>. It can be a <h3>Application Configuration</h3>
<p>
-The <i>optional</i> XML file <tt>application.xml</tt> contains the <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">application configuration</a>. Its main purpose is to customize in a configurable fashion the application instance created in the entry script. For example, we may enable the <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">logging</a> feature for our blog system with the help of application configuration.
+The <i>optional</i> XML file <tt>application.xml</tt> contains the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.AppConfig">application configuration</a>. Its main purpose is to customize in a configurable fashion the application instance created in the entry script. For example, we may enable the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.Logging">logging</a> feature for our blog system with the help of application configuration.
</p>
<p>
@@ -71,11 +71,11 @@ The file <tt>application.xml</tt> we have now is nearly empty. In fact, we may s <h3>Homepage</h3>
<p>
-The homepage (also called default page) <tt>Home.page</tt> is the only <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">page</a> created by the PRADO command line tool. It is the content in this file that shows up in the browser when visiting the URL <tt>http://hostname/blog/index.php</tt>.
+The homepage (also called default page) <tt>Home.page</tt> is the only <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Pages">page</a> created by the PRADO command line tool. It is the content in this file that shows up in the browser when visiting the URL <tt>http://hostname/blog/index.php</tt>.
</p>
<p>
-Content in the file <tt>Home.page</tt> uses the <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">PRADO template format</a>, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in <tt>Home.page</tt> we see the following pure HTML content:
+Content in the file <tt>Home.page</tt> uses the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1">PRADO template format</a>, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in <tt>Home.page</tt> we see the following pure HTML content:
</p>
<com:TTextHighlighter CssClass="source" Language="prado">
@@ -117,7 +117,7 @@ It is safe to remove files and directories under <tt>protected/runtime</tt> and <h3>The <tt>pages</tt> Directory</h3>
<p>
-The <tt>pages</tt> directory is the <i>root page directory</i> holding all <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">pages</a> in a PRADO application. It bears an analogy to the <tt>htdocs</tt> directory for the Apache httpd Web server.
+The <tt>pages</tt> directory is the <i>root page directory</i> holding all <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Pages">pages</a> in a PRADO application. It bears an analogy to the <tt>htdocs</tt> directory for the Apache httpd Web server.
</p>
<p>
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 @@ <h1>Sharing Common Layout</h1>
<p>
-In this section, we will use the <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">master/content</a> 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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">master/content</a> 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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.MasterContent">master/content</a> 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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.MasterContent">master/content</a> feature allows us to treat the common layout as a control which centralizes the logic and presentation of the common layout for every page.
</p>
<com:InfoBox>
-It is also possible to share common layout via <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">template inclusion</a>, which is like PHP file inclusion. The drawback of template inclusion is that it is not self-contained and does not carry a class to contain the logic for the common layout.
+It is also possible to share common layout via <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1">template inclusion</a>, which is like PHP file inclusion. The drawback of template inclusion is that it is not self-contained and does not carry a class to contain the logic for the common layout.
</com:InfoBox>
@@ -52,9 +52,9 @@ For the moment, <tt>MainLayout</tt> only contains a simple header and a footer, The above shows the content in the template file <tt>MainLayout.tpl</tt>. Three new tags are used:
</p>
<ul>
-<li><tt><com:TContentPlaceHolder></tt> represents <a href="http://www.pradosoft.com/docs/classdoc/TContentPlaceHolder">TContentPlaceHolder</a> control. It reserves the place in the template where content will be placed at. Here, the content comes from the pages who use this master control.</li>
-<li><tt><com:THead></tt> represents <a href="http://www.pradosoft.com/docs/classdoc/THead">THead</a> control which represents the <head> tag in HTML. It allows PRADO to manipulate the <head> tag as a component (e.g., setting page titles, adding custom CSS styles.)</li>
-<li><tt><%= %></tt> is an <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates2#et">expression tag</a>. It displays the evaluation result of the enclosed expression at the place where it appears.</li>
+<li><tt><com:TContentPlaceHolder></tt> represents <a href="http://pradosoft.github.io/docs/manual/class-TContentPlaceHolder">TContentPlaceHolder</a> control. It reserves the place in the template where content will be placed at. Here, the content comes from the pages who use this master control.</li>
+<li><tt><com:THead></tt> represents <a href="http://pradosoft.github.io/docs/manual/class-THead">THead</a> control which represents the <head> tag in HTML. It allows PRADO to manipulate the <head> tag as a component (e.g., setting page titles, adding custom CSS styles.)</li>
+<li><tt><%= %></tt> is an <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates2#et">expression tag</a>. It displays the evaluation result of the enclosed expression at the place where it appears.</li>
</ul>
<p>
@@ -69,7 +69,7 @@ class MainLayout extends TTemplateControl </com:TTextHighlighter>
<com:InfoBox>
-The file extension name for page templates is <tt>.page</tt>, while for non-page templates it is <tt>.tpl</tt>. This is to differentiate pages from other controls. They both use the same <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">template syntax</a>. For pages, their class files are optional (default to <tt>TPage</tt>), while for non-page controls, their class files are mandatory. Similar to Java, the name of a class file must be the same as the class name. Be careful about the case-sensitivity on Linux/Unix systems.
+The file extension name for page templates is <tt>.page</tt>, while for non-page templates it is <tt>.tpl</tt>. This is to differentiate pages from other controls. They both use the same <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1">template syntax</a>. For pages, their class files are optional (default to <tt>TPage</tt>), while for non-page controls, their class files are mandatory. Similar to Java, the name of a class file must be the same as the class name. Be careful about the case-sensitivity on Linux/Unix systems.
</com:InfoBox>
@@ -110,15 +110,15 @@ It is possible to have multiple <tt>TContentPlaceHolder</tt>'s in a master templ </com:InfoBox>
<p>
-Besides <tt><com:TContent></tt>, we also see another new tag <tt><%@ %></tt> in the above, which is called <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1#tct">template control tag</a>. It contains name-value pairs which are used to initialize the corresponding properties for the template owner, namely, the <tt>Contact</tt> page.
+Besides <tt><com:TContent></tt>, we also see another new tag <tt><%@ %></tt> in the above, which is called <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.Templates1#tct">template control tag</a>. It contains name-value pairs which are used to initialize the corresponding properties for the template owner, namely, the <tt>Contact</tt> page.
</p>
<p>
-By setting <tt>MasterClass</tt> property as <tt>Application.layouts.MainLayout</tt>, we instruct the <tt>Contact</tt> page to use <tt>MainLayout</tt> as its master. Here, we are using the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> to refer to the <tt>MainLayout</tt> class.
+By setting <tt>MasterClass</tt> property as <tt>Application.layouts.MainLayout</tt>, we instruct the <tt>Contact</tt> page to use <tt>MainLayout</tt> as its master. Here, we are using the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Components">namespace format</a> to refer to the <tt>MainLayout</tt> class.
</p>
<com:InfoBox>
-Namespace format is widely used in PRADO programming. It is used together with <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Fundamentals.Components">path aliases</a>. PRADO defines two path aliases: <tt>System</tt> refers to the <tt>framework</tt> directory of the PRADO installation, and <tt>Application</tt> refers to the <tt>protected</tt> directory. The namespace <tt>Application.layouts.MainLayout</tt> can thus be translated as <tt>protected/layouts/MainLayout</tt> which is exactly the file name (without the extension <tt>.php</tt>) for the <tt>MainLayout</tt> class.
+Namespace format is widely used in PRADO programming. It is used together with <a href="http://www.pradoframework.net/site/demos/quickstart/index.php?page=Fundamentals.Components">path aliases</a>. PRADO defines two path aliases: <tt>System</tt> refers to the <tt>framework</tt> directory of the PRADO installation, and <tt>Application</tt> refers to the <tt>protected</tt> directory. The namespace <tt>Application.layouts.MainLayout</tt> can thus be translated as <tt>protected/layouts/MainLayout</tt> which is exactly the file name (without the extension <tt>.php</tt>) for the <tt>MainLayout</tt> class.
</com:InfoBox>
@@ -151,7 +151,7 @@ In the above, we specify <tt>MasterClass</tt> in the <tt>onPreInit()</tt> method </p>
<p>
-We can also specify master in <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">application configuration</a> or <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">page configuration</a>. The following shows the updated application configuration for our blog system:
+We can also specify master in <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.AppConfig">application configuration</a> or <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.PageConfig">page configuration</a>. The following shows the updated application configuration for our blog system:
</p>
<com:TTextHighlighter CssClass="source" Language="xml">
diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/CreateContact.page b/demos/blog-tutorial/protected/pages/Day1/fr/CreateContact.page deleted file mode 100755 index 0105f656..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/CreateContact.page +++ /dev/null @@ -1,202 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page Contact</h1>
-
-<p>
-Nous avons créé une page par défaut <tt>Home.page</tt> en utilisant les <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">outils en ligne de commande de PRADO</a>. 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 <tt>Contact</tt>.
-</p>
-
-<p>
-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.
-</p>
-
-<p>
-Pour créer la page <tt>Contact</tt>, nous avons besoin de 2 fichiers dans le dossier <tt>pages</tt> : le fichier de gabarit <tt>Contact.page</tt> et le fichier de classe PHP <tt>Contact.PHP</tt>.
-</p>
-
-<img src="<%~ directories2.gif %>" class="output" />
-
-<com:InfoBox>
-Une <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">page</a> doit avoir un fichier de <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">gabarit</a> (extension <tt>.page</tt>) ou un fichier de classe PHP, ou les deux :
-</p>
-
-<ul>
-<li>Une page avec seulement un gabarit est généralement une page statique, comme la page d'accueil que nous avons déjà créée ;</li>
-<li>Une page avec seulement un fichier de classe PHP produit le code HTML directement à partir de l'exécution du script.
-<li>Une page avec un gabarit et un fichier de classe PHP combine les avantages des deux : un gabarit pour facilement organiser la présentation de la page et un fichier de classe PHP pour produire le contenu dynamique.</li>
-</ul>
-</com:InfoBox>
-
-
-<h2>Création de la page gabarit</h2>
-
-<p>
-Nous allons premièrement créer le fichier gabarit de la page <tt>Contact</tt>.
-</p>
-
-<p>
-Nous utilisons un fichier gabarit pour organiser la présentation de notre formulaire. Dans notre gabarit, nous utilisons des <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">champs de saisie</a> pour collecter le nom de l'utilisateur, son email et son commentaire. D'autre part, nous utilisons des <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Validation">validateurs</a> 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,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<head><title>Mon Blog - Contact</title></head>
-<body>
-<h1>Contact</h1>
-<p>Veuillez remplir le formulaire suivant pour me laisser vos impressions au sujet de mon blog. Merci !</p>
-
-<com:TForm>
-
-<span>Votre nom:</span>
-<com:TRequiredFieldValidator ControlToValidate="Name"
- ErrorMessage="Veuillez indiquer votre nom."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Name" />
-
-<br/>
-<span>Votre email:</span>
-<com:TRequiredFieldValidator ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator ControlToValidate="Email"
- ErrorMessage="Vous avez saisi un email invalide."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<br/>
-<span>Commentaires:</span>
-<com:TRequiredFieldValidator ControlToValidate="Feedback"
- ErrorMessage="Veuillez saisir un commentaire."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Feedback"
- TextMode="MultiLine"
- Rows="10"
- Columns="40" />
-
-<br/>
-<com:TButton Text="Envoyer" OnClick="submitButtonClicked" />
-
-</com:TForm>
-
-</body>
-</html>
-</com:TTextHighlighter>
-
-<p>
-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 <tt><com:></tt>. Chaque balise <tt><com:></tt> fait référence à un <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Controls">contrôle</a> dont les propriétés sont initialisées grâce aux paires nom-valeur de la balise. Par exemple, la balise <tt><com:TButton></tt> fait référence au contrôle <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Button">TButton</a> qui affiche un bouton permettant à l'utilisateur de soumettre le formulaire. Pour une syntaxe complète, veuillez vous référer au <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">Tutoriel de démarrage rapide</a>.
-
-<com:InfoBox>
-PRADO fournit un contrôle pour chaque type de balise HTML. Par exemple, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> affiche un champ de saisie, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">TDropDownList</a> affiche une liste déroulante. Chaque contrôle est un composant auquel on peut accéder par code et dont les propriétés sont modifiables.
-</com:InfoBox>
-
-
-<p>
-Avant le contrôle <tt>TTextBox</tt>, 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,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<span>Your Email:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="Vous avez saisi un email invalide."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Email" />
-<br/>
-</com:TTextHighlighter>
-
-<p>
-Ci-dessous, un résumé des contrôles utilisés dans le gabarit :
-</p>
-
-<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TForm">TForm</a> affiche un formulaire HTML. Chaque contrôle de saisie doit être au sein d'un TForm. Et le plus important, au plus un <tt>TForm</tt> peut apparaitre dans une page.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TTextBox">TTextBox</a> affiche un champ de saisie utilisateur.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TRequiredFieldValidator">TRequiredFieldValidator</a> s'assure que le contrôle de saisie associé n'est pas vide quand le formulaire est envoyé.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TEmailAddressValidator">TEmailAddressValidator</a> s'assure que le champ de saisie contient une adresse email <i>valide</i> quand le formulaire est envoyé.</li>
-</ul>
-
-<com:TipBox>
-Ecrire des gabarits seulement avec un éditeur de texte peut être pénible et pas vraiment intuitif pour les designers. Pour faciliter ceci, PRADO inclus dans cette version, une extension pour Dreamweaver qui permet la complétion automatique des balises PRADO (ceci inclut le nom des balises, le nom des propriétés, le nom des évènements, etc.).
-</com:TipBox>
-
-<h2>Création du fichier de classe PHP</h2>
-
-<p>
-Nous allons maintenant créer le fichier de classe PHP <tt>Contact.PHP</tt>. Ce fichier est nécessaire parce que nous devons agir après la soumission du formulaire.
-</p>
-
-<p>
-Notez les lignes dans le fichier gabarit. Elles indiquent que lorsque l'utilisateur soumet le formulaire, la méthode <tt>submitButtonClicked()</tt> doit être appelé. Ici, <tt>OnClick</tt> est le nom de l'évènement et la méthode correspondante doit être défini dans le fichier de classe PHP.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
- <com:TButton Text="Submit" OnClick="submitButtonClicked" />
-</com:TTextHighlighter>
-
-<p>
-Nous écrirons donc le fichier de classe suivant :
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?PHP
-class Contact extends TPage
-{
- /**
- * Gestionnaire d'évènement pour OnClick (bouton submit).
- * @param TButton le bouton qui a générer l'évènement
- * @param TEventParameter les paramètres de l'évènement (null dans ce cas)
- */
- public function submitButtonClicked($sender, $param)
- {
- if ($this->IsValid) // vérifie que les validations sont Ok
- {
- // récupère le nom de l'utilisateur, son email et son commentaire
- $name = $this->Name->Text;
- $email = $this->Email->Text;
- $feedback = $this->Feedback->Text;
-
- // envoie un email à l'administrateur avec les informations
- $this->mailFeedback($name, $email, $feedback);
- }
- }
-
- protected function mailFeedback($name, $email, $feedback)
- {
- // implémentation de l'envoi de l'email
- }
-}
-</com:TTextHighlighter>
-
-<p>
-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 <tt>submitButtonClicked()</tt>, nous récupérons les éléments saisies par l'utilisateur. Par exemple, <tt>$this->Name->Text</tt> retourne la valeur de la propriété <tt>Text</tt> du contrôle <tt>Name</tt> qui est un contrôle permettant la saisie du nom de l'utilisateur.
-</p>
-
-<com:InfoBox>
-Le nom de la classe héritant de TPage doit être le même que le nom du fichier. C'est aussi une nécessité pour écrire n'importe quelle classe de composant PRADO.
-</com:InfoBox>
-
-<h2>Test</h2>
-
-<p>
-Notre nouvelle page <tt>Contact</tt> peut être testée en naviguant à l'URL <tt>http://hostname/blog/index.PHP?page=Contact</tt>. 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 <tt>mailFeedback()</tt> sera appelée.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-<p>
-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.
-</p>
-
-<com:InfoBox>
-Chaque validateur représente une règle de validation. Un champ de saisie unique peut être associé à un ou plusieurs validateurs. Les validateurs effectuent les vérifications aussi bien du côté client que du côté serveur. Côté client (navigateur), les validations sont effectuées grâce à du javascript, côté serveur, elles sont effectuées en PHP. Les validations côté client peuvent être désactivées tandis que celles côté serveur ne peuvent l'être. Ceci permet de s'assurer que les règles de validation sont toujours appliquées.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/Setup.page b/demos/blog-tutorial/protected/pages/Day1/fr/Setup.page deleted file mode 100755 index 0be1c1f0..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/Setup.page +++ /dev/null @@ -1,160 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Installation</h1>
-
-<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">les outils en ligne de commande</a> pour atteindre ce but.
-</p>
-
-<p>Nous partons du principe que le nom du dossier qui contiendra l'application est <tt>blog</tt> et que l'URL qui permet d'accéder à ce dossier est : <tt>http://hostname/blog/</tt> (remplacer <tt>hostname</tt> par le nom de votre serveur).
-</p>
-
-<p>A l'intérieur du dossier blog, nous utilisons <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">les outils en ligne de commande</a> avec comme commande (remplacer <tt>path/to</tt> par le chemin d'installation du framework PRADO):
-</p>
-<com:TTextHighlighter CssClass="source cli">
-php path/to/prado-cli.php -c .
-</com:TTextHighlighter>
-
-<p>
-L'utilisation de cette commande permet de créer la structure de dossier et fichiers suivante:
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-<p>
-Nous avons dorénavant, un squellette d'application PRADO accessible par l'URL <tt>http://hostname/blog/index.php</tt> et qui affiche une page contenant le message "Welcome to PRADO".
-</p>
-
-<p>
-Il est de notre intérêt d'en apprendre plus à propos des dossiers et fichiers que nous venons de créer.
-</p>
-
-<h2>Les fichiers initiaux</h2>
-
-<h3>Le script principal de l'application</h3>
-
-<p>
-Toutes les applications PRADO ont un point d'entrée, habituellement nommé <tt>index.php</tt>. 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.
-</p>
-
-<p>
-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,
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-// include prado.php which contains basic PRADO classes
-require_once('path/to/prado.php');
-// create a PRADO application instance
-$application = new TApplication;
-// run the application and handle user requests
-$application->run();
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Le nom du script ne doit pas être obligatoirement <tt>index.php</tt>. Il peut porter n'importe quel nom à partir du moment ou le serveur peut l'interpréter comme étant un script PHP5. Par exemple, sur certains hébergements mutualisés, le script devra porter le nom <tt>index.php5</tt>, ce qui permettra au serveur Web de le traiter correctement.
-</com:InfoBox>
-
-<h3>Le fichier de configuration de l'application</h3>
-<p>
-Le fichier optionnel XML <tt>application.xml</tt> contient la <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">configuration de l'application</a>. 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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">log</a> pour notre application par le biais du fichier de configuration.
-</p>
-
-<p>
-Le fichier <tt>application.xml</tt> 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 <tt>application.xml</tt> et vous expliquerons comment configurer l'application.
-</p>
-
-
-<h3>La page d'accueil</h3>
-
-<p>
-La page d'accueil <tt>Home.page</tt> (aussi dénommée page par défaut) est la seule <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">page</a> 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 <tt>http://hostname/blog/index.php</tt>.
-</p>
-
-<p>
-Le contenu du fichier <tt>Home.page</tt> respecte le <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">format de template</a> qui pour la plupart du temps est du code HTML agrémenté de quelques balises spécifiques à PRADO. Par exemple, dans <tt>Home.page</tt> nous voyons du code HTML pur :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<head>
- <title>Welcome to PRADO</title>
-</head>
-<body>
-<h1>Welcome to PRADO!</h1>
-</body>
-</html>
-</com:TTextHighlighter>
-
-
-<h2>Les dossiers initiaux</h2>
-
-<h3>Le dossier <tt>protected</tt></h3>
-
-<p>
-Le dossier <tt>protected</tt>, aussi connu sous le nom <i>chemin de base de l'application</i>, est le dossier racine qui contient les pages, les gabarits, les fichiers de configuration, les données, etc. Le nom <tt>protected</tt> 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.
-</p>
-
-<p>
-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 <tt>deny from all</tt>.
-</p>
-
-
-<h3>Les dossiers <tt>protected/runtime</tt> et <tt>assets</tt></h3>
-
-<p>
-Les dossiers <tt>protected/runtime</tt> et <tt>assets</tt> sont deux dossiers qui doivent avoir l'autorisation "en écriture" pour le serveur Web. Le dossier <tt>runtime</tt> 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 <tt>assets</tt> contient les ressources qui doivent être publiques (ie: les images, les fichiers javascript).
-</p>
-
-<com:InfoBox>
-Il n'y a aucun souci à supprimer les dossiers et les fichiers contenus dans <tt>protected/runtime</tt> et <tt>assets</tt>. Il est recommandé aux développeurs de nettoyer ces dossiers lors d'une mise à jour de PRADO.
-</com:InfoBox>
-
-
-<h3>Le dossier <tt>pages</tt></h3>
-
-<p>
-The <tt>pages</tt> directory is the <i>root page directory</i> holding all <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">pages</a> in a PRADO application. It bears an analogy to the <tt>htdocs</tt> directory for the Apache httpd Web server.
-</p>
-
-<p>
-Nous avons déjà vu comment accéder la page d'accueil. Pour accéder à n'importe quelle page situé dans le dossier <tt>pages</tt>, il faut utiliser l'URL suivante <tt>http://hostname/blog/index.php?page=chemin.vers.NomdelaPage</tt>. En fonction de cette URL, PRADO recherche une page dénommée <tt>NomdelaPage</tt> dans le dossier <tt>pages/chemin/vers</tt>. L'URL que nous avons utilisée précédemment pour accéder à la page d'accueil correspond à <tt>http://hostname/blog/index.php?page=Home</tt>.
-
-
-<h2>Personnalisation</h2>
-
-<p>
-Il est tout à fait possible de personnaliser le nom et l'emplacement des fichiers et dossiers décrit précédemment.
-</p>
-
-<p>
-Par exemple, pour améliorer la sécurité, certains pourraient désirer déplacer la totalité du dossier <tt>protected</tt> à 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 :
-</p>
-
-<com:TTextHighlighter CssClass="source">
-$application = new TApplication( 'path/to/protected' );
-</com:TTextHighlighter>
-
-<p>
-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 <tt>application.xml</tt> de cette manière :
-</p>
-
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Debug">
- <services>
- <service id="page"
- class="TPageService"
- BasePath="path.to.pages"
- DefaultPage="NewHome"
- />
- </services>
-</application>
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/ShareLayout.page b/demos/blog-tutorial/protected/pages/Day1/fr/ShareLayout.page deleted file mode 100755 index 539b8376..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/ShareLayout.page +++ /dev/null @@ -1,180 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Partager les modèles de gabarit</h1>
-
-<p>
-Dans cette section, nous allons utiliser la fonctionnalité <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">gabarit principal/contenu</a> 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é <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">gabarit principal/contenu</a> nous permets de traiter les parties communes comme un contrôle qui centralise la logique applicative et la présentation de chaque page.
-</p>
-
-<com:InfoBox>
-Il est aussi possible de partager les parties communes grâce à <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">l'inclusion de gabarits</a>, un peu comme l'inclusion de fichier php. L'inconvénient de l'inclusion de gabarits est que l'on ne peut pas partager la logique applicative.
-</com:InfoBox>
-
-
-<h2>Création du gabarit principal</h2>
-
-<p>
-Nous allons maintenant créer le gabarit principal <tt>MainLayout</tt> qui représente les parties communes partagées par toutes nos pages. Le contrôle <tt>MainLayout</tt> est un contrôle de gabarit qui hérite de <tt>TTemplateControl</tt>. Il a besoin d'un fichier de gabarit <tt>MainLayout.tpl</tt> et d'un fichier de classe <tt>MainLayout.php</tt> situés dans le même dossier. Pour faciliter la maintenance, nous allons créer le nouveau dossier <tt>protected/layouts</tt> pour les accueillir.
-</p>
-
-<img src="<%~ directories3.gif %>" class="output" />
-
-<p>
-Pour le moment, <tt>MainLayout</tt> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<com:THead />
-<body>
-<com:TForm>
-<div id="page">
-
-<div id="header">
-<h1>Mon blog PRADO</h1>
-</div>
-
-<div id="main">
-<com:TContentPlaceHolder ID="Main" />
-</div>
-
-<div id="footer">
-<%= PRADO::poweredByPrado() %>
-</div>
-
-</div>
-</com:TForm>
-</body>
-</html>
-</com:TTextHighlighter>
-
-<p>
-Ci-dessus, le contenu du fichier de gabarit <tt>MainLayout.tpl</tt>. Trois nouvelles balises sont utilisées.
-</p>
-
-<ul>
-<li><tt><com:TContentPlaceHolder></tt> represente un contrôle <a href="http://www.pradosoft.com/docs/classdoc/TContentPlaceHolder">TContentPlaceHolder</a>. Il définit l'emplacement dans le gabarit où le contenu sera inséré. Dans notre cas, le contenu proviendra des pages qui utiliseront notre gabarit principal.</li>
-<li><tt><com:THead></tt> représente un contrôle <a href="http://www.pradosoft.com/docs/classdoc/THead">THead</a> qui correspond à la balise <head> d'un document HTML. Ceci permet à PRADO de manipuler la balise <head> comme un composant (ie: définir le titre de la page, ajouter des feuilles de styles CSS.)</li>
-<li><tt><%= %></tt> est une <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates2#et">balise de configuration</a>. Elle affiche le résultat de l'évaluation de l'expression à l'endroit où elle se situe.</li>
-</ul>
-
-
-<p>
-Le fichier de classe <tt>MainLayout.php</tt> est très simple :
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-class MainLayout extends TTemplateControl
-{
-}
-</com:TTextHighlighter>
-
-<com:InfoBox>
-L'extension des fichiers de gabarit est <tt>.page</tt>, tandis que pour les gabarits autres que les pages c'est <tt>.tpl</tt>. Ceci permet de différencier les pages des autres contrôles. Les deux utilisent la même <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">syntaxe de gabarit</a>. Pour les pages, le fichier de classe est optionnel (par défaut hérite de <tt>TPage</tt>), tandis que pour les contrôles, les fichiers de classes sont obligatoires. Comme pour Java, le nom de la classe doit être le même que le nom du fichier de classe. Faites attention à la casse sur les systèmes Linux/Unix.
-</com:InfoBox>
-
-<h2>Utilisation du gabarit principal</h2>
-<p>
-Pour utiliser notre gabarit principal nouvellement créé, nous allons modifier nos fichiers <tt>Home.page</tt> et <tt>Contact.page</tt>. 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 <tt>MainLayout</tt>.
-</p>
-
-<p>
-Ci-dessous, le contenu de <tt>Contact.page</tt> après les modifications :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ MasterClass="Application.layouts.MainLayout" Title="Mon blog - Contact" %>
-
-<com:TContent ID="Main">
-
-<h1>Contact</h1>
-<p>Veuillez remplir le formulaire suivant pour me laisser vos impressions au sujet de mon blog. Merci !</p>
-
-...champs de saisie et validateurs pour le nom d'utilisateur...
-
-...champs de saisie et validateurs pour l'email...
-
-...champs de saisie et validateurs pour le commentaire...
-
-<com:TButton Text="Envoyer" OnClick="submitButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Le contenu entre les balises <tt><com:TContent></tt> sera inséré dans l'emplacement réservé par <tt><com:TContentPlaceHolder></tt> dans le gabarit principal.
-</p>
-
-<com:InfoBox>
-Il est possible d'avoir plusieurs <tt>TContentPlaceHolder</tt> dans un gabarit principal et plusieurs <tt>TContent</tt> dans un fichier de contenu. Ils sont associés par leurs propriétés <tt>ID</tt>. Il est aussi possible de définir un contenu comme étant le gabarit principal d'un autre contenu, ceci en plaçant une balise <tt>TContentPlaceHolder</tt> à l'endroit désiré. Ceci est appelé <i>gabarits principaux imbriqués</i>
-</com:InfoBox>
-
-<p>
-A côté de la balise <tt><com:TContent></tt>, nous avons vu une nouvelle balise <tt><%@ %></tt>, qui est dénommé une <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1#tct">balise de contrôle de gabarit</a>. 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 <tt>Contact</tt>.
-</p>
-
-<p>
-En définissant la propriété <tt>MasterClass</tt> comme étant de type <tt>Application.layouts.MainLayout</tt>, nous avons indiqué à la page <tt>Contact</tt> d'utiliser <tt>MainLayout</tt> comme gabarit principal. Ici, nous avons utilisé un <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">espace de noms</a> pour nous référer à la classe <tt>MainLayout</tt>.
-</p>
-
-<com:InfoBox>
-Les espaces de noms sont largement utilisés en programmation PRADO. Ils sont utilisés conjointement avec les <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Fundamentals.Components">alias de chemins</a>. PRADO définit deux alias de chemins: <tt>System</tt> fait référence au dossier <tt>framework</tt> de l'installation PRADO, et <tt>Application</tt> fait référence au dossier <tt>protected</tt>.
-L'espace de noms <tt>Application.layouts.MainLayout</tt> peut ainsi être traduit par <tt>protected/layouts/MainLayout</tt> ce qui est précisément le nom du fichier (sans l'extension <tt>.php</tt>) de la classe <tt>MainLayout</tt>.
-</com:InfoBox>
-
-
-<h2>Autres possibilités pour spécifier le gabarit principal</h2>
-
-<p>
-Il y a plusieurs alternatives pour spécifier le gabarit principal.
-</p>
-
-<p>
-Vous pouvez définir le gabarit principal comme ci-dessous pour pouvoir en changer dynamiquement.
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-class Contact extends TPage
-{
- public function onPreInit($param)
- {
- parent::onPreInit($param);
- $this->MasterClass='Path.To.NewLayout';
- }
-
- // ...
-}
-</com:TTextHighlighter>
-
-<p>
-Ci-dessus, nous indiquons d'utiliser le gabarit principal <tt>MasterClass</tt> dans la méthode <tt>onPreInit()</tt> qui est héritée de <tt>TPage</tt>. 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é.
-</p>
-
-<p>
-Nous pouvons aussi spécifier quel gabarit principal utiliser dans le fichier de <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">configuration de l'application</a> ou encore dans le fichier de <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">configuration de la page</a>. Ci-dessous, le fichier de configuration de l'application modifié pour notre blog.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Debug">
- <!-- configuration for available services -->
- <services>
- <service id="page" class="TPageService" DefaultPage="Home">
- <!-- initial properties set for all pages -->
- <pages MasterClass="Application.layouts.MainLayout" />
- </service>
- </services>
-</application>
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-<com:InfoBox>
-Il y a un ordre qui permet de savoir quel fichier gabarit principal utiliser s'il est spécifié à plusieurs endroits. En particulier <tt>onPreInit()</tt> est prioritaire au fichier de configuration de la page qui est lui même prioritaire au fichier de configuration de l'application. Ainsi, si vous spécifiez <tt>MainLayout</tt> dans le fichier de configuration de l'application/page et que vous spécifiez <tt>SpecialLayout</tt> dans <tt>Contact.page</tt>, ce sera le dernier qui sera pris en compte.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day1/fr/directories.gif Binary files differdeleted file mode 100755 index 884e15bc..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/directories2.gif b/demos/blog-tutorial/protected/pages/Day1/fr/directories2.gif Binary files differdeleted file mode 100755 index edf264d0..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/directories2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/directories3.gif b/demos/blog-tutorial/protected/pages/Day1/fr/directories3.gif Binary files differdeleted file mode 100755 index 3451935f..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/directories3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/fr/output.gif b/demos/blog-tutorial/protected/pages/Day1/fr/output.gif Binary files differdeleted file mode 100755 index 9ad2bfb8..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/fr/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page b/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page deleted file mode 100755 index caee30d0..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page +++ /dev/null @@ -1,203 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman Kontak</h1>
-
-<p>
-Kita telah membuat halaman standar <tt>Home.page</tt> menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a>. Halaman relatif statis karena ia tidak berisi konten dinamis. Dalam bagian ini, kita akan membuat halaman interaktif bernama <tt>Contact</tt>.
-</p>
-
-<p>
-Kegunaan dari halaman <tt>Contact</tt> 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.
-</p>
-
-<p>
-Untuk membuat halaman <tt>Contact</tt>, kita memerluka dua file di bawah direktori <tt>pages</tt>: file template halaman <tt>Contact.page</tt> dan file kelas halaman <tt>Contact.php</tt>.
-</p>
-
-<img src="<%~ directories2.gif %>" class="output" />
-
-<com:InfoBox>
-<a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">Halaman</a> harus berupa file <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">template</a> (berekstensi <tt>.page</tt>) atau file kelas, atau keduanya:
-</p>
-
-<ul>
-<li>Hanya template-halaman yang biasanya berupa sebuah halaman sengan konten statis, seperti homepage yang sudah kita buat;</li>
-<li>Hanya file kelas halaman yang menghasilkan konten murni berdasarkan eksekusi metode kelas;</li>
-<li>Sebuah halaman dengan template dan kelasnya mengkombinasikan keunggulan keduanya: ia menggunakan template untuk memudahkan mengatur tata letak halaman dan menggunakan kelas untuk menyertakan logika yang menghasilkan konten dinamis.</li>
-</ul>
-</com:InfoBox>
-
-
-<h2>Membuat Template Halaman</h2>
-
-<p>
-Pertama kita membuat file template untuk halaman <tt>Contact</tt>.
-</p>
-
-<p>
-Kita menggunakan template untuk menghatur tata letak penyajian terhadap formulir umpan balik. Dalam template, kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">kotak teks</a> untuk mengumpulkan nama pengguna, email dan umpan balik. Dan kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Validation">validator</a> guna memastikan bahwa pengguna menyediakan semua informasi ini sebelum mengirimkan formulir umpan balik. Seluruh template adalah sebagai berikut,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<head><title>My Blog - Contact</title></head>
-<body>
-<h1>Contact</h1>
-<p>Please fill out the following form to let me know your feedback on my blog. Thanks!</p>
-
-<com:TForm>
-
-<span>Your Name:</span>
-<com:TRequiredFieldValidator ControlToValidate="Name"
- ErrorMessage="Please provide your name."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Name" />
-
-<br/>
-<span>Your Email:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<br/>
-<span>Feedback:</span>
-<com:TRequiredFieldValidator ControlToValidate="Feedback"
- ErrorMessage="Please provide your feedback."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Feedback"
- TextMode="MultiLine"
- Rows="10"
- Columns="40" />
-
-<br/>
-<com:TButton Text="Submit" OnClick="submitButtonClicked" />
-
-</com:TForm>
-
-</body>
-</html>
-</com:TTextHighlighter>
-
-<p>
-Seperti kita lihat bahwa template terlihat sangat mirip dengan halaman HTML normal. Perbedaan utamanya adalah bahwa template berisi beberapa tag <tt><com:></tt>. Setap tag <tt><com:></tt> merujuk ke sebuah <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Controls">kontrol</a> yang propertinya diinisialisasi dengan pasangan nama-nilai dalam tag. Sebagai contoh, <tt><com:TButton></tt> merujuk ke kontrol <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Button">TButton</a> guna menampilkan sebuah tombol di mana pengguna dapat di klik pengguna untuk mengirimkan formulir umpan balik. Untuk sintaks lengkap template, silahkan rujuk <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">Tutorial Cepat</a>.
-</p>
-
-<com:InfoBox>
-PRADO menyediakan kontrol untuk setiap tipe input HTML. Sebagai contoh, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> menampilkan field input teks, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">TDropDownList</a> menampilkan kotak kombo. Setiap kontrol adalah sebuah komponen yang dapat diakses dalam kode sebagai obyek dengan properti yang bisa dikonfigurasi.
-</com:InfoBox>
-
-<p>
-Selain kontrol <tt>TTextBox</tt>, 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:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<span>Your Email:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Email" />
-<br/>
-</com:TTextHighlighter>
-
-<p>
-Di bawah ini kita meringkas kontrol yang dipakai dalam template halaman:
-</p>
-
-<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TForm">TForm</a> menampilkan sebuah formulir HTML. Setiap kontrol input harus dikurung di dalamnya. Dan yang terpenting, paling banyak satu <tt>TForm</tt> boleh muncul dalam sebuah halaman.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TTextBox">TTextBox</a> menampilkan kotak teks untuk mengumpulkan input teks pengguna.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TRequiredFieldValidator">TRequiredFieldValidator</a> memastikan bahwa kotak teks terkait tidak kosong saat umpan balik dikirimkan.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TEmailAddressValidator">TEmailAddressValidator</a> memastikan bahwa kotak teks berisi alamat email yang <i>benar</i> saat umpan balik dikirimkan.</li>
-</ul>
-
-<com:TipBox>
-Menulis template dengan editor teks biasa dapat membosankan dan tidak intuitif untuk para desainer. Untuk memudahkan situasi ini, PRADO telah menyertakan dalam rilis ekstensi Adobe Dreamweaver yang mendukung pelengkapan-otomatis tag PRADO (misalnya menyertakan nama kontrol, nama properti, nama event, dll) dalam Dreamweaver.
-</com:TipBox>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Sekarang kita membuat kelas halaman <tt>Contact.php</tt>. Alasan kita membutuhkan kelas halaman adalah karena kita perlu merespon umpan balik yang dikirimkan oleh pengguna.
-
-<p>
-Perhatikan dalam template kita mempunyai baris berikut. Template secara esensi menyatakan bahwa saat pengguna mengklik tombol, ia harus memanggil metode <tt>submitButtonClicked()</tt>. Di sini <tt>OnClick</tt> adalah nama dari event yang diklik pengguna, dan metode harus didefinisikan dalam kelas halaman.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
- <com:TButton Text="Submit" OnClick="submitButtonClicked" />
-</com:TTextHighlighter>
-
-<p>
-Selanjutnya kita menuliskan kelas halaman seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-class Contact extends TPage
-{
- /**
- * Pengendali event untuk event OnClick pada tombol submit.
- * @param TButton tombol yang memicu event
- * @param TEventParameter parameter event (null di sini)
- */
- public function submitButtonClicked($sender, $param)
- {
- if ($this->IsValid) // memeriksa apakan validasi input berhasil
- {
- // mendapatkan nama pengguna, email, umpan balik dari kotak teks
- $name = $this->Name->Text;
- $email = $this->Email->Text;
- $feedback = $this->Feedback->Text;
-
- // mengirimkan email ke administrator dengan informasi di atas
- $this->mailFeedback($name, $email, $feedback);
- }
- }
-
- protected function mailFeedback($name, $email, $feedback)
- {
- // implementasi pengiriman email umpan balik
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Kode di atas sebagian besar cukup jelas. Kenyataannya, kami hanya menampilkan skema pemrograman pengendalian-event. Dalam pengendali event <tt>submitButtonClicked()</tt>, kita mengambil input pengguna. Sebagai contoh, <tt>$this->Name->Text</tt> mengembalikan nilai properti <tt>Text</tt> dari kontrol <tt>Name</tt> yang merupakan kotak teks yang mengumpulkan informasi nama pengguna.
-</p>
-
-<com:InfoBox>
-Nama kelas halaman harus sama seperti nama file. Ini juga persyaratan untuk penulisan komponen kelas PRADO.
-</com:InfoBox>
-
-
-<h2>Pengujian</h2>
-
-<p>
-<tt>Contact</tt> yang baru saja kita buat dapat kita uji dengan URL <tt>http://hostname/blog/index.php?page=Contact</tt>. 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 <tt>mailFeedback()</tt> akan dipanggil.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-<p>
-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.
-</p>
-
-<com:InfoBox>
-Setiap validator mewakili aturan validasi. Satu kontrol input dapat dikaitkan dengan satu atau multipel validator. Validator melakukan validasi pada sisi klien dan sisi server. Pada sisi klien, yaitu browser, validasi dikerjakan dmenggunakan javascript; pada sisi server, validasi dikerjakan dengan menggunakan kode PHP. Validasi sisi-klien dapat dimatikan, sementara validasi sisi-server tidak bisa. Ini memastikan input pengguna selalu diperiksa oleh aturan validasi yang dietapkan.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/Setup.page b/demos/blog-tutorial/protected/pages/Day1/id/Setup.page deleted file mode 100755 index 45ae8cf5..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/Setup.page +++ /dev/null @@ -1,163 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Persiapan Awal</h1>
-
-<p>
-Kita mulai dengan menyiapkan direktori dan file yang diperlukan oleh kebanyakan aplikasi PRADO. Kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a> untuk melaksanakan tujuan ini.
-</p>
-
-<p>
-Anggap <tt>blog</tt> adalah nama direktori untuk menampung seluruh sistem blog, dan URL untuk mengakses folder ini adalah <tt>http://hostname/blog/</tt> (ganti <tt>hostname</tt> dengan nama host sebenarnya).
-</p>
-
-<p>
-Di bawah direktori <tt>blog</tt>, kita menjalankan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a> dengan perintah berikut (ganti <tt>path/ke</tt> dengan path sebenarnya ke instalasi kerangka kerja PRADO):
-</p>
-<com:TTextHighlighter CssClass="source cli">
-php path/ke/prado-cli.php -c .
-</com:TTextHighlighter>
-
-<p>
-Menjalankan perintah di atas akan membuat direktori dan file berikut:
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-<p>
-Sekarang kita mempunyai kerangka aplikasi PRADO yang dapat diakses melalui URL <tt>http://hostname/blog/index.php</tt> yang menampilkan halaman Web dengan tulisan "Welcome to PRADO".
-</p>
-
-<p>
-Sangat bermanfaat mempelajari lebih rinci mengenai direktori dan file yang baru saja kita buat.
-</p>
-
-
-<h2>File Awal</h2>
-
-<h3>Naskah Entri</h3>
-
-<p>
-Setiap aplikasi PRADO mempunyai naskah entri, sering dinamakan sebagai <tt>index.php</tt>. 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.
-</p>
-
-<p>
-Kegunaan utama dari naskah entri adalah untuk mengawali aplikasi PRADO dan membiarkan ia menangani permintaan pengguna. Naskah entri biasanya berisi pernyataan PHP berikut,
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-// sertakan prado.php yang berisi kelas PRADO dasar
-require_once('path/to/prado.php');
-// buat turunan aplikasi PRADO
-$application = new TApplication;
-// jalankan aplikasi dan tangani permintaan pengguna
-$application->run();
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Nama naskah entri tidak harus <tt>index.php</tt>. Ia dapat berupa nama apa saja selama server Web dapat mengatakan bahwa naskah adalah naskah PHP 5. Sebagai contoh, pada beberapa lingkungan hosting berbagi, seseorang mungkin perlu untuk menamai naskah sebagai <tt>index.php5</tt> agar ia bisa ditangani dengan benar oleh server the Web.
-</com:InfoBox>
-
-<h3>Konfigurasi Aplikasi</h3>
-<p>
-File XML <i>opsional</i> <tt>application.xml</tt> berisi <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">konfigurasi aplikasi</a>. Kegunaan utamanya adalah untuk mengkustomisasi dalam cara yang bisa mengkonfigurasi turunan aplikasi yang dibuat dalam naskah entri. Sevagai contoh, kita dapat menghidupkan fitur <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">pencatatan</a> untuk sistem blog kita dengan bantuan konfigurasi aplikasi.
-</p>
-
-<p>
-File <tt>application.xml</tt> 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 <tt>application.xml</tt>.
-</p>
-
-
-<h3>Homepage</h3>
-
-<p>
-Homepage (juga disebut halaman standar) <tt>Home.page</tt> adalah satu-satunya <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">halaman</a> yang dibuat oleh piranti baris perintah PRADO. Berisi konten dalam file ini yang muncul dalam browser saat mengunjungi URL <tt>http://hostname/blog/index.php</tt>.
-</p>
-
-<p>
-Konen dalam file <tt>Home.page</tt> menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">format template PRADO</a>, yang kebanyakan mirip HTML dengan beberapa tag spesifik-PRADO. Sebagai contoh, dalam <tt>Home.page</tt> kita melihat konten murni HTML berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<head>
- <title>Welcome to PRADO</title>
-</head>
-<body>
-<h1>Welcome to PRADO!</h1>
-</body>
-</html>
-</com:TTextHighlighter>
-
-
-<h2>Direktori Awal</h2>
-
-<h3>Direktori <tt>protected</tt></h3>
-
-<p>
-Direktori <tt>protected</tt>, juga dikenal sebagai <i>path basis aplikasi</i>, adalah direktori akar yang menampung halaman, template, konfigurasi, data, dll. Nama <tt>protected</tt> menunjukan bahwa direktori ini harus disembunyikan dari para pengguna Web, karena file di bawah direktori ini berisi data sensitif.
-</p>
-
-<p>
-Server Web berbeda mempunyai berbeda terhadap "melindungi" direktori. Untuk sever httpd Apache, cara termudah adalah untuk menempatkan file bernama <tt>.htaccess</tt> di bawah direktori dengan isi <tt>deny from all</tt>.
-</p>
-
-
-<h3>Direktori <tt>protected/runtime</tt> dan <tt>assets</tt></h3>
-
-<p>
-Direktori <tt>protected/runtime</tt> dan <tt>assets</tt> adalah dua direktori yang harus disetel bisa ditulisi oleh proses server Web. Direktori <tt>runtime</tt> menyimpan data sensitif (misalnya konfigurasi aplikasi yang diuraikan) yang dibuat saat menjalankan aplikasi PRADO, karena direktori <tt>assets</tt> menyimpan sumber daya yang dipublikasikan (misalnya file gambar, file javascript).
-</p>
-
-<com:InfoBox>
-Aman untuk menghapus file dan direktori di bawah <tt>protected/runtime</tt> dan <tt>assets</tt>. Sebenarnya para pengembang direkomendasikan untuk melakukan pekerjaan pembersihan ini ketika mereka memutakhirkan instalasi PRADO.
-</com:InfoBox>
-
-
-<h3>Direktori <tt>pages</tt></h3>
-
-<p>
-Direktori <tt>pages</tt> adalah <i>akar direktori halaman</i> yang menampung seluruh <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">halaman</a> dalam sebuah aplikasi PRADO. Ini mirip analogi terhadap direktori <tt>htdocs</tt> pada server Web httpd Apache.
-</p>
-
-<p>
-Kita sudah melihat bagaimana cara mengakses homepage. Untuk mengakses halaman yang ditempatkan di bawah <tt>pages</tt>, menggunakan URL <tt>http://hostname/blog/index.php?page=path.ke.NamaHalaman</tt>. Berdasarkan URL ini, PRADO akan melihar halaman bernama <tt>NamaHalaman</tt> di bawah direktori <tt>pages/path/ke</tt>. URL yang kita pakai untuk mengakses homepage sebelumnya sama dengan <tt>http://hostname/blog/index.php?page=Home</tt>.
-</p>
-
-
-<h2>Kustomisasi</h2>
-
-<p>
-Dimungkinkan untuk mengkustomisasi nama dan lokasi terhadap file dan direktori yang dijelaskan di atas.
-</p>
-
-<p>
-Sebagai contoh, untuk meningkatkan keamanan, seseorang mungkin ingin memindahkan seluruh direktori <tt>protected</tt> ke tempat lain yang bukan folder Web. Untuk melakukannya, gunakan pernyataan PHP berikut untuk membuat turunan aplikasi dalam naskah entri:
-</p>
-
-<com:TTextHighlighter CssClass="source">
-$application = new TApplication( 'path/ke/protected' );
-</com:TTextHighlighter>
-
-<p>
-Untuk membuat lokasi akar direktori halaman dan mengubah nama homepage, seseorang dapat menetapkannya dalam konfigurasi aplikasi <tt>application.xml</tt> sebagai berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Debug">
- <services>
- <service id="page"
- class="TPageService"
- BasePath="path.to.pages"
- DefaultPage="NewHome"
- />
- </services>
-</application>
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page b/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page deleted file mode 100755 index 0c40181b..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page +++ /dev/null @@ -1,178 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Berbagi Tata Letak Umum</h1>
-
-<p>
-Dalam bagian ini, kita akan menggunakan fitur <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">master/content</a> 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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.MasterContent">master/content</a> membolehkan kita untuk menggunakan tata letak umum sebagai sebuah kontrol yang memusatkan logika dan penyajian tata letak umum untuk setiap halaman.
-</p>
-
-<com:InfoBox>
-Ini juga memungkinkan untuk membagi tata letak umum melalui <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">penyertaan template</a>, yang mirip inklusi file PHP. Akibat dari penyertaan inklusi template ini adalah bahwa ia tidak berdiri sendiri dan tidak membawa kelas untuk mengisi logika untuk tata letak umum.
-</com:InfoBox>
-
-
-<h2>Membuat Kontrol Master</h2>
-
-<p>
-Sekarang kita membuat kontrol master <tt>MainLayout</tt> untuk mewakili tata letak umum berbagi dengan halaman blog kita. Kontrol <tt>MainLayout</tt> adalah kontrol template yang diperluas dari <tt>TTemplateControl</tt>. Ini mememerlukan file template <tt>MainLayout.tpl</tt> dan sebuah file kelas <tt>MainLayout.php</tt> yang ditempatkan di bawah direktori yang sama. Guna menjembatani pemeliharaan, kita membuat direktori baru <tt>protected/layouts</tt> untuk menampungnya.
-</p>
-
-<img src="<%~ directories3.gif %>" class="output" />
-
-<p>
-Untuk saat ini, <tt>MainLayout</tt> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<html>
-<com:THead />
-<body>
-<com:TForm>
-<div id="page">
-
-<div id="header">
-<h1>My PRADO Blog</h1>
-</div>
-
-<div id="main">
-<com:TContentPlaceHolder ID="Main" />
-</div>
-
-<div id="footer">
-<%= PRADO::poweredByPrado() %>
-</div>
-
-</div>
-</com:TForm>
-</body>
-</html>
-</com:TTextHighlighter>
-
-<p>
-Contoh di atas memperlihatkan konten dalam file template <tt>MainLayout.tpl</tt>. Tiga tag baru ini dipakai:
-</p>
-<ul>
-<li><tt><com:TContentPlaceHolder></tt> mewakili kontrol <a href="http://www.pradosoft.com/docs/classdoc/TContentPlaceHolder">TContentPlaceHolder</a>. Ia menyimpan tempat dalam template di mana konten akan ditempatkan. Di sini, konten datang dari halaman yang menggunakan kontrol master ini.</li>
-<li><tt><com:THead></tt> mewakili kontrol <a href="http://www.pradosoft.com/docs/classdoc/THead">THead</a> yang menyajikan tag <head> dalam HTML. Ia membolehkan PRADO untuk memanipulasi tag <head> sebagai sebuah komponen (misalnya setelan judul halaman, menambahkan gaya CSS kustom.)</li>
-<li><tt><%= %></tt> adalah sebuah <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates2#et">tag ekspresi</a>. Ia menampilkan hasil evaluasi daru ekspresi yang dikurung di tempat di mana ia muncul.</li>
-</ul>
-
-<p>
-File kelas <tt>MainLayout.php</tt> sangat sederhana:
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-class MainLayout extends TTemplateControl
-{
-}
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Nama ekstensi file untuk template halaman <tt>.page</tt>, sementara untuk template non-halaman yaitu <tt>.tpl</tt>. Ini untuk membedakan halaman dari kontrol lain. Keduanya menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1">sintaks template</a> yang sama. Untuk halaman, file kelasnya adalah opsional (standarnya <tt>TPage</tt>), sementara untuk kontrol non-halaman, file kelasnya adalah mandatori. Mirip dengan Java, nama file kelas harus sama seperti nama kelas. Harap berhati-hati mengenai sensitifitas-huruf pada sistem Linux/Unix.
-</com:InfoBox>
-
-
-<h2>Menggunakan Kontrol Master</h2>
-<p>
-Untuk menggunakan kontrol master yang baru saja dibuat, kita akan memodifikasi <tt>Home.page</tt> dan <tt>Contact.page</tt>. 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 <tt>MainLayout</tt> sebagai masternya.
-</p>
-
-<p>
-Kode berikut memperlihatkan konten dalam <tt>Contact.page</tt> setelah perubahan:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ MasterClass="Application.layouts.MainLayout" Title="My Blog - Contact" %>
-
-<com:TContent ID="Main">
-
-<h1>Contact</h1>
-<p>Please fill out the following form to let me know your feedback on my blog. Thanks!</p>
-
-...kotak teks dan validator untuk nama pengguna...
-
-...kotak teks dan validator untuk emali pengguna...
-
-...kotak teks dan validator untuk konten umpan balik...
-
-<com:TButton Text="Submit" OnClick="submitButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Konten yang dikurung di dalam tag <tt><com:TContent></tt> tag akan disisipkan ke dalam tempat yang disiapkan oleh <tt><com:TContentPlaceHolder></tt> pada template master.
-</p>
-
-<com:InfoBox>
-Dimungkinkan untuk memiliki multipel <tt>TContentPlaceHolder</tt> dalam sebuah template master dan multipel <tt>TContent</tt> dakan tenokate konten. Mereka saling dipasangkan dengan nilai <tt>ID</tt>-nya. Juga dimungkinkan untuk membuat template konten menjadi master template konten lainnya dengan menempatkan <tt>TContentPlaceHolder</tt> di pembentuk. Ini disebut <i>master berulang</i>.
-</com:InfoBox>
-
-<p>
-Selain <tt><com:TContent></tt>, kita juga melihat tag baru lain <tt><%@ %></tt> di atas, yang disebut <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.Templates1#tct">tag kontrol template</a>. Ia berisi pasangan nama-nilai yang dipakai untuk menginisialisasi properti terkait bagi pemilik template, yaitu, halaman <tt>Contact</tt>.
-</p>
-
-<p>
-Dengan menyetel properti <tt>MasterClass</tt> sebagai <tt>Application.layouts.MainLayout</tt>, kita menginstruksikan halaman <tt>Contact</tt> untuk menggunakan <tt>MainLayout</tt> sebagai masternya. Di sini, kita sedang menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">format namespace</a> untuk merujuk ke kelas <tt>MainLayout</tt>.
-</p>
-
-<com:InfoBox>
-Format namespace sebagian besar dipakai dalam pemrograman PRADO. Dipakai bersama dengan <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Fundamentals.Components">alias path</a>. PRADO mendefinisikan dua alias path: <tt>System</tt> merujuk ke direktori <tt>framework</tt> pada instalasi PRADO, dan <tt>Application</tt> merujuk ke direktori <tt>protected</tt>. Namespace <tt>Application.layouts.MainLayout</tt> selanjutnya bisa diterjemahkan sebagai <tt>protected/layouts/MainLayout</tt> yang tepatnya adalah nama file (tanpa ekstensi <tt>.php</tt>) untuk kelas <tt>MainLayout</tt>.
-</com:InfoBox>
-
-
-<h2>Cara Alternatif Menetapkan Master</h2>
-
-<p>
-Ada beberapa cara tambahan untuk menetapkan kelas master untuk sebuah halaman.
-</p>
-
-<p>
-Kita dapat menetapkan master dalam kode seperti berikut untuk menghidupkan perubahan dinamis terhadap tata letak:
-</p>
-
-<com:TTextHighlighter CssClass="source">
-<?php
-class Contact extends TPage
-{
- public function onPreInit($param)
- {
- parent::onPreInit($param);
- $this->MasterClass='Path.To.NewLayout';
- }
-
- // ...
-}
-</com:TTextHighlighter>
-
-<p>
-Dalam contoh di atas, kita menetapkan <tt>MasterClass</tt> dalam metode <tt>onPreInit()</tt> yang diturunkan dari <tt>TPage</tt>. 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.
-</p>
-
-<p>
-Kita juga dapat menetapkan master dalam <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.AppConfig">konfigurasi aplikasi</a> atau <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">konfigurasi halaman</a>. Kode berikut memperlihatkan konfigurasi aplikasi yang dimutakhirkan untuk sistem blog kita:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Debug">
- <!-- konfigurasi untuk layanan yang tersedia -->
- <services>
- <service id="page" class="TPageService" DefaultPage="Home">
- <!-- initial properties set for all pages -->
- <pages MasterClass="Application.layouts.MainLayout" />
- </service>
- </services>
-</application>
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-<com:InfoBox>
-Ada urutan yang menentukan master yang mana yang sebenarnya diterapkan ketika ia ditetapkan dalam tempat multipel. Dalam keadaan tertentu, <tt>onPreInit()</tt> diambil lebih dulu di atas template halaman di atas konfigurasi aplikasi/halaman. Oleh karena itu, jika kita menetapkan <tt>MainLayout</tt> dalam konfigurasi aplikasi/halaman dan kita menetapkan <tt>SpecialLayout</tt> dalam <tt>Contact.page</tt>, master yang efektif adalah yang terakhir.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories.gif Binary files differdeleted file mode 100755 index 884e15bc..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif Binary files differdeleted file mode 100755 index edf264d0..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif Binary files differdeleted file mode 100755 index 3451935f..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day1/id/output.gif b/demos/blog-tutorial/protected/pages/Day1/id/output.gif Binary files differdeleted file mode 100755 index 9ad2bfb8..00000000 --- a/demos/blog-tutorial/protected/pages/Day1/id/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page index 1d036577..2f1119a4 100755 --- a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page +++ b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page @@ -7,7 +7,7 @@ To use the database that we just created, we first need to establish a connectio </p>
<p>
-We are going to use <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> 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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> 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.
</p>
<com:NoteBox>
@@ -19,7 +19,7 @@ extension=php_pdo_sqlite.dll </com:NoteBox>
<p>
-To further abstract the actual database tables, we will also use the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> (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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> (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.
</p>
<p>
@@ -36,11 +36,11 @@ We modify our application configuration file <tt>protected/application.xml</tt> </com:TTextHighlighter>
<p>
-The configuration above shows that we are adding two <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modules</a> to our application. The <tt>TDataSourceConfig</tt> module is configured with the connection string <tt>sqlite:protected/data/blog.db</tt> which points to our SQLite database. This connection is used by the <tt>TActiveRecordConfig</tt> module which is required by Active Record.
+The configuration above shows that we are adding two <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Modules">modules</a> to our application. The <tt>TDataSourceConfig</tt> module is configured with the connection string <tt>sqlite:protected/data/blog.db</tt> which points to our SQLite database. This connection is used by the <tt>TActiveRecordConfig</tt> module which is required by Active Record.
</p>
<com:InfoBox>
-One may set up two or more DB connections in the application configuration. For more details, see the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record documentation</a>. And of course, one may also explicitly create a DB connection in PHP code using the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a> component in PDO.
+One may set up two or more DB connections in the application configuration. For more details, see the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record documentation</a>. And of course, one may also explicitly create a DB connection in PHP code using the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">TDbConnection</a> component in PDO.
</com:InfoBox>
</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page index 0cf28bdd..26355122 100644 --- a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page +++ b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page @@ -3,7 +3,7 @@ <h1>Creating Active Record Classes</h1>
<p>
-We need to create two <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> classes, <tt>UserRecord</tt> and <tt>PostRecord</tt>, to represent data records in the <tt>users</tt> and <tt>posts</tt> tables, respectively. Active Record classes must extend from the base class <tt>ActiveRecord</tt>, and must define property names that matches with the field names of the corresponding table.
+We need to create two <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> classes, <tt>UserRecord</tt> and <tt>PostRecord</tt>, to represent data records in the <tt>users</tt> and <tt>posts</tt> tables, respectively. Active Record classes must extend from the base class <tt>ActiveRecord</tt>, and must define property names that matches with the field names of the corresponding table.
</p>
<p>
@@ -47,7 +47,7 @@ So we need to modify again our application configuration in the services section <img src="<%~blog_wsat_generate_ar.png%>" style="width: 700px;" />
<p>
- In the <tt>Output Folder</tt> field we used the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder.
+ In the <tt>Output Folder</tt> field we used the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder.
The <tt>*</tt> in the <tt>Table Name</tt> 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.
</p>
@@ -121,7 +121,7 @@ The method <tt>withXXX()</tt> (where XXX is the relationship property name, in t </com:TipBox>
<p>
-Further detailed documentation can be found in the quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs.
+Further detailed documentation can be found in the quickstart <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs.
</p>
</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/CreateDB.page index 1f7085d7..c3494091 100755 --- a/demos/blog-tutorial/protected/pages/Day2/CreateDB.page +++ b/demos/blog-tutorial/protected/pages/Day2/CreateDB.page @@ -3,7 +3,7 @@ <h1>Creating Database</h1>
<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> and <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
+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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> and <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
</p>
<p>
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 @@ -<com:TContent ID="Main">
-
-<h1>Connexion à la base</h1>
-
-
-<p>
-Pour pouvoir utiliser la base de données que nous venons de créer, nous devons tout d'abord établir une connexion.
-</p>
-
-<p>
-Nous allons utiliser <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> 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.
-</p>
-
-<com:NoteBox>
-Pour utiliser DAO, nous devons installer et activer la librairie <a href="http://www.php.net/manual/en/ref.pdo.php">PHP PDO extension</a> <i>ainsi que</i> un driver PDO d'accès aux données (dans notre cas, c'est le driver PDO SQLite). Ceci peut être fait facilement sous Windows en incluant dans le fichier <tt>php.ini</tt> les lignes suivantes:
-<com:TTextHighlighter CssClass="source">
-extension=php_pdo.dll
-extension=php_pdo_sqlite.dll
-</com:TTextHighlighter>
-</com:NoteBox>
-
-<p>
-Pour une meilleure abstraction de notre base de données, nous utilisons aussi la fonctionnalité <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> (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.
-</p>
-
-<p>
-Nous modifions notre fichier de configuration de l'application <tt>protected/application.xml</tt> en insérant les lignes suivantes, qui indiquent à <tt>Active Record</tt> comment se connecter à notre base de données.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<modules>
- <module id="db" class="System.Data.TDataSourceConfig">
- <database ConnectionString="sqlite:protected/data/blog.db" />
- </module>
- <module class="System.Data.ActiveRecord.TActiveRecordConfig" ConnectionID="db" />
-</modules>
-</com:TTextHighlighter>
-
-<p>
-Dans la configuration précédente, nous avons ajouté deux <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modules</a> à notre application. Le module <tt>TDataSourceConfig</tt> est configuré avec la chaine de connexion <tt>sqlite:protected/data/blog.db</tt> qui pointe vers notre base de données. Cette connexion est utilisée par le module <tt>TActiveRecordConfig</tt> qui est requis pour l'utilisation d'Active Record.
-</p>
-
-<com:InfoBox>
-Il est tout à fait possible de définir plusieurs connexion de base de données dans notre fichier de configuration. Pour plus de détails, veuillez vous référer à la <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">documentation Active Record</a>. Il est, de même possible, d'établir une connexion à une base de données en utilisant du code PHP au travers du composant <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a>.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page deleted file mode 100755 index 1c5aae7b..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page +++ /dev/null @@ -1,177 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création des classes Active Record</h1>
-
-<p>
-Nous avons besoin de définir deux classes <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>, <tt>UserRecord</tt> et <tt>PostRecord</tt>, qui représentent respectivement les tables <tt>users</tt> et <tt>posts</tt>. Les classes Active Record doivent hériter de la classe <tt>ActiveRecord</tt>, et doivent définir les propriétés qui correspondent aux champs de la table correspondante.
-</p>
-
-<p>
-Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier <tt>protected/database</tt> 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 <tt>protected/database</tt> à notre chemin d'inclusion de PHP (<tt>include_path</tt>). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<paths>
- <using namespace="Application.database.*" />
-</paths>
-</com:TTextHighlighter>
-
-<p>
-Au lieu de créer nos classes manuellement, nous allons utiliser les <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">outils en ligne de commande de PRADO</a> pour qu'il nous génère les classes.
-</p>
-
-<p>
-Dans le dossier <tt>blog</tt>, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande:
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
-php path/to/prado-cli.php shell .
-</com:TTextHighlighter>
-
-<p>
-Vous devriez voir
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
-Command line tools for Prado 3.1.0.
-** Loaded PRADO appplication in directory "protected".
-PHP-Shell - Version 0.3.1
-(c) 2006, Jan Kneschke <jan@kneschke.de>
-
->> use '?' to open the inline help
-
->>
-</com:TTextHighlighter>
-
-<p>
-A l'invite de commande, entrer les deux commandes suivantes pour créer les classes <tt>UserRecord</tt> et <tt>PostRecord</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
->> generate users Application.database.UserRecord
-
->> generate posts Application.database.PostRecord
-</com:TTextHighlighter>
-
-<p>
-Ici, nous avons utilisés les <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">espaces de noms</a> pour indiquer où les classes seront créées. Le chemin <tt>Application.database.UserRecord</tt> indique que nous désirons que la classe soit insérée dans <tt>protected/database/UserRecord.php</tt>.
-</p>
-
-<p>
-Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier <tt>protected/database</tt>:
-</p>
-
-<img src="<%~ directories2.gif %>" class="output" />
-
-<p>
-Si vous consultez le fichier <tt>PostRecord</tt>, vous devriez voir le contenu suivant:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRecord extends TActiveRecord
-{
- const TABLE='posts';
- public $post_id;
- public $author_id;
- public $create_time;
- public $title;
- public $content;
- public $status;
-
- public static function finder($className=__CLASS__)
- {
- return parent::finder($className);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Comme vous pouvez le constater, pour chaque champs de la table <tt>posts</tt>, la classe déclare un membre correspondant. La constante <tt>TABLE</tt> indique le nom de la table que gère la classe <tt>PostRecord</tt>. La méthode statique <tt>finder()</tt> permet d'effectuer des requêtes et de lire les données sous forme d'objets <tt>PostRecord</tt>.
-</p>
-<p>
-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 <tt>UserRecord::finder()->findAll()</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
->> PostRecord::finder()->findAll()
-array
-(
- [0] => PostRecord#1
- (
- [post_id] => '1'
- [author_id] => 'admin'
- [create_time] => '1175708482'
- [title] => 'first post'
- [content] => 'this is my first post'
- [status] => '0'
- [TActiveRecord:_readOnly] => false
- [TActiveRecord:_connection] => null
- [TComponent:_e] => array()
- )
-)
-</com:TTextHighlighter>
-
-<h1>Relations entre Posts et Users</h1>
-<p>
-Rappellez-vous qu'il y a une relation entre les tables <tt>users</tt> et <tt>posts</tt>. Le diagramme des relations est indiqué ci-après.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-A partir de ce diagramme, nous voyons que la table <tt>posts</tt> contient un champ <tt>author_id</tt>. Le champ <tt>author_id</tt> est une clé étrangère qui référence la table <tt>users</tt>. En particulier, les valeurs du champ <tt>author_id</tt> doivent apparaitre dans dans le champ <tt>username</tt> de la table <tt>users</tt>. 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".
-</p>
-
-<p>
-Nous pouvons modéliser les relations entre <tt>posts</tt> and <tt>users</tt> dans nos classes <tt>PostRecord</tt> and <tt>UserRecord</tt> en les modifiant comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRecord extends TActiveRecord
-{
- //... propriétés et méthodes comme précédemment
-
- public $author; //contient un objet UserRecord
-
- public static $RELATIONS=array
- (
- 'author' => array(self::BELONGS_TO, 'UserRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-La propriété statique <tt>$RELATIONS</tt> de la classe <tt>PostRecord</tt> définit que la propriété <tt>$author</tt> fait référence à un <tt>UserRecord</tt>. Dans le tableau : <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, le premier élément défini le type de relation, dans notre cas, <tt>self::BELONGS_TO</tt>. Le deuxième élément est le nom de l'objet en relation, dans notre cas <tt>UserRecord</tt>. La classe <tt>UserRecord</tt> est définie comme ci-dessous, la différence est que chaque objet <tt>UserRecord</tt> contient plusieurs <tt>PostRecord</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class UserRecord extends TActiveRecord
-{
- //... propriétés et méthodes comme précédemment
-
- public $posts=array(); //contient un tableau de PostRecord
-
- public static $RELATIONS=array
- (
- 'posts' => array(self::HAS_MANY, 'PostRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-Un tableau de <tt>UserRecord</tt> ainsi que les messages correspondants peuvent être lu de la manière suivante :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-$users = UserRecord::finder()->withPosts()->findAll();
-</com:TTextHighlighter>
-
-<com:TipBox>
-La méthode <tt>withXXX()</tt> (avec XXX qui est le nom de la propriété de la relation, dans notre cas <tt>Posts</tt>) lit les données correspondantes de <tt>PostRecords</tt> en utilisant une deuxième requête (mais pas en utilisant une jointure). La méthode <tt>withXXX()</tt> accepte les mêmes arguments que les autres méthodes <tt>finder</tt> de l'objet Active record, ie : <tt>withPosts('status = ?', 0)</tt>.
-</com:TipBox>
-
-<p>
-Plus d'informations sont disponibles dans le manuel de démarrage rapide <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page deleted file mode 100755 index d982e388..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page +++ /dev/null @@ -1,70 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la base</h1>
-<
-<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> et <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
-</p>
-
-<p>
-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 <tt>users</tt> et <tt>posts</tt>, comme décrit dans le diagramme ci-après.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-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 <tt>protected/schema.sql</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source">
-/* création de la table utilisateurs */
-CREATE TABLE users (
- username VARCHAR(128) NOT NULL PRIMARY KEY,
- email VARCHAR(128) NOT NULL,
- password VARCHAR(128) NOT NULL, /* mot de passe en clair */
- role INTEGER NOT NULL, /* 0: utilisateur normal, 1: administrateur */
- first_name VARCHAR(128),
- last_name VARCHAR(128)
-);
-
-/* création de la table messages */
-CREATE TABLE posts (
- post_id INTEGER NOT NULL PRIMARY KEY,
- author_id VARCHAR(128) NOT NULL
- CONSTRAINT fk_author REFERENCES users(username),
- create_time INTEGER NOT NULL, /* UNIX timestamp */
- title VARCHAR(256) NOT NULL, /* titre du message */
- content TEXT, /* corps du message */
- status INTEGER NOT NULL /* 0: publié; 1: brouillon; 2: en attente; 2: accès interdit */
-);
-
-/* insertion de quelques données initiales */
-INSERT INTO users VALUES ('admin', 'admin@example.com', 'demo', 1, 'Qiang', 'Xue');
-INSERT INTO users VALUES ('demo', 'demo@example.com', 'demo', 0, 'Wei', 'Zhuo');
-INSERT INTO posts VALUES (NULL, 'admin', 1175708482, 'first post', 'this is my first post', 0);
-</com:TTextHighlighter>
-
-<com:NoteBox>
-La contrainte <tt>fk_author</tt> est ignorée par SQlite vu que SQLite ne supporte pas les <a href="http://www.sqlite.org/omitted.html">clés étrangères</a>.
-Néanmoins, nous gardons cette contrainte dans le but de pouvoir porter notre blog sur d'autres SGBD. Par ailleurs, nous utilisons la capacité <a href="http://www.sqlite.org/autoinc.html">auto incrémenté</a> du champ <tt>posts.post_id</tt> si celui-ci est renseigné à NULL lors de l'insertion.
-</com:NoteBox>
-
-<p>
-Nous utilisons après ceci, les <a href="http://www.sqlite.org/download.html">outils en ligne de commande SQLite</a> pour créer la base de données. Nous avons créé un dossier <tt>protected/data</tt> qui contiendra le fichier de base de données. Nous lançons maintenant la ligne de commande suivante dans le dossier <tt>protected/data</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
-sqlite3 blog.db < ../schema.sql
-</com:TTextHighlighter>
-
-<p>
-La base de données est ainsi créée dans le fichier <tt>protected/data/blog.db</tt> et nous pouvons maintenant voir la l'arborescence suivante :
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-<com:NoteBox>
-Il est nécessaire pour SQLite que le dossier <tt>protected/data</tt> et le fichier <tt>protected/data/blog.db</tt> soient accessibles en écriture par le serveur Web.
-</com:NoteBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif b/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif Binary files differdeleted file mode 100755 index 7a5397b3..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd b/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd Binary files differdeleted file mode 100755 index 474833fd..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif Binary files differdeleted file mode 100755 index 797ef932..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif Binary files differdeleted file mode 100755 index b053b4c6..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page deleted file mode 100755 index b9610d21..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page +++ /dev/null @@ -1,46 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Melakukan Koneksi DB</h1>
-
-<p>
-Untuk menggunakan database yang baru saja kita buat, pertama kita perlu melaksanakan koneksinya.
-</p>
-
-<p>
-Kita akan menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> 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.
-</p>
-
-<com:NoteBox>
-Untuk menggunakan DAO, anda harus menginstalasi dan menghidupkan <a href="http://www.php.net/manual/en/ref.pdo.php">ekstensi PDO PHP</a> <i>dan</i> driver PDO spesifik-database (dalam kasus kita, itu adalah driver SQLite PDO). Ini bisa dilakukan secara mudah pada Windows dengan mengubah file <tt>php.ini</tt>, menambahkan baris berikut:
-<com:TTextHighlighter CssClass="source">
-extension=php_pdo.dll
-extension=php_pdo_sqlite.dll
-</com:TTextHighlighter>
-</com:NoteBox>
-
-<p>
-Selanjutnya untuk memisahkan tabel database sebenarnya, kita juga akan menggunakan fitur <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a> (AR). Setiap rekaman data akan disajikan sebagai obyek Rekaman Aktif yang mampu melakukan query, menyimpan dan menghapus tanpa menulis pernyataan SQL.
-</p>
-
-<p>
-Kita memodifikasi file konfigurasi aplikasi kita <tt>protected/application.xml</tt> dengan menyisipkan baris berikut, yang memberitahu Rekaman Aktif bagaimana untuk menghubungkan ke database yang baru saja kita buat:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<modules>
- <module id="db" class="System.Data.TDataSourceConfig">
- <database ConnectionString="sqlite:protected/data/blog.db" />
- </module>
- <module class="System.Data.ActiveRecord.TActiveRecordConfig" ConnectionID="db" />
-</modules>
-</com:TTextHighlighter>
-
-<p>
-Konfigurasi di atas memperlihatkan bahwa kita menambahkan dua <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modul</a> pada aplikasi kita. Modul <tt>TDataSourceConfig</tt> dikonfigurasi dengan string koneksi <tt>sqlite:protected/data/blog.db</tt> yang mengarah ke SQLite database kita. Koneksi ini dipakai oleh modul <tt>TActiveRecordConfig</tt> yang dibutuhkan leh Rekaman Aktif.
-</p>
-
-<com:InfoBox>
-Seseorang dapat menyiapkan dua atau lebih koneksi DB dalam konfigurasi aplikasi. Untuk lebih jelasnya, lihat <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Dokumentasi Rekaman Aktif</a>. Dan tentunya, seseorang juga bisa secara eksplisit membuat koneksi DB dalam kode PHP menggunakan komponen <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a> dalam PDO.
-</com:InfoBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page deleted file mode 100755 index 5a211905..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page +++ /dev/null @@ -1,178 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Kelas Rekaman Aktif</h1>
-
-<p>
-Kita perlu membuat dua kelas <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>, <tt>UserRecord</tt> dan <tt>PostRecord</tt>, masing-masing untuk mewakili rekaman data dalam tabel <tt>users</tt> dan <tt>posts</tt>. Kelas Rekaman Aktif harus diperluas dari kelas basis <tt>ActiveRecord</tt>, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait.
-</p>
-
-<p>
-Untuk mengatur lebih baik direktori, kita membuat direktori baru <tt>protected/database</tt> guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori <tt>protected/database</tt> ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<paths>
- <using namespace="Application.database.*" />
-</paths>
-</com:TTextHighlighter>
-
-<p>
-Daripada menulis kelas secara manual, kita akan menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a> lagi untuk membuat kelas bagi kita.
-</p>
-
-<p>
-Di bawah direktori <tt>blog</tt>, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah:
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
-php path/ke/prado-cli.php shell .
-</com:TTextHighlighter>
-
-<p>
-Kita akan melihat
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
-Command line tools for Prado 3.1.0.
-** Loaded PRADO appplication in directory "protected".
-PHP-Shell - Version 0.3.1
-(c) 2006, Jan Kneschke <jan@kneschke.de>
-
->> use '?' to open the inline help
-
->>
-</com:TTextHighlighter>
-
-<p>
-Pada prompt, masukkan dua perintah berikut untuk membuat kelas <tt>UserRecord</tt> dan <tt>PostRecord</tt>:
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
->> generate users Application.database.UserRecord
-
->> generate posts Application.database.PostRecord
-</com:TTextHighlighter>
-
-<p>
-Di sini kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">format namespace</a> lagi untuk menetapkan kelas yang dibuat. Path <tt>Application.database.UserRecord</tt> menunjukan bahwa kita ingin file kelas <tt>UserRecord</tt> menjadi <tt>protected/database/UserRecord.php</tt>.
-</p>
-
-<p>
-Kita akan melihat struktur direktori berikut dengan dua file baru di bawah <tt>protected/database</tt>:
-</p>
-
-<img src="<%~ directories2.gif %>" class="output" />
-
-<p>
-Jika kita memeriksa file kelas <tt>PostRecord</tt>, kita akan melihat konten berikut.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRecord extends TActiveRecord
-{
- const TABLE='posts';
- public $post_id;
- public $author_id;
- public $create_time;
- public $title;
- public $content;
- public $status;
-
- public static function finder($className=__CLASS__)
- {
- return parent::finder($className);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Seperti kita lihat, untuk setiap field dalam tabel <tt>posts</tt>, kelas mempunyai anggota data terkait. Konstan <tt>TABLE</tt> menetapkan nama tabel untuk <tt>PostRecord</tt>. Metode statis <tt>finder()</tt> membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek <tt>PostRecord</tt>.
-</p>
-
-<p>
-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 <tt>UserRecord::finder()->findAll()</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
->> PostRecord::finder()->findAll()
-array
-(
- [0] => PostRecord#1
- (
- [post_id] => '1'
- [author_id] => 'admin'
- [create_time] => '1175708482'
- [title] => 'first post'
- [content] => 'this is my first post'
- [status] => '0'
- [TActiveRecord:_readOnly] => false
- [TActiveRecord:_connection] => null
- [TComponent:_e] => array()
- )
-)
-</com:TTextHighlighter>
-
-<h1>Hubungan Antara Tulisan dan Pengguna</h1>
-<p>
-Mengingat bahwa ada hubungan kunci asing antara tabel <tt>users</tt> dan <tt>posts</tt>. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel <tt>posts</tt> berisi field bernama <tt>author_id</tt>. Field <tt>author_id</tt> ini adalah kunci asing yang mereferensi tabel <tt>users</tt>. Dalam keadaan tertentu, nilai dalam field <tt>author_id</tt> seharusnya dari tabel <tt>users</tt> field <tt>username</tt>. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan".
-</p>
-
-<p>
-Kita dapat membuat model hubungan antara tabel <tt>posts</tt> dan <tt>users</tt> dalam Rekaman Aktif dengan memodifikasi kelas <tt>PostRecord</tt> dan <tt>UserRecord</tt> seperti berikut.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRecord extends TActiveRecord
-{
- //... properti dan metode seperti sebelumnya
-
- public $author; //menampung array UserRecord
-
- public static $RELATIONS=array
- (
- 'author' => array(self::BELONGS_TO, 'UserRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-Properti statis <tt>$RELATIONS</tt> pada <tt>PostRecord</tt> mendefinisikan bahwa properti <tt>$author</tt> dimiliki <tt>UserRecord</tt>. Dalam <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, elemen pertama mendefinisikan tipe hubungan, dalam hal ini <tt>self::BELONGS_TO</tt>. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini <tt>UserRecord</tt>. <tt>UserRecord</tt> didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak <tt>PostRecord</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class UserRecord extends TActiveRecord
-{
- //... properti dan metode seperti seblumnya
-
- public $posts=array(); //menampung array PostRecord
-
- public static $RELATIONS=array
- (
- 'posts' => array(self::HAS_MANY, 'PostRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-Sebuah array <tt>UserRecord</tt> dengan dan tulisan terkaitnya dapat diambil seperti berikut.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-$users = UserRecord::finder()->withPosts()->findAll();
-</com:TTextHighlighter>
-
-<com:TipBox>
-Metode <tt>withXXX()</tt> (di mana XXX adalah nama properti hubungan, dalam hal ini, <tt>Posts</tt>) mengambil <tt>PostRecords</tt> terkait menggunakan query kedua (tidak dengan menggunakan join). Metode <tt>withXXX()</tt> menerima argumen yang sama sebagai finder lain dari TActiveRecord, misalhnya <tt>withPosts('status = ?', 0)</tt>.
-</com:TipBox>
-
-<p>
-Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page deleted file mode 100755 index 30868268..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page +++ /dev/null @@ -1,69 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Database</h1>
-
-<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> dan <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
-</p>
-
-<p>
-Untuk keperluan tutorial, kita menyederhanakan kebutuhan sistem blog kita agar hanya perlu berhadapan dengan pengguna dan data tulisan. Selanjutnya kita membuat dua tabel database, <tt>users</tt> dan <tt>posts</tt>, seperti diperlihatkan dalam duagram hubungan entitas atau entity-relationship (ER) di bawah ini.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-Kita menggunakan SQLite 3 database untuk menyimpan data kita. Pertama kita ubah diagram ER ke dalam pernyataan SQL berikut dan menyimpannya dalam file <tt>protected/schema.sql</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="sql">
-/* buat tabel pengguna */
-CREATE TABLE users (
- username VARCHAR(128) NOT NULL PRIMARY KEY,
- email VARCHAR(128) NOT NULL,
- password VARCHAR(128) NOT NULL, /* dalam teks biasa */
- role INTEGER NOT NULL, /* 0: pengguna normal, 1: administrator */
- first_name VARCHAR(128),
- last_name VARCHAR(128)
-);
-
-/* buat tabel tulisan */
-CREATE TABLE posts (
- post_id INTEGER NOT NULL PRIMARY KEY,
- author_id VARCHAR(128) NOT NULL
- CONSTRAINT fk_author REFERENCES users(username),
- create_time INTEGER NOT NULL, /* cap waktu UNIX */
- title VARCHAR(256) NOT NULL, /* judul tulisan */
- content TEXT, /* badan tulisan */
- status INTEGER NOT NULL /* 0: diterbitkan; 1: draft; 2: ditunda; 2: ditolak */
-);
-
-/* sisipkan beberapa rekaman data awal untuk pengujian */
-INSERT INTO users VALUES ('admin', 'admin@example.com', 'demo', 1, 'Qiang', 'Xue');
-INSERT INTO users VALUES ('demo', 'demo@example.com', 'demo', 0, 'Wei', 'Zhuo');
-INSERT INTO posts VALUES (NULL, 'admin', 1175708482, 'first post', 'this is my first post', 0);
-</com:TTextHighlighter>
-
-<com:NoteBox>
-Batasan <tt>fk_author</tt> diabaikan oleh SQLite karena tidak mendukung <a href="http://www.sqlite.org/omitted.html">batasan kunci asing</a>. Meskipun demikian, kita masih memelihara batasan di sana untuk kemampuan pemindahan sistem blog kita ke DBMS yang berbeda. Juga, dalam contoh di atas kita mengeksploitasi bukti bahwa field <tt>posts.post_id</tt> adalah <a href="http://www.sqlite.org/autoinc.html">auto-incremental</a> jika kita menempatkan NULL untuk nilainya.
-</com:NoteBox>
-
-<p>
-Kemudian kita menggunakan <a href="http://www.sqlite.org/download.html">piranti baris perintah SQLite</a> untuk membuat SQLite database. Kita membuat sebuah direktori <tt>protected/data</tt> untuk menampung file database SQLite. Sekarang kita menjalankan perintah berikut di bawah direktori <tt>protected/data</tt>:
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
-sqlite3 blog.db < ../schema.sql
-</com:TTextHighlighter>
-
-<p>
-Database sudah dibuat sebagai <tt>protected/data/blog.db</tt> dan kita akan melihat direktori dan file berikut:
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-<com:NoteBox>
-SQLite memerlukan direktori <tt>protected/data</tt> dan file database <tt>protected/data/blog.db</tt> keduanya disetel agar bisa ditulisi oleh proses server Web.
-</com:NoteBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/ER.gif b/demos/blog-tutorial/protected/pages/Day2/id/ER.gif Binary files differdeleted file mode 100755 index 7a5397b3..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/ER.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/id/directories.gif b/demos/blog-tutorial/protected/pages/Day2/id/directories.gif Binary files differdeleted file mode 100755 index 797ef932..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif Binary files differdeleted file mode 100755 index b053b4c6..00000000 --- a/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/Auth.page b/demos/blog-tutorial/protected/pages/Day3/Auth.page index 8d066b24..2eacd4be 100755 --- a/demos/blog-tutorial/protected/pages/Day3/Auth.page +++ b/demos/blog-tutorial/protected/pages/Day3/Auth.page @@ -3,7 +3,7 @@ <h1>Authentication and Authorization</h1>
<p>
-Before we set off to implement the user pages, we need to do some work to enable <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Advanced.Auth">authentication and authorization</a>.
+Before we set off to implement the user pages, we need to do some work to enable <a href="http://www.pradoframework.net/site/demos/quickstart/index.php?page=Advanced.Auth">authentication and authorization</a>.
</p>
<p>
@@ -26,11 +26,11 @@ We add two new modules to the application configuration as follows: </com:TTextHighlighter>
<p>
-The <a href="http://www.pradosoft.com/docs/classdoc/TAuthManager">TAuthManager</a> module manages the whole authentication and authorization workflow. It uses the <tt>users</tt> module as its user manager (see below). By specifying the <tt>LoginPage</tt> property, we inform the auth manager to redirect user's browser to the <tt>LoginUser</tt> page when an authorization fails. We will describe how to create <tt>LoginUser</tt> in the next subsection.
+The <a href="http://pradosoft.github.io/docs/manual/class-TAuthManager">TAuthManager</a> module manages the whole authentication and authorization workflow. It uses the <tt>users</tt> module as its user manager (see below). By specifying the <tt>LoginPage</tt> property, we inform the auth manager to redirect user's browser to the <tt>LoginUser</tt> page when an authorization fails. We will describe how to create <tt>LoginUser</tt> in the next subsection.
</p>
<p>
-The <tt>user</tt> module is of class <a href="http://www.pradosoft.com/docs/classdoc/TDbUserManager">TDbUserManager</a> which is responsible to verify the validity of a user and keep basic user data in the PHP session. The <tt>UserClass</tt> property is initialized as <tt>Application.BlogUser</tt>, which indicates the user manager would look for a <tt>BlogUser</tt> class under the directory <tt>protected</tt> (remember the alias <tt>Application</tt> refers to the <tt>protected</tt> directory) and use it to keep user's session data.
+The <tt>user</tt> module is of class <a href="http://pradosoft.github.io/docs/manual/class-TDbUserManager">TDbUserManager</a> which is responsible to verify the validity of a user and keep basic user data in the PHP session. The <tt>UserClass</tt> property is initialized as <tt>Application.BlogUser</tt>, which indicates the user manager would look for a <tt>BlogUser</tt> class under the directory <tt>protected</tt> (remember the alias <tt>Application</tt> refers to the <tt>protected</tt> directory) and use it to keep user's session data.
</p>
<p>
@@ -38,7 +38,7 @@ As we will see in later sections, in controls and pages, we can use <tt>$this->U </p>
<p>
-Below is the implementation detail of <tt>BlogUser</tt>. Notice <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Database.ActiveRecord">Active Record</a> is used to perform DB query. For example, we use <tt>UserRecord::finder()->findByPk($username)</tt> to look for the primary key specified by <tt>$username</tt> in the <tt>users</tt> table.
+Below is the implementation detail of <tt>BlogUser</tt>. Notice <a href="http://www.pradoframework.net/site/demos/quickstart/index.php?page=Database.ActiveRecord">Active Record</a> is used to perform DB query. For example, we use <tt>UserRecord::finder()->findByPk($username)</tt> to look for the primary key specified by <tt>$username</tt> in the <tt>users</tt> table.
</p>
<com:TTextHighlighter CssClass="source" Language="php">
diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page index a278fa69..06e3dbdc 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page @@ -22,13 +22,13 @@ We create two files <tt>protected/pages/users/AdminUser.page</tt> and <tt>protec <h2>Creating Page Template</h2>
<p>
-We use <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.DataGrid">TDataGrid</a> to display the user accounts. Based on the above analysis, we configure the following four columns:
+We use <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.DataGrid">TDataGrid</a> to display the user accounts. Based on the above analysis, we configure the following four columns:
</p>
<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/THyperLinkColumn">THyperLinkColumn</a> displays the username column. The URL is constructed according to the PHP expression specified in the <tt>DataNavigateUrlFormatString</tt> property.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TBoundColumn">TBoundColumn</a> displays the email column.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TCheckBoxColumn">TCheckBoxColumn</a> uses checkboxes to indicate whether a user account is of role administrator.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TButtonColumn">TButtonColumn</a> displays a column of "Delete" buttons.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-THyperLinkColumn">THyperLinkColumn</a> displays the username column. The URL is constructed according to the PHP expression specified in the <tt>DataNavigateUrlFormatString</tt> property.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TBoundColumn">TBoundColumn</a> displays the email column.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TCheckBoxColumn">TCheckBoxColumn</a> uses checkboxes to indicate whether a user account is of role administrator.</li>
+<li><a href="http://pradosoft.github.io/docs/manual/class-TButtonColumn">TButtonColumn</a> displays a column of "Delete" buttons.</li>
</ul>
<p>The complete page template is shown as follows:</p>
@@ -123,7 +123,7 @@ In the above, the <tt>deleteButtonClicked()</tt> method is invoked whenever a "D </p>
<com:TipBox>
-All <a href="http://www.pradosoft.com/docs/classdoc/TDataBoundControl">data-bound</a> controls have similar usage pattern. That is, set the <tt>DataSource</tt> property with the data and call <tt>dataBind()</tt> method to binds the data to the control's internal structure.
+All <a href="http://pradosoft.github.io/docs/manual/class-TDataBoundControl">data-bound</a> controls have similar usage pattern. That is, set the <tt>DataSource</tt> property with the data and call <tt>dataBind()</tt> method to binds the data to the control's internal structure.
</com:TipBox>
diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page index 6023450c..e6fd16e1 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page @@ -24,7 +24,7 @@ We create two files <tt>protected/pages/users/EditUser.page</tt> and <tt>protect As you may have guessed, the page template <tt>EditUser</tt> is largely the same as that of <tt>NewUser</tt>. Besides the difference in page title and the caption of the submit button, there are three main differences.
</p>
<ul>
-<li>The "username" text box is replaced by a <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Label">TLabel</a> control because we do not allow modifying username;</li>
+<li>The "username" text box is replaced by a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Label">TLabel</a> control because we do not allow modifying username;</li>
<li>The validator for the "password" input is removed. This is because if the user does not provide a password during editting, it means the user does not want to change the password.</li>
<li>The "role" input is surrounded with <tt>TControl</tt> whose visibility is toggled according to the role of the currently logged-in user. If the user is not an administrator, the "role" input will not be displayed because normal users are not allowed to modify their roles.</li>
</ul>
@@ -184,7 +184,7 @@ class EditUser extends TPage </com:TTextHighlighter>
<com:TipBox>
-The <tt>onInit()</tt> method is invoked by PRADO during one of the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">page lifecycles</a>. Other commonly overriden lifecycle methods include <tt>onPreInit()</tt>, <tt>onLoad()</tt> and <tt>onPreRender()</tt>.
+The <tt>onInit()</tt> method is invoked by PRADO during one of the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Pages">page lifecycles</a>. Other commonly overriden lifecycle methods include <tt>onPreInit()</tt>, <tt>onLoad()</tt> and <tt>onPreRender()</tt>.
</com:TipBox>
<h2>Adding Permission Check</h2>
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 <tt>protected/pages/users/LoginUser.page</tt> and <tt>protec <h2>Creating Page Template</h2>
<p>
-Below we show the template for <tt>LoginUser</tt>. 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 <tt>TRequiredFieldValidator</tt>. The correctness of the password input is ensured by the <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Controls.Validation">TCustomValidator</a> which invokes the page's <tt>validateUser()</tt> method when validation is performed. The page also has "login" button which invokes the page's <tt>loginButtonClicked()</tt> when it is clicked.
+Below we show the template for <tt>LoginUser</tt>. 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 <tt>TRequiredFieldValidator</tt>. The correctness of the password input is ensured by the <a href="http://www.pradoframework.net/site/demos/quickstart/index.php?page=Controls.Validation">TCustomValidator</a> which invokes the page's <tt>validateUser()</tt> method when validation is performed. The page also has "login" button which invokes the page's <tt>loginButtonClicked()</tt> when it is clicked.
</p>
<com:TTextHighlighter CssClass="source" Language="prado">
diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page index 4dca21c2..06953fe2 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page @@ -156,7 +156,7 @@ class NewUser extends TPage </com:TTextHighlighter>
<p>
-In the above, calling <tt>save()</tt> will insert a new row in the <tt>users</tt> table. This intuitive feature is enabled by <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
+In the above, calling <tt>save()</tt> will insert a new row in the <tt>users</tt> table. This intuitive feature is enabled by <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
</p>
<com:NoteBox>
@@ -174,7 +174,7 @@ To test the <tt>NewUser</tt> page, visit the URL <tt>http://hostname/blog/index. <h2>Adding Permission Check</h2>
<p>
-During testing, you may have asked: shouldn't the <tt>NewUser</tt> page be only accessible by the administrator user? Yes, this is called <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Auth">authorization</a>. We now describe how we add this permission check to the <tt>NewUser</tt> page.
+During testing, you may have asked: shouldn't the <tt>NewUser</tt> page be only accessible by the administrator user? Yes, this is called <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.Auth">authorization</a>. We now describe how we add this permission check to the <tt>NewUser</tt> page.
</p>
<p>
@@ -182,7 +182,7 @@ A straightforward way of performing permission check is in the page class where </p>
<p>
-PRADO offers a more systematic way of checking page access permissions. To do so, we need to use <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">page configuration</a>. Create a file <tt>protected/pages/users/config.xml</tt> with the content as follows:
+PRADO offers a more systematic way of checking page access permissions. To do so, we need to use <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Configurations.PageConfig">page configuration</a>. Create a file <tt>protected/pages/users/config.xml</tt> with the content as follows:
</p>
<com:TTextHighlighter CssClass="source" Language="xml">
@@ -204,7 +204,7 @@ Now if we visit the <tt>NewUser</tt> page as a guest, we will be redirected to t </p>
<com:TipBox>
-Page configuration can contain more than authorization rules. For example, it can include <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modules</a> like we did in the <a href="?page=Day2.ConnectDB">application configuration</a>. For a PRADO application, each page directory can have a page configuration which applies to the pages in the same directory and all its subdirectories.
+Page configuration can contain more than authorization rules. For example, it can include <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Modules">modules</a> like we did in the <a href="?page=Day2.ConnectDB">application configuration</a>. For a PRADO application, each page directory can have a page configuration which applies to the pages in the same directory and all its subdirectories.
</com:TipBox>
</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page b/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page deleted file mode 100755 index 0cced90b..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page +++ /dev/null @@ -1,106 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Authentification et Autorisation</h1>
-
-
-<p>
-Avant que nous n'implémentions la gestion des utilisateurs, nous devons activer les modules <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Advanced.Auth">authentification et autorisation</a>.
-</p>
-
-
-<p>
-Nous ajoutons deux nouveaux modules à notre fichier de configuration de l'application.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<modules>
- ...modules TDataSourceConfig et TActiveRecordConfig ...
-
- <module id="auth"
- class="System.Security.TAuthManager"
- UserManager="users"
- LoginPage="users.LoginUser" />
-
- <module id="users"
- class="System.Security.TDbUserManager"
- UserClass="Application.BlogUser" />
-</modules>
-</com:TTextHighlighter>
-
-<p>
-Le module <a href="http://www.pradosoft.com/docs/classdoc/TAuthManager">TAuthManager</a> gère le processus d'authentification et d'autorisation. Il utilise le module <tt>users</tt> comme gestionnaire d'utilisateur (voir ci-après). En spécifiant la propriété <tt>LoginPage</tt>, nous indiquons au module d'authentification de rediriger vers la page <tt>LoginUser</tt> quand il est nécessaire de s'authentifier. Nous décrirons comment créer la page <tt>LoginUser</tt> ci-après.
-</p>
-
-<p>
-Le module <tt>user</tt> est une classe de type <a href="http://www.pradosoft.com/docs/classdoc/TDbUserManager">TDbUserManager</a> 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é <tt>UserClass</tt> est initialisée comme étant de type <tt>Application.BlogUser</tt>, ceci indique au module <tt>user</tt> de chercher une classe <tt>BlogUser</tt> dans le dossier <tt>protected</tt> (rappellez-vous que l'alias <tt>Application</tt> fait référence au dossier <tt>protected</tt>) et d'utiliser cette classe pour conserver les données utilisateurs dans une session.
-Le module <tt>user</tt> est une classe de type <a href="http://www.pradosoft.com/docs/classdoc/TDbUserManager">TDbUserManager</a> 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é <tt>UserClass</tt> est initialisée comme étant de type <tt>Application.BlogUser</tt>, ceci indique au module <tt>user</tt> de chercher une classe <tt>BlogUser</tt> dans le dossier <tt>protected</tt> (rappellez-vous que l'alias <tt>Application</tt> fait référence au dossier <tt>protected</tt>) et d'utilisez cette classe pour conserver les données utilisateurs dans une session.
-</p>
-
-<p>
-Comme vous pourrez le constater dans les sections suivantes, dans les différents contrôles et pages, nous pourrons utiliser <tt>$this->User</tt> pour accéder à l'objet qui contient les informations de l'utilisateur actuellement connecté.
-</p>
-
-
-<p>
-Ci-dessous les détails de l'implémentation de la classe <tt>BlogUser</tt>. Remarquez que les <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Database.ActiveRecord">Active Record</a> sont utilisés pour exécuter une requête. Par exemple, nous utilisons <tt>UserRecord::finder()->findByPk($username)</tt> pour chercher la valeur de <tt>$username</tt> dans la table <tt>users</tt> et ceci par la clé primaire.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-// Include TDbUserManager.php file which defines TDbUser
-Prado::using('System.Security.TDbUserManager');
-
-/**
- * La classe BlogUser.
- * BlogUser représente les données utilisateurs à conserver en session.
- * L'implémentation par défaut conserve le nom et le rôle de l'utilisateur.
- */
-class BlogUser extends TDbUser
-{
- /**
- * Créer un objet de type BlogUser basé sur le nom de l'utilisateur.
- * Cette méthode est requise par TDbUser. Cet objet vérifie si l'utilisateur
- * est bien présent en base de données. Si oui, un objet BlogUser
- * est créé et initialisé.
- * @param string le nom de l'utilisateur
- * @return l'objet BlogUser, null si le nom de l'utilisateur est invalide.
- */
- public function createUser($username)
- {
- // utilise l'Active Record UserRecord pour chercher l'utilisateur username
- $userRecord=UserRecord::finder()->findByPk($username);
- if($userRecord instanceof UserRecord) // si trouvé
- {
- $user=new BlogUser($this->Manager);
- $user->Name=$username; // enregistre le nom de l'utilisateur
- $user->Roles=($userRecord->role==1?'admin':'user'); // et son rôle
- $user->IsGuest=false; // l'utilisateur n'est pas un invité
- return $user;
- }
- else
- return null;
- }
-
- /**
- * Vérifie que le nom d'utilisateur et son mot de passe sont correct.
- * Cette méthode est requise par TDbUser.
- * @param string le nom de l'utilisateur
- * @param string le mot de passe
- * @return boolean en fonction de la validité de la vérification.
- */
- public function validateUser($username,$password)
- {
- // utilise l'Active Record UserRecord pour vérifier le nom d'utilisateur couplé au mot de passe.
- return UserRecord::finder()->findBy_username_AND_password($username,$password)!==null;
- }
-
- /**
- * @return boolean indiquant si l'utilisateur est un administrateur.
- */
- public function getIsAdmin()
- {
- return $this->isInRole('admin');
- }
-}
-</com:TTextHighlighter>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page deleted file mode 100755 index 7cb8fef8..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page +++ /dev/null @@ -1,144 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page d'administration des utilisateurs <tt>AdminUser</tt></h1>
-
-<p>
-La page <tt>AdminUser</tt> 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.
-</p>
-
-
-<p>
-Nous allons lister les utilisateurs dans une table HTML. Chaque ligne correspondra à un compte utilisateur, les colonnes suivantes seront affichées:
-</p>
-
-<ul>
-<li>Pseudo - affiche le pseudo de l'utilisateur. Dans chaque cellule un lien sera affiché qui nous dirigera vers la page <a href="?page=Day3.CreateEditUser">EditUser</a>.</li>
-<li>Email - affiche l'email.</li>
-<li>Administrateur - indique si le compte est celui d'un administrateur.</li>
-<li>Commande - affiche une colonne de bouton "supprimer". En cliquant sur un de ces boutons, la suppression du compte sera effectuée.</li>
-</ul>
-
-<p>
-Nous créons deux fichiers <tt>protected/pages/users/AdminUser.page</tt> et <tt>protected/pages/users/AdminUser.php</tt> qui contiendront respectivement le gabarit et la classe.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-Nous allons utiliser un contrôle <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.DataGrid">TDataGrid</a> pour afficher les données. Suivant l'analyse précédente, nous allons configurer quatre colonnes:
-</p>
-
-<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/THyperLinkColumn">THyperLinkColumn</a> affiche le pseudo. L'URL sera construite suivant les instructions de la propriété <tt>DataNavigateUrlFormatString</tt>.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TBoundColumn">TBoundColumn</a> affiche l'email.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TCheckBoxColumn">TCheckBoxColumn</a> utilise des cases à cocher pour indiquer si le compte est un compte administrateur.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TButtonColumn">TButtonColumn</a> affiche un bouton "Supprimer".</li>
-</ul>
-
-
-<p>Le gabarit complet est affiché ci-après:</p>
-
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon Blog - Administration des comptes utilisateurs" %>
-
-<com:TContent ID="Main">
-
-<h1>Administration des comptes utilisateurs</h1>
-
-<a href="<%= $this->Service->constructUrl('users.NewUser')%>">Créer un nouvel utilisateur</a>
-<br/>
-
-<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>
-</com:TTextHighlighter>
-
-
-<h2>Création du fichier de classe</h2>
-
-
-<p>
-Dans le gabarit précédent, le bouton <tt>OnDeleteCommand</tt> déclenche l'évènement <tt>deleteButtonClicked()</tt> 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 :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class AdminUser extends TPage
-{
- /**
- * Remplis la grille avec la liste des utilisateurs.
- * Cette méthode est appelée lors de l'initialisation de la page.
- * @param mixed param : paramètres de l'évènement
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // lit tout les comptes utilisateurs
- $this->UserGrid->DataSource=UserRecord::finder()->findAll();
- // et les associes à la grille
- $this->UserGrid->dataBind();
- }
-
- /**
- * Supprime un compte utilisateur.
- * Cette méthode répond à l'évènement OnDeleteCommand.
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function deleteButtonClicked($sender,$param)
- {
- // récupère l'identifiant du bouton sur lequel on a cliqué
- $item=$param->Item;
- // récupère auprès de la grille la clé primaire correspondante à l'identifiant
- $username=$this->UserGrid->DataKeys[$item->ItemIndex];
- // supprime le compte utilisateur en utilisant la clé primaire
- UserRecord::finder()->deleteByPk($username);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dans le code précédent, la méthode <tt>deleteButtonClicked()</tt> est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété <tt>Item.ItemIndex</tt> 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é <tt>DataKeys</tt>.
-Dans le code précédent, la méthode <tt>deleteButtonClicked()</tt> est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété <tt>Item.ItemIndex</tt> 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é <tt>DataKeys</tt>.
-</p>
-
-<com:TipBox>
-Tous les <a href="http://www.pradosoft.com/docs/classdoc/TDataBoundControl">contrôles liés</a> sont basé sur le même modèle. C'est à dire, définition de la propriété <tt>DataSource</tt> pour savoir d'où proviennent les données et appel à la méthode <tt>dataBind()</tt> pour effectivement lier les données au contrôle.
-</com:TipBox>
-
-<h2>Test</h2>
-<!-- <h2>Testing</h2> -->
-<p>
-Pour tester notre page <tt>AdminUser</tt>, nous naviguons à l'adresse <tt>http://hostname/blog/index.php?page=users.AdminUser</tt>. 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.
-</p>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page deleted file mode 100755 index db410253..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page +++ /dev/null @@ -1,215 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page de mise à jour des utilisateurs <tt>EditUser</tt></h1>
-
-<p>
-La page <tt>EditUser</tt> ressemble beaucoup à la page <a href="?page=Day3.CreateNewUser">NewUser</a>. La différence principale est le fait que lorsque la page <tt>EditUser</tt> est requise, les champs sont renseignés avec les données de l'utilisateur en cours. Une autre différence est que la page <tt>EditUser</tt> est accessible à un utilisateur standard.
-</p>
-
-<p>
-Pour définir quels sont les comptes qui peuvent être modifiés, nous allons utiliser les règles suivantes :
-</p>
-<ul>
-<li>Si l'utilisateur actuel est un administrateur, il peut modifier n'importe quel compte utilisateur en spécifiant le pseudo de l'utilisateur dans l'URL sous la forme ?username='le nom'. Par exemple : <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>.</li>
-<li>Si l'utilisateur actuel est un administrateur et qu'il n'a pas précisé d'username, ce sont les informations de l'administrateur qui seront mise à jour.</li>
-<li>Si l'utilisateur actuel est un utilisateur standard, seules les données de son compte seront accessibles et il ne pourra pas modifier son rôle.</li>
-</ul>
-
-<p>
-Nous créons deux fichiers <tt>protected/pages/users/EditUser.page</tt> et <tt>protected/pages/users/EditUser.php</tt> qui contiendront respectivement le gabarit et la classe.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-Comme vous avez pu le deviner, la page <tt>EditUser</tt> est fortement ressemblante à la page <tt>NewUser</tt>. En dehors du titre de la page et du bouton "envoyer", il y a trois différences principales.
-</p>
-
-<ul>
-<li>Le champ de saisie "username" est remplacé par un contrôle <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Label">TLabel</a> vu qu'il n'est pas autorisé de modifier son pseudo;</li>
-<li>Le validateur pour le champ "password" est supprimé. Si l'utilisateur ne fournit pas de mot de passe durant la modification, cela indique que l'utilisateur ne veut pas en changer.</li>
-<li>Le champ "role" est entouré d'un <tt>TControl</tt>, ce qui nous permet de la rendre visible ou invisible en fonction de rôle de l'utilisateur connecté. Si l'utilisateur n'est pas un administrateur, le champ "role" ne sera pas affiché. Les utilisateurs standard n'ont pas le droit de modifier leur rôle.</li>
-</ul>
-
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon blog - Mise à jour utilisateur" %>
-
-<com:TContent ID="Main">
-
-<h1>Mise à jour utilisateur</h1>
-
-<span>Pseudo:</span>
-<com:TLabel ID="Username" />
-
-<br/>
-<span>Mot de passe:</span>
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<span>Confirmation mot de passe:</span>
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Différence entre le mot de passe et la confirmation."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-<br/>
-<span>Email:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Email"
- ErrorMessage="Veuillez indiquer votre email."
- Display="Dynamic" />
-<com:TEmailAddressValidator
- ControlToValidate="Email"
- ErrorMessage="Vous avez indiqué un email invalide."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<com:TControl Visible="<%= $this->User->IsAdmin %>">
-<br/>
-<span>Role:</span>
-<br/>
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Utilisateur standard" Value="0" />
- <com:TListItem Text="Administrateur" Value="1" />
-</com:TDropDownList>
-</com:TControl>
-
-<br/>
-<span>Prénom:</span>
-<br/>
-<com:TTextBox ID="FirstName" />
-
-<br/>
-<span>Nom:</span>
-<br/>
-<com:TTextBox ID="LastName" />
-
-<br/>
-<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Création du fichier de classe</h2>
-
-
-<p>
-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 <tt>saveButtonClicked()</tt> appelée par l'évènement <tt>OnClick</tt> du bouton "Enregistrer".
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class EditUser extends TPage
-{
- /**
- * Initialise les champs avec les données de l'utilisateur.
- * Cette méthode est appelée par le framework lorsque la page est initialisée.
- * @param mixed param : paramètres de l'évènement
- */
- public function onInit($param)
- {
- parent::onInit($param);
- if(!$this->IsPostBack) // est-ce que c'est le premier appel à la page
- {
- // Lit les informations de l'utilisateur. C'est équivalent à :
- // $userRecord=$this->getUserRecord();
- $userRecord=$this->UserRecord;
-
- // Rempli les contrôles avec les données de l'utilisateur
- $this->Username->Text=$userRecord->username;
- $this->Email->Text=$userRecord->email;
- $this->Role->SelectedValue=$userRecord->role;
- $this->FirstName->Text=$userRecord->first_name;
- $this->LastName->Text=$userRecord->last_name;
- }
- }
-
- /**
- * Enregistre les modifications si tous les validateurs sont Ok.
- * Cette méthode répond à l'évènement OnClick du bouton "Enregistrer".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function saveButtonClicked($sender,$param)
- {
- if($this->IsValid) // toutes les validations Ok ?
- {
- // Lit les informations de l'utilisateur.
- $userRecord=$this->UserRecord;
-
- // Enresgistre les valeurs dans les champs de la BDD
- $userRecord->username=$this->Username->Text;
- // mets à jour le mot de passe s'il n'est pas vide
- if(!empty($this->Password->Text))
- $userRecord->password=$this->Password->Text;
- $userRecord->email=$this->Email->Text;
- // mets à jour le rôle si l'utilisateur actuel est un administrateur
- if($this->User->IsAdmin)
- $userRecord->role=(int)$this->Role->SelectedValue;
- $userRecord->first_name=$this->FirstName->Text;
- $userRecord->last_name=$this->LastName->Text;
-
- // enregistre les modifications dans la BDD
- $userRecord->save();
-
- // redirige vers la page d'accueil
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
- }
-
- /**
- * Retourne l'utilisateur qui doit être mis à jour.
- * @return UserRecord l'utilisateur qui doit être modifié.
- * @throws THttpException si l'utilisateur n'existe pas.
- */
- protected function getUserRecord()
- {
- // l'utilisateur à modifié est l'utilisateur actuellement connecté
- $username=$this->User->Name;
- // si la variable GET 'username' n'est pas vide et que l'utilisateur actuel
- // est un administrateur, nous utilisons la variable GET à la place
- if($this->User->IsAdmin && $this->Request['username']!==null)
- $username=$this->Request['username'];
-
- // lit les données de l'utilisateur par Active Record
- $userRecord=UserRecord::finder()->findByPk($username);
- if(!($userRecord instanceof UserRecord))
- throw new THttpException(500,'Username is invalid.');
- return $userRecord;
- }
-}
-</com:TTextHighlighter>
-
-<com:TipBox>
-La méthode <tt>onInit()</tt> est appelée par PRADO lors du <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">cycle de vie de la page</a>. Les autres méthodes couramment surchargées sont <tt>onPreInit()</tt>, <tt>onLoad()</tt> et <tt>onPreRender()</tt>.
-</com:TipBox>
- -<h2>Ajout de la vérification des droits d'accès</h2> -<p> -Pour rendre la page <tt>EditUser</tt> accessible également par les utilisateurs authentifiés (<tt>users="@"</tt>), nous devons modifier le fichier de configuration <tt>protected/pages/users/config.xml</tt>. -</p> - -<com:TTextHighlighter CssClass="source" Language="xml"> -<?xml version="1.0" encoding="utf-8"?> -<configuration> - <authorization> - <allow roles="admin"/> - <allow users="@" pages="EditUser"/> - <deny users="*"/> - </authorization> -</configuration> - </com:TTextHighlighter> -
-<h2>Test</h2>
-
-<p>
-Pour tester la page <tt>EditUser</tt>, rendons-nous à l'URL <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>. 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.
-</p>
-
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page deleted file mode 100755 index 07e97b87..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page +++ /dev/null @@ -1,161 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page <tt>LoginUser</tt></h1>
-
-<p>
-La page <tt>LoginUser</tt> affiche un formulaire et gère l'authentification de l'utilisateur. Comme décrit dans <a href="?page=Day3.Auth">authentification et autorisation</a>, le navigateur est automatiquement redirigé vers la page <tt>LoginUser</tt> quand un utilisateur essaye d'accéder à une page protégée, telle que la page d'administration des utilisateurs.
-</p>
-
-<p>
-Le processus de la page <tt>LoginUser</tt> est similaire à celui de la page <a href="?page=Day1.CreateContact">Contact</a>:
-</p>
-<ol>
-<li>Quand un utilisateur accède à la page <tt>LoginUser</tt>, un formulaire est affiché;</li>
-<li>L'utilisateur remplit les champs, nom de l'utilisateur et mot de passe et clique sur le bouton "envoyer";</li>
-<li>La classe <tt>LoginUser</tt> reçoit l'évènement "login" et lance la séquence d'authentification;</li>
-<li>Si le nom d'utilisateur et le mot de passe sont corrects, le système l'enregistre en session et le redirige vers la page protégée demandée. Dans le cas contraire, un message "mot de passe invalide" est affiché.
-</ol>
-
-<p>
-Nous créons les deux fichiers <tt>protected/pages/users/LoginUser.page</tt> et <tt>protected/pages/users/LoginUser.php</tt> qui enregistre le gabarit et la classe respectivement.
-</p>
-
-<h2>Création du gabarit</h2>
-
-<p>
-Ci-après est affiché le gabarit pour <tt>LoginUser</tt>. 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 <tt>TRequiredFieldValidator</tt> contrôle. La validité du mot de passe est assurée par le validateur <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Controls.Validation">TCustomValidator</a> qui fait un appel à la méthode <tt>validateUser()</tt> de la classe. La page contient aussi un bouton "envoyer" qui fait un appel à <tt>loginButtonClicked()</tt> quand il est activé.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - Login" %>
-
-<com:TContent ID="Main">
-
-<h1>Connexion</h1>
-
-<span>Votre nom:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Veuillez indiquer votre nom."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Username" />
-
-<br/>
-<span>Mot de passe:</span>
-<com:TCustomValidator
- ControlToValidate="Password"
- ErrorMessage="vous avez saisi un mot de passe invalide."
- Display="Dynamic"
- OnServerValidate="validateUser" />
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<com:TButton Text="Envoyer" OnClick="loginButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<h2>Création de la classe</h2>
-
-<p>
-Tout comme la page <a href="?page=Day1.CreateContact">Contact</a>, la page <tt>LoginUser</tt> 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 : <tt>validateUser()</tt> et <tt>loginButtonClicked()</tt>. Dans <tt>validateUser()</tt>, nous utilisons le <a href="?page=Day3.Auth">gestionnaire d'authentification</a> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class LoginUser extends TPage
-{
- /**
- * Vérifie la validité du nom d'utilisateur et du mot de passe.
- * Cette méthode implémente l'évènement <tt>OnServerValidate</tt> du validateur <tt>TCustomValidator</tt>.
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function validateUser($sender,$param)
- {
- $authManager=$this->Application->getModule('auth');
- if(!$authManager->login($this->Username->Text,$this->Password->Text))
- $param->IsValid=false; // indique au validateur que la validation à échoué
- }
-
- /**
- * Rédirige le navigateur vers l'URL originellement demandée si la validation est Ok.
- * Cette méthode implémente l'évènement <tt>OnClick</tt> du bouton "envoyer".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function loginButtonClicked($sender,$param)
- {
- if($this->Page->IsValid) // toutes les validations sont ok ?
- {
- // récupère l'URL de la page protégée qui avait été demandée par l'utilisateur
- $url=$this->Application->getModule('auth')->ReturnUrl;
- if(empty($url)) // l'utilisateur à accéder à la page de connexion directement
- $url=$this->Service->DefaultPageUrl;
- $this->Response->redirect($url);
- }
- }
-}
-</com:TTextHighlighter>
-
-
-<h2>Test</h2>
-
-<p>
-Nous avons donc créé la page <tt>LoginUser</tt>. Nous pouvons la tester en naviguant à l'URL <tt>http://hostname/blog/index.php?page=users.LoginUser</tt>. Rappellez-vous que la dans la section <a href="?page=Day2.CreateDB">Création de la base</a>, nous avons déjà créé deux comptes utilisateurs (nom d'utilisateur/mot de passe) <tt>admin/demo</tt> et <tt>demo/demo</tt>. Nous pouvons donc les utiliser pour tester notre page de connexion.
-</p>
-
-<img src="<%~ output.gif %>" class="output"/>
-
-<h2>Ajout des liens de connexion/déconnexion à notre gabarit principal</h2>
-<p>
-Pour permettre à l'utilisateur d'accéder directement aux pages de connexion/déconnexion, nous modifions le gabarit principal <tt>MainLayout</tt>. En particulier, nous ajoutons un lien vers la page <tt>LoginUser</tt>. Nous ajoutons aussi un lien "se déconnecter" qui permet à l'utilisateur de se déconnecter.
-</p>
-
-<p>
-Nous modifions le pied de page de notre gabarit principal <tt>MainLayout</tt>. 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: <tt>$this->User->IsGuest</tt> 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é.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div id="footer">
-<com:THyperLink Text="Se connecter"
- NavigateUrl="<%= $this->Service->constructUrl('users.LoginUser') %>"
- Visible="<%= $this->User->IsGuest %>" />
-
-<com:TLinkButton Text="Se déconnecter"
- OnClick="logoutButtonClicked"
- Visible="<%= !$this->User->IsGuest %>" />
-
-<br/>
-<%= PRADO::poweredByPrado() %>
-</div>
-</com:TTextHighlighter>
-
-<p>
-Vu que le lien "se déconnecter" génère l'évènement <tt>OnClick</tt> avec comme nom d'évènement <tt>logoutButtonClicked()</tt>, nous devons modifier le fichier de classe de <tt>MainLayout</tt> comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class MainLayout extends TTemplateControl
-{
- /**
- * Déconnecte un utilisateur.
- * Cette méthode répond à l'évènement OnClick du lien "se déconnecter".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function logoutButtonClicked($sender,$param)
- {
- $this->Application->getModule('auth')->logout();
- $url=$this->Service->constructUrl($this->Service->DefaultPage);
- $this->Response->redirect($url);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page deleted file mode 100755 index e886e4ea..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page +++ /dev/null @@ -1,212 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page nouvel utilisateur <tt>NewUser</tt></h1>
-
-<p>
-La page <tt>NewUser</tt> 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 <a href="?page=Day2.CreateDB">base de données</a>, nous devons prévoir la saisie des informations suivantes :
-</p>
-
-<ul>
-<li><tt>username</tt> - string, pseudo de l'utilisateur, obligatoire et unique</li>
-<li><tt>email</tt> - string, email, obligatoire et unique</li>
-<li><tt>password</tt> - string, mot de passe, obligatoire</li>
-<li><tt>role</tt> - integer, rôle, obligatoire (0 ou 1)</li>
-<li><tt>first_name</tt> - string, prénom, optionnel</li>
-<li><tt>last_name</tt> - string, nom, optionnel</li>
-</ul>
-
-<p>
-Nous créons deux fichiers, <tt>protected/pages/users/NewUser.page</tt> et <tt>protected/pages/users/NewUser.php</tt> qui contiendront respectivement le gabarit et la classe.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-En fonction de l'analyse précédente, nous créons le gabarit comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon Blog - Nouvel utilisateur" %>
-
-<com:TContent ID="Main">
-
-<h1>Création nouvel utilisateur</h1>
-
-<span>Pseudo:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Username" />
-
-<br/>
-<span>Mot de passe:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Password"
- ErrorMessage="Veuillez indiquer un mot de passe."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<span>Confirmation mot de passe:</span>
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Différence entre le mot de passe et la confirmation."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-<br/>
-<span>Email:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<br/>
-<span>Rôle:</span>
-<br/>
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Utilisateur standard" Value="0" />
- <com:TListItem Text="Administrateur" Value="1" />
-</com:TDropDownList>
-
-<br/>
-<span>Prénom:</span>
-<br/>
-<com:TTextBox ID="FirstName" />
-
-<br/>
-<span>Nom:</span>
-<br/>
-<com:TTextBox ID="LastName" />
-
-<br/>
-<com:TButton Text="Ajouter" OnClick="createButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Le gabarit est très proche du gabarit de la page <tt>Contact</tt> et de la page <tt>LoginUser</tt>. 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.
-</p>
-
-
-<h2>Création du fichier de classe</h2>
-
-<p>
-En fonction du gabarit précédent, nous constatons que nous avons besoin d'une classe qui implémente deux gestionnaires d'évènements : <tt>checkUsername()</tt> (appellé par le premier validateur dans l'évènement <tt>OnServerValidate</tt>) et <tt>createButtonClicked()</tt> (appellé par l'évènement <tt>OnClick</tt> du bouton "create"). ainsi, nous écrirons la classe comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class NewUser extends TPage
-{
- /**
- * Vérifie si le nom d'utilisateur existe dans la base de données.
- * Cette méthode répond à l'évènement OnServerValidate du validateur username.
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function checkUsername($sender,$param)
- {
- // valide si l'utilisateur existe
- $param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null;
- }
-
- /**
- * Créer un nouveau compte utilisateur si tous les champs sont valides.
- * Cette méthode répond à l'évènement OnClick du bouton "create".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function createButtonClicked($sender,$param)
- {
- if($this->IsValid) // si toutes les validations sont ok
- {
- // rempli l'objet UserRecord avec les données saisies
- $userRecord=new UserRecord;
- $userRecord->username=$this->Username->Text;
- $userRecord->password=$this->Password->Text;
- $userRecord->email=$this->Email->Text;
- $userRecord->role=(int)$this->Role->SelectedValue;
- $userRecord->first_name=$this->FirstName->Text;
- $userRecord->last_name=$this->LastName->Text;
-
- // l'enregistre dans la base de données par la méthode save de l'Active Record
- $userRecord->save();
-
- // redirige l'utilisateur vers la page d'accueil
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dans le code précédent, l'appel à la méthode <tt>save()</tt> insère un enregistrement dans la table <tt>users</tt>. Cette fonctionnalité est fournie par l'objet <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
-</p>
-
-<com:NoteBox>
-Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie <a href="?page=Day3.Auth">authentification</a>. De même, les espaces en début et fin de pseudo devrait être supprimés.
-Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie <a href="?page=Day3.Auth">authentification</a>. De même les espaces en début et fin de pseudo devrait être supprimés.
-Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie <a href="?page=Day3.Auth">authentification</a>. De même les espaces en début et fin de pseudo devrait être supprimés.
-</com:NoteBox>
-
-
-<h2>Test</h2>
-<p>
-Pour tester la page <tt>NewUser</tt>, il suffit de naviguer à l'URL <tt>http://hostname/blog/index.php?page=users.NewUser</tt>. 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.
-</p>
-
-<img src="<%~ output2.gif %>" class="output"/>
-
-
-<h2>Ajout de la vérification des droits d'accès</h2>
-<p>
-Durant le test, vous vous êtes peut-être demandé : Est-ce que la page <tt>NewUser</tt> ne devrait être accessible qu'aux administrateurs ? Oui, ceci est dénommé <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Auth">autorisation</a>. Nous allons maintenant décrire comment ajouter cette vérification d'accès à la page <tt>NewUser</tt>.
-</p>
-
-<p>
-Une façon simple serait de vérifier dans le code de la classe si <tt>$this->User->IsAdmin</tt> est vrai, dans le cas contraire, une redirection vers la page de connexion <tt>LoginUser</tt> serait faite.
-</p>
-
-<p>
-PRADO propose une approche complémentaire de vérification des droits. Pour ce faire, nous devons utiliser un fichier de <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">configuration de page</a>. Créer un fichier <tt>protected/pages/users/config.xml</tt> avec le contenu suivant :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <authorization>
- <allow roles="admin" />
- <deny users="*" />
- </authorization>
-</configuration>
-</com:TTextHighlighter>
-
-<p>
-Le fichier de configuration de page contient les règles d'accès aux pages contenues dans le dossier <tt>protected/pages/users</tt>. Ce fichier indique que les utilisateurs dont le rôle est "admin" (concernant le mot "admin" voir <a href="?page=Day3.Auth">BlogUser.createUser()</a>) peuvent accéder à toutes les pages du dossier. Tous les autres utilisateurs (<tt>users="*"</tt>) ne sont pas autorisés à accéder à ces pages, excepté à la page <tt>LoginUser</tt> qui, par convention, peut toujours être chargée.
-</p>
-
-<p>
-Dorénavant, si nous naviguons à la page <tt>NewUser</tt> en tant qu'anonyme, nous serons redirigés vers la page <tt>LoginUser</tt>. Si notre connexion est acceptée, nous serons redirigés en retour vers la page <tt>NewUser</tt>
-</p>
-
-<com:TipBox>
-Le fichier de configuration de pages peut contenir d'autres éléments que les règles d'autorisations. Par exemple, il pourrait inclure un <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">module</a> tout comme nous l'avons fait pour le fichier de <a href="?page=Day2.ConnectDB">configuration de l'application</a>. Dans une application PRADO, chaque dossier de pages peut contenir un fichier de configuration de pages qui s'applique à tous les fichiers du dossier ainsi qu'aux sous dossiers.
-</com:TipBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page b/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page deleted file mode 100755 index 306434e1..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page +++ /dev/null @@ -1,42 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Vue d'ensemble de la gestion des utilisateurs</h1>
-<!-- <h1>User Management Overview</h1> -->
-
-<p>
-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.
-</p>
-<!-- <p>
-In this section, we create pages that are related with user management. In particular, we implement these required features: user login/logout, creating new user account and updating/deleting user accounts.
-</p> -->
-
-<p>
-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 <tt>protected/pages/users</tt>.
-</p>
-<!-- <p>
-According to the requirements, we need to create the following pages. To better organize our code, these user-related pages will be created under a new directory <tt>protected/pages/users</tt>.
-</p> -->
-
-<ul>
- <li><tt>LoginUser</tt> affiche le formulaire de connexion.</li>
- <li><tt>NewUser</tt> pour la création d'un compte utilisateur.</li>
- <li><tt>EditUser</tt> permet à un utilisateur enregistré de mettre à jour son profil.</li>
- <li><tt>AdminUser</tt> permet à l'administrateur de gérer les comptes utilisateurs, y compris la gestion des droits d'accès et la suppression d'un compte.</li>
-</ul>
-<!-- <ul>
- <li><tt>LoginUser</tt> displays a login form to login a user.</li>
- <li><tt>NewUser</tt> creates a new user account.</li>
- <li><tt>EditUser</tt> allows a registered user to update his profile.</li>
- <li><tt>AdminUser</tt> allows the administrator to manage the user accounts, including setting permission level and deleting a user account.</li>
-</ul> -->
-
-<p>
-Après avoir fini cette section, nous devrions obtenir l'arborescence suivante :
-</p>
-<!-- <p>
-After finishing this section, we shall expect to see the following directories and files:
-</p> -->
-
-<img src="<%~ directories.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif Binary files differdeleted file mode 100755 index f59fda58..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output.gif Binary files differdeleted file mode 100755 index 0d812dd0..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif Binary files differdeleted file mode 100755 index 749255d6..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif Binary files differdeleted file mode 100755 index a11ee653..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/id/Auth.page b/demos/blog-tutorial/protected/pages/Day3/id/Auth.page deleted file mode 100755 index c4728cdf..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/Auth.page +++ /dev/null @@ -1,102 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Otentikasi dan Otorisasi</h1>
-
-<p>
-Sebelum kita siap mengimplementasikan halaman pengguna, kita perlu melakukan beberapa pekerjaan guna menghidupkan <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Advanced.Auth">otentikasi dan otorisasi</a>.
-</p>
-
-<p>
-Kita menambah dua modul ke konfigurasi aplikasi seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<modules>
- ...TDataSourceConfig and TActiveRecordConfig modules...
-
- <module id="auth"
- class="System.Security.TAuthManager"
- UserManager="users"
- LoginPage="users.LoginUser" />
-
- <module id="users"
- class="System.Security.TDbUserManager"
- UserClass="Application.BlogUser" />
-</modules>
-</com:TTextHighlighter>
-
-<p>
-Modul <a href="http://www.pradosoft.com/docs/classdoc/TAuthManager">TAuthManager</a> mengatur seluruh alur kerja otentikasi dan otorisasi. Ia menggunakan modul <tt>users</tt> sebagai manajer penggunanya (lihat di bawah). Dengan menetapkan properti <tt>LoginPage</tt>, kita menginformasikan manajer otentikasi untuk mengalihkan browser pengguna ke halaman <tt>LoginUser</tt> saat otorisasi gagal. Kami akan menjelaskan bagaimana untuk membuat <tt>LoginUser</tt> dalam subbagian berikutnya.
-</p>
-
-<p>
-Modul <tt>user</tt> adalah kelas <a href="http://www.pradosoft.com/docs/classdoc/TDbUserManager">TDbUserManager</a> yang bertanggung jawab untuk memverifikasi keabsahan pengguna dan memelihara data dasar dalam sesi PHP. Properti <tt>UserClass</tt> diinisialisasi sebagai <tt>Application.BlogUser</tt>, yang menunjukan bahwa manajer pengguna akan melihar kelas <tt>BlogUser</tt> di bawah direktori <tt>protected</tt> (ingat alias <tt>Application</tt> merujuk ke direktori <tt>protected</tt>) dan menggunakannya untuk memelihara data sesi pengguna.
-</p>
-
-<p>
-Seperti yang akan kita lihat dalam bagian nanti, dalam kontrol dan halaman, kita dapat menggunakan <tt>$this->User</tt> untuk memperoleh obyek <tt>BlogUser</tt> yang berisi informasi pengguna yang saat ini mengakses siistem.
-</p>
-
-<p>
-Di bawah ini adalah rincian implementasi dari <tt>BlogUser</tt>. Perhatikan, <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Database.ActiveRecord">Rekaman Aktif</a> digunakan untuk melakukan query DB. Sebagai contoh, kita menggunakan <tt>UserRecord::finder()->findByPk($username)</tt> untuk mencari kunci primer yang ditetapkan oleh <tt>$username</tt> dalam tabel <tt>users</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-// Sertakan file TDbUserManager.php yang mendefinisikan TDbUser
-Prado::using('System.Security.TDbUserManager');
-
-/**
- * BlogUser Class.
- * BlogUser mewakili data pengguna yang perlu dijaga dalam sesi.
- * Implementasi standar memelihara informasi aturan dan pengguna.
- */
-class BlogUser extends TDbUser
-{
- /**
- * Membuat obyek BlogUser berdasarkan username yang ditetapkan.
- * Metode ini diperlukan oleh TDbUser. Ia memeriksa database
- * untuk melihat apakah username yang ditetapkan ada di sana. Jika ada,
- * obyek BlogUser dibuat dan diinisialisasi.
- * @param string username yang ditetapkan
- * @return BlogUser obyek pengguna, null jika username tidak benar.
- */
- public function createUser($username)
- {
- // gunakan Rekaman Aktif UserRecord untuk mencari username yang ditetapkan
- $userRecord=UserRecord::finder()->findByPk($username);
- if($userRecord instanceof UserRecord) // jika ditemukan
- {
- $user=new BlogUser($this->Manager);
- $user->Name=$username; // setel nama pengguna
- $user->Roles=($userRecord->role==1?'admin':'user'); // setel aturan
- $user->IsGuest=false; // pengguna bukan seorang tamu
- return $user;
- }
- else
- return null;
- }
-
- /**
- * Memeriksa apakah (username, password) yang ditetapkan sudah benar.
- * Metode ini diperlukan oleh TDbUser.
- * @param string username
- * @param string password
- * @return boolean apakah username dan password sudah benar.
- */
- public function validateUser($username,$password)
- {
- // pakai Rekaman Aktif UserRecord untuk mencari pasangan (username, password).
- return UserRecord::finder()->findBy_username_AND_password($username,$password)!==null;
- }
-
- /**
- * @return boolean apakah pengguna ini adalah seorang administrator.
- */
- public function getIsAdmin()
- {
- return $this->isInRole('admin');
- }
-}
-</com:TTextHighlighter>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page deleted file mode 100755 index f805d477..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page +++ /dev/null @@ -1,137 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>AdminUser</tt></h1>
-
-<p>
-Halaman <tt>AdminUser</tt> 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.
-</p>
-
-<p>
-Kita akan menampilkan daftar pengguna dalam sebuah tabel. Setiap baris tabel mewakili satu akun pengguna, dan kolom berikut ditampilkan:
-</p>
-<ul>
-<li>Username - menampilkan nama pengguna. Dalam setiap sel sebuah hiperlink ditampilkan membawa ke halaman <a href="?page=Day3.CreateEditUser">EditUser</a> terkait.</li>
-<li>Email - menampilkan email.</li>
-<li>Administrator - menampilkan apakah akun pengguna adalah aturan administrator.</li>
-<li>Command - menampilkan kolom dengan tombol "Delete". Mengklik pada setiap tombol akan mengakibatkan penghapusan akun pengguna terkait.</li>
-</ul>
-
-<p>
-Kita membuat dua file <tt>protected/pages/users/AdminUser.page</tt> dan <tt>protected/pages/users/AdminUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.DataGrid">TDataGrid</a> untuk menampilkan akun pengguna. Berdasarkan pada analisis di atas, kita mengkonfigurasi empat kolom berikut:
-</p>
-<ul>
-<li><a href="http://www.pradosoft.com/docs/classdoc/THyperLinkColumn">THyperLinkColumn</a> menampilkan kolom nama pengguna. URL dibentuk berdasarkan pada ekstensi PHP yang ditetapkan dalam properti <tt>DataNavigateUrlFormatString</tt>.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TBoundColumn">TBoundColumn</a> menampilkan kolom email.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TCheckBoxColumn">TCheckBoxColumn</a> menggunakan kotak centang untuk menunjukan apakah akun pengguna adalah aturan administrator.</li>
-<li><a href="http://www.pradosoft.com/docs/classdoc/TButtonColumn">TButtonColumn</a> menampilkan kolom dengan tombol "Delete".</li>
-</ul>
-
-<p>Template halaman lengkap ditampilkan seperti berikut:</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - Manage User Accounts" %>
-
-<com:TContent ID="Main">
-
-<h1>Manage User Accounts</h1>
-
-<a href="<%= $this->Service->constructUrl('users.NewUser')%>">Create New User</a>
-<br/>
-
-<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>
-</com:TTextHighlighter>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Dalam template halaman di atas, event <tt>OnDeleteCommand</tt> datagrid dengan metode <tt>deleteButtonClicked()</tt> 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:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class AdminUser extends TPage
-{
- /**
- * Mempopulai datagrid dengan daftar pengguna.
- * Metode ini dipanggil oleh kerangka kerja saat inisialisasi halaman
- * @param mixed event parameter
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // ambil semua informasi data akun
- $this->UserGrid->DataSource=UserRecord::finder()->findAll();
- // mengikat data ke komponen antarmua
- $this->UserGrid->dataBind();
- }
-
- /**
- * Menghapus rekaman pengguna yang ditetapkan.
- * Metode ini merespon ke event OnDeleteCommand pada datagrid.
- * @param TDataGrid pengirim event
- * @param TDataGridCommandEventParameter parameter event
- */
- public function deleteButtonClicked($sender,$param)
- {
- // dapatkan item datagrid yang berisi tombol hapus yang diklik
- $item=$param->Item;
- // dapatkan kunci primer terkait ke item datagrid
- $username=$this->UserGrid->DataKeys[$item->ItemIndex];
- // menghapus rekaman pengguna dengan kunci primer nama pengguna
- UserRecord::finder()->deleteByPk($username);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dalam kode di atas, metode <tt>deleteButtonClicked()</tt> dipanggil kapan saja tombol "Delete" diklik. untuk menentukan baris mana pada tombol yang diklik, kita memeriksa properti <tt>Item.ItemIndex</tt> pada parameter event. Untuk selanjutnya mengidentifikasi akun pengguna mana yang akan dihapus, kita mengambil nilai kunci primer (username) melalui properti <tt>DataKeys</tt> pada DataGrid.
-</p>
-
-<com:TipBox>
-Semua kontrol <a href="http://www.pradosoft.com/docs/classdoc/TDataBoundControl">data-bound</a> mempunyai pola penggunaan yang sama. Yaitu, Setel properti <tt>DataSource</tt> dengan data dan panggil metode <tt>dataBind()</tt> untuk mengikat data ke struktur internal kontrol.
-</com:TipBox>
-
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>AdminUser</tt>, kunjungi URL <tt>http://hostname/blog/index.php?page=users.AdminUser</tt>. Anda mungkin perlu masuk sebagai administrator lebih dahulu jika Anda belum melakukannya. Kita akan melihat hasil seperti berikut.
-</p>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page deleted file mode 100755 index 2f03ecec..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page +++ /dev/null @@ -1,212 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>EditUser</tt></h1>
-
-<p>
-Halaman <tt>EditUser</tt> sangat mirip dengan <a href="?page=Day3.CreateNewUser">NewUser</a>. Perbedaan utamanya adalah bahwa saat <tt>EditUser</tt> awalnya diminta, field input harus diinisialisasi dengan informasi pengguna yang sudah ada. Sedikit perbedaan lainnya adalah bahwa <tt>EditUser</tt> juga bisa diakses oleh pengguna normal.
-</p>
-
-<p>
-Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut:
-</p>
-<ul>
-<li>Jika pengguna saat ini adalah administrator, dia dapat mengedit setiap akun pengguna dengan menetapkan akun nama pengguna dalam variabel GET bernama 'username'. Sebagai contoh, <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>.</li>
-<li>Jika pengguna saat ini adalah administrator dan URL tidak berisi 'username', data administrator sendiri sedang dimutakhirkan.</li>
-<li>Jika pengguna saat ini adalah pengguna normal, dia hanya bisa mengedit informasi akunnya sendiri, dan dia tidak bisa memodifikasi data aturannya.</li>
-</ul>
-
-<p>
-Kita membuat dua file <tt>protected/pages/users/EditUser.page</tt> dan <tt>protected/pages/users/EditUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Seperti yang telah Anda tebak, template halaman <tt>EditUser</tt> sebagian besar sama seperti pada <tt>NewUser</tt>. Selain perbedaan dalam judul halaman dan judul tombol submit, ada tiga perbedaan utama.
-</p>
-<ul>
-<li>Kotak teks "username" diganti oleh kontrol <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Label">TLabel</a> karena kita tidak membolehkan memodifikasi nama pengguna;</li>
-<li>Validator untuk input "password" dihilangkan. Ini dikarenakan jika pengguna tidak melengkapi kata sandi selama mengedit, itu berarti pengguna tidak ingin mengubah kata sandi.</li>
-<li>Input "role" dikelilingi oleh <tt>TControl</tt> yang penampakannya dihidup matikan berdasarkan aturan pengguna yang masuk saat ini. Jika pengguna bukan administrator, input "role" tidak akan ditampilkan karena pengguna normal tidak diperbolehkan untuk memodifikasi aturannya.</li>
-</ul>
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - Edit User" %>
-
-<com:TContent ID="Main">
-
-<h1>Edit User</h1>
-
-<span>Username:</span>
-<com:TLabel ID="Username" />
-
-<br/>
-<span>Password:</span>
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<span>Re-type Password:</span>
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Your password entries did not match."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-<br/>
-<span>Email Address:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<com:TControl Visible="<%= $this->User->IsAdmin %>">
-<br/>
-<span>Role:</span>
-<br/>
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Normal User" Value="0" />
- <com:TListItem Text="Administrator" Value="1" />
-</com:TDropDownList>
-</com:TControl>
-
-<br/>
-<span>First Name:</span>
-<br/>
-<com:TTextBox ID="FirstName" />
-
-<br/>
-<span>Last Name:</span>
-<br/>
-<com:TTextBox ID="LastName" />
-
-<br/>
-<com:TButton Text="Save" OnClick="saveButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-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 <tt>saveButtonClicked()</tt> yang disertakan pada event tombol "save" <tt>OnClick</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class EditUser extends TPage
-{
- /**
- * Menginisialisasi input dengan data pengguna yang sudah ada.
- * Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi.
- * @param mixed event parameter
- */
- public function onInit($param)
- {
- parent::onInit($param);
- if(!$this->IsPostBack) // jika halaman awalnya diminta
- {
- // Ambil data pengguna yang sudah ada. Ini sama dengan:
- // $userRecord=$this->getUserRecord();
- $userRecord=$this->UserRecord;
-
- // Populasikan kontrol input dengan data pengguna yang sudah ada
- $this->Username->Text=$userRecord->username;
- $this->Email->Text=$userRecord->email;
- $this->Role->SelectedValue=$userRecord->role;
- $this->FirstName->Text=$userRecord->first_name;
- $this->LastName->Text=$userRecord->last_name;
- }
- }
-
- /**
- * Menyimpan akun pengguna jika semua input sudah benar.
- * Metode ini merespon event OnClick pada tombol "save".
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function saveButtonClicked($sender,$param)
- {
- if($this->IsValid) // saat semua validasi sukses
- {
- // Ambil data pengguna yang sudah ada. Ini sama dengan:
- $userRecord=$this->UserRecord;
-
- // Ambil data input
- $userRecord->username=$this->Username->Text;
- // mutakhirkan kata sandi saat input tidak kosong
- if(!empty($this->Password->Text))
- $userRecord->password=$this->Password->Text;
- $userRecord->email=$this->Email->Text;
- // mutakhirkan aturan jika pengguna saat ini adalah administrator
- if($this->User->IsAdmin)
- $userRecord->role=(int)$this->Role->SelectedValue;
- $userRecord->first_name=$this->FirstName->Text;
- $userRecord->last_name=$this->LastName->Text;
-
- // simpan ke database melalui mekanisme Rekaman Aktif
- $userRecord->save();
-
- // alihkan browser ke homepage
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
- }
-
- /**
- * Mengembalikan data pengguna yang diedit.
- * @return UserRecord data pengguna yang diedit.
- * @throws THttpException jika data pengguna tidak ditemukan.
- */
- protected function getUserRecord()
- {
- // pengguna yang diedit adalah pengguna yang saat ini sudah masuk
- $username=$this->User->Name;
- // jika var GET 'username' tidak kosong dan pengguna saat ini adalah
- // administrator, lebih baik kita menggunakan nilai var GET.
- if($this->User->IsAdmin && $this->Request['username']!==null)
- $username=$this->Request['username'];
-
- // gunakan Rekaman Aktif untuk melihat nama pengguna yang ditetapkan
- $userRecord=UserRecord::finder()->findByPk($username);
- if(!($userRecord instanceof UserRecord))
- throw new THttpException(500,'Username is invalid.');
- return $userRecord;
- }
-}
-</com:TTextHighlighter>
-
-<com:TipBox>
-Metode <tt>onInit()</tt> dipanggil oleh PRADO selama salah satu <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">masa hidup halaman</a>. Metode masa hidup umum lainnya ditimpa termasuk <tt>onPreInit()</tt>, <tt>onLoad()</tt> dan <tt>onPreRender()</tt>.
-</com:TipBox>
-
-<h2>Menambah Pemeriksaan Perijinan</h2>
-<p>
-Agar halaman <tt>EditUser</tt> juga bisa diakses oleh para pengguna (<tt>users="@"</tt>), kita juga perlu menyesuaikan file konfigurasi halaman <tt>protected/pages/users/config.xml</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <authorization>
- <allow roles="admin"/>
- <allow users="@" pages="EditUser"/>
- <deny users="*"/>
- </authorization>
-</configuration>
-</com:TTextHighlighter>
-
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>EditUser</tt>, kunjungi URL <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>. 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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page deleted file mode 100755 index 1debbec0..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page +++ /dev/null @@ -1,162 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>LoginUser</tt></h1>
-
-<p>
-Halaman <tt>LoginUser</tt> menampilkan formulir masuk dan mengotentikasi pengguna yang mencoba untuk masuk. Seperti dijelaskan dalam <a href="?page=Day3.Auth">otentikasi dan otorisasi</a>, browser pengguna secara otomatis dialihkan ke halaman <tt>LoginUser</tt> ketika pengguna mencoba untuk mengakses halaman istimewa, seperti misalhnya halaman admin pengguna.
-</p>
-
-<p>
-Alur kerja <tt>LoginUser</tt> sangat mirip dengan halaman <a href="?page=Day1.CreateContact">Contact</a>:
-</p>
-<ol>
-<li>Ketika pengguna mengakses halaman <tt>LoginUser</tt>, formulir masuk ditampilkan;</li>
-<li>Pengguna mengisi nama pengguna dan kata sandi serta mengklik pada tombol "login";</li>
-<li><tt>LoginUser</tt> menerima event "login" dan memicu rangkaian otentikasi;</li>
-<li>Jika pengguna memasukan nama pengguna dan kata sandi yang benar, sistem menempatkan identitas yang sah dan mengalihkan browser-nya ke halaman istimewa yang diinginkan; Jika tidak, pesan "password invalid" akan ditampilkan.
-</ol>
-
-<p>
-Kita membuat dua file <tt>protected/pages/users/LoginUser.page</tt> dan <tt>protected/pages/users/LoginUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-
-<p>
-Di bawah ini kita menampilkan template untuk <tt>LoginUser</tt>. 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 <tt>TRequiredFieldValidator</tt>. Kebenaran dari input kata sandi dipastikan oleh <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Controls.Validation">TCustomValidator</a> yang memanggil metode <tt>validateUser()</tt> halaman ketika validasi dilakukan. Halaman juga mempunyai tombol "login" yang memanggil <tt>loginButtonClicked()</tt> halaman ketika itu diklik.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - Login" %>
-
-<com:TContent ID="Main">
-
-<h1>Login</h1>
-
-<span>Username:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Username"
- ErrorMessage="Please provide your username."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Username" />
-
-<br/>
-<span>Password:</span>
-<com:TCustomValidator
- ControlToValidate="Password"
- ErrorMessage="Your entered an invalid password."
- Display="Dynamic"
- OnServerValidate="validateUser" />
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<com:TButton Text="Login" OnClick="loginButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Seperti halaman <a href="?page=Day1.CreateContact">Contact</a>, halaman <tt>LoginUser</tt> juga memerlukan file kelas yang sebagian besar berisi implementasi pengendali event yang disertakan dalam template halaman. Di sini, kita perlu mengimplementasikan dua metode: <tt>validateUser()</tt> dan <tt>loginButtonClicked()</tt>. Dalam <tt>validateUser()</tt>, kita menggunakan <a href="?page=Day3.Auth">manajer otentikasi</a> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class LoginUser extends TPage
-{
- /**
- * Validates whether the username and password are correct.
- * This method responds to the TCustomValidator's OnServerValidate event.
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function validateUser($sender,$param)
- {
- $authManager=$this->Application->getModule('auth');
- if(!$authManager->login($this->Username->Text,$this->Password->Text))
- $param->IsValid=false; // beritahu validator bawa validasi gagal
- }
-
- /**
- * Redirects the user's browser to appropriate URL if login succeeds.
- * This method responds to the login button's OnClick event.
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function loginButtonClicked($sender,$param)
- {
- if($this->Page->IsValid) // semua validasi sukses
- {
- // Dapatkan URL pada halaman istimewa yang diinginkan pengguna yang akan dikunjungi
- $url=$this->Application->getModule('auth')->ReturnUrl;
- if(empty($url)) // pengguna mengakses halaman masuk secara langsung
- $url=$this->Service->DefaultPageUrl;
- $this->Response->redirect($url);
- }
- }
-}
-</com:TTextHighlighter>
-
-
-<h2>Pengujian</h2>
-
-<p>
-Kita telah membuat halaman <tt>LoginUser</tt>. Kita dapat mengujinya dengan mengunjungi URL <tt>http://hostname/blog/index.php?page=users.LoginUser</tt>. Ingat dalam subbagian <a href="?page=Day2.CreateDB">Membuat Database</a>, kita sudah membuat dua akun pengguna (username/password): <tt>admin/demo</tt> dan <tt>demo/demo</tt>. Kita dapat menggunakannya untuk menguji halaman masuk kita.
-</p>
-
-<img src="<%~ output.gif %>" class="output"/>
-
-<h2>Menambahkan Link Login/Logout ke Master</h2>
-
-<p>
-Guna melengkapi cara langsung bagi pengguna untuk masuk dan keluar, kita memodifikasi sedikit kontrol master <tt>MainLayout</tt>. Dalam keadaan tertentu, kita menambahkan hiperlink "login" yang mengaitkan halaman <tt>LoginUser</tt>. Kita juga menambahkan tombol link "logout" yang mengeluarkan pengguna saat ia diklik.
-</p>
-
-<p>
-Kita memodifikasi bagian footer dari template <tt>MainLayout</tt> sebagai berikut. Penampakan "login" dan "logout" ditentukan berdasarkan status pengguna. Jika pengguna belum masuk, misalnya <tt>$this->User->IsGuest</tt> adalah true, link "login" terlihat sementara link "logout" tidak; dan begitu sebaliknya.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div id="footer">
-<com:THyperLink Text="Login"
- NavigateUrl="<%= $this->Service->constructUrl('users.LoginUser') %>"
- Visible="<%= $this->User->IsGuest %>" />
-
-<com:TLinkButton Text="Logout"
- OnClick="logoutButtonClicked"
- Visible="<%= !$this->User->IsGuest %>" />
-
-<br/>
-<%= PRADO::poweredByPrado() %>
-</div>
-</com:TTextHighlighter>
-
-<p>
-Karena tombol "logout" menempelkan event <tt>OnClick</tt> dengan metode yang dipanggil <tt>logoutButtonClicked()</tt>, kita juga perlu mengubah file kelas <tt>MainLayout</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class MainLayout extends TTemplateControl
-{
- /**
- * Logs out a user.
- * This method responds to the "logout" button's OnClick event.
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function logoutButtonClicked($sender,$param)
- {
- $this->Application->getModule('auth')->logout();
- $url=$this->Service->constructUrl($this->Service->DefaultPage);
- $this->Response->redirect($url);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page deleted file mode 100755 index d90df01f..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page +++ /dev/null @@ -1,210 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>NewUser</tt></h1>
-
-<p>
-Halaman <tt>NewUser</tt> disediakan untuk pengguna administrator guna membuat akun pengguna baru. Ini perlu menampilkan sebuah formulir yang mengumpulkan informasi mengenai akun pengguna baru. Berdasarkan <a href="?page=Day2.CreateDB">definisi database</a>, kita akan perlu mengumpulkan informasi berikut:
-</p>
-
-<ul>
-<li><tt>username</tt> - string, diperlukan dan unik</li>
-<li><tt>email</tt> - string, diperlukan dan unik</li>
-<li><tt>password</tt> - string, diperlukan</li>
-<li><tt>role</tt> - integer, diperlukan (baik 0 ataupun 1)</li>
-<li><tt>first_name</tt> - string, opsional</li>
-<li><tt>last_name</tt> - string, opsional</li>
-</ul>
-
-<p>
-Kita membuat dua file <tt>protected/pages/users/NewUser.page</tt> dan <tt>protected/pages/users/NewUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Berdasarkan pada analisis di atas, kita menulis template halaman seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - New User" %>
-
-<com:TContent ID="Main">
-
-<h1>Create New User</h1>
-
-<span>Username:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Username" />
-
-<br/>
-<span>Password:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="Password"
- ErrorMessage="Please provide a password."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password" TextMode="Password" />
-
-<br/>
-<span>Re-type Password:</span>
-<com:TCompareValidator
- ControlToValidate="Password"
- ControlToCompare="Password2"
- ErrorMessage="Your password entries did not match."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="Password2" TextMode="Password" />
-
-<br/>
-<span>Email Address:</span>
-<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" />
-<br/>
-<com:TTextBox ID="Email" />
-
-<br/>
-<span>Role:</span>
-<br/>
-<com:TDropDownList ID="Role">
- <com:TListItem Text="Normal User" Value="0" />
- <com:TListItem Text="Administrator" Value="1" />
-</com:TDropDownList>
-
-<br/>
-<span>First Name:</span>
-<br/>
-<com:TTextBox ID="FirstName" />
-
-<br/>
-<span>Last Name:</span>
-<br/>
-<com:TTextBox ID="LastName" />
-
-<br/>
-<com:TButton Text="Create" OnClick="createButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Template tidak jauh berbeda dari template <tt>Contact</tt> dan halaman <tt>LoginUser</tt>. Sebagian besar terdiri dari kotak teks dan validator. Beberapa kotak teks, seperti nama pengguna, dikaitkan dengan dua validator karena keterlibatan aturan multipel validasi.
-</p>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Dari template halaman di atas, kita melihat bahwa kita perlu untuk menulis sebuah kelas halaman yang mengimplementasikan dua pengendali event: <tt>checkUsername()</tt> (disertakan ke event validator kustom <tt>OnServerValidate</tt>) dan <tt>createButtonClicked()</tt> (disertakan ke event tombol "create" <tt>OnClick</tt>). Oleh karena itu, kita menulis kelas halaman seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class NewUser extends TPage
-{
- /**
- * Memeriksa apakah nama pengguna sudah ada dalam database.
- * Metode ini merespon ke event OnServerValidate pada validator kustom nama pengguna.
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function checkUsername($sender,$param)
- {
- // benar jika nama pengguna tidak ditemukan dalam database
- $param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null;
- }
-
- /**
- * Membuat akun pengguna baru jika semua input benar.
- * Metode ini merespon ke event OnClick pada tombol "create".
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function createButtonClicked($sender,$param)
- {
- if($this->IsValid) // ketika semua validasi sukses
- {
- // populasikan obyek UserRecord dengan input pengguna
- $userRecord=new UserRecord;
- $userRecord->username=$this->Username->Text;
- $userRecord->password=$this->Password->Text;
- $userRecord->email=$this->Email->Text;
- $userRecord->role=(int)$this->Role->SelectedValue;
- $userRecord->first_name=$this->FirstName->Text;
- $userRecord->last_name=$this->LastName->Text;
-
- // simpan database melalui mekanisme Rekaman Aktif
- $userRecord->save();
-
- // alihkan browser ke homepage
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dalam kode di atas, memanggil <tt>save()</tt> akan menyisipkan baris baru dalam tabel <tt>users</tt>. Fitur intuitif ini dihidupkan oleh <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
-</p>
-
-<com:NoteBox>
-Untuk memudahkan, nama pengguna dalam sistem blg kita adalah tidak sensitif-huruf! Dalam banyak sistem praktis, nama pengguna mungkin perlu sensitif-huruf. Maka penanganan khusus perlu dibuat saat pembuatan akun pengguna baru dan juga <a href="?page=Day3.Auth">melakukan otentikasi</a>. Juga, ruang kosong dalam nama pengguna perlu dipotong ketika membuat akun baru dengan itu.
-</com:NoteBox>
-
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>NewUser</tt>, kunjungi URL <tt>http://hostname/blog/index.php?page=users.NewUser</tt>. 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.
-</p>
-
-<img src="<%~ output2.gif %>" class="output"/>
-
-
-<h2>Menambahkan Pemeriksaan Perijinan</h2>
-<p>
-Selama pengujian, Anda mungkin bertanya: apakah halaman <tt>NewUser</tt> seharusnya hanya bisa diakses oleh pengguna administrator? Ya, ini disebut <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Auth">otorisasi</a>. Sekarang kami menjelaskan bagaimana kita menambahkan pemeriksaan perijinan ini ke halaman <tt>NewUser</tt>.
-</p>
-
-<p>
-Cara langsung pada pemeriksaan perijinan adalah dalam kelas halaman di mana kita memeriksa apakah <tt>$this->User->IsAdmin</tt> adalah true, dan jika tidak, kita mengalihkan browser ke halaman <tt>LoginUser</tt>.
-</p>
-
-<p>
-PRADO menawarkan cara lebih sistematis terhadap pemeriksaan perijinan akses halaman. Untuk melakukannyaTo , kita perlu menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">konfigurasi halaman</a>. Membuat sebuah file <tt>protected/pages/users/config.xml</tt> dengan konten seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <authorization>
- <allow roles="admin" />
- <deny users="*" />
- </authorization>
-</configuration>
-</com:TTextHighlighter>
-
-<p>
-Konfigurasi halaman berisi aturan otorisasi yang berlaku untuk halaman di bawah direktori <tt>protected/pages/users</tt>. Konfigurasi di atas terbaca bahwa para pengguna dalam role <tt>admin</tt> dapat mengakses semua halaman (lihat <a href="?page=Day3.Auth">BlogUser.createUser()</a> untuk mengapa harus kata "admin"). Untuk saat ini semua para pengguna lain (<tt>users="*"</tt>) ditolak untuk mengakses halaman dalam direktori ini - kecuali untuk halaman <tt>LoginUser</tt> yang seharusnya selalu bisa diakses.
-</p>
-
-<p>
-Sekarang jika kita mengunjungi halaman <tt>NewUser</tt> sebagai seorang tamu, kita akan dialihkan ke halaman <tt>LoginUser</tt> terlebih dahulu. Jika kita masuk dengan sukses, kita akan mengalihkan kembali ke halaman<tt>NewUser</tt>.
-</p>
-
-<com:TipBox>
-Konfigurasi halaman dapat berisi lebih dari satu aturan otorisasi. Sebagai contoh, ia dapat menyertakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modul</a> seperti yang ktia lakukan dalam <a href="?page=Day2.ConnectDB">konfigurasi aplikasi</a>. Untuk aplikasi PRADO, setiap direktori halaman dapat mempunyai konfigurasi halaman yang berlaku bagi halaman dalam direktori yang sama dan seluruh subdirektorinya.
-</com:TipBox>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/Overview.page b/demos/blog-tutorial/protected/pages/Day3/id/Overview.page deleted file mode 100755 index 62c29438..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/Overview.page +++ /dev/null @@ -1,26 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Tinjauan Manajemen Pengguna</h1>
-
-<p>
-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.
-</p>
-
-<p>
-Berdasarkan kebutuhan, kita perlu membuat halaman berikut. Guna mengatur lebih baik kode kita, halaman terkait-pengguna ini akan dibuat di bawah direktori baru <tt>protected/pages/users</tt>.
-</p>
-
-<ul>
- <li><tt>LoginUser</tt> menampilkan formulir login untuk memasukan pengguna.</li>
- <li><tt>NewUser</tt> membuat akun pengguna baru.</li>
- <li><tt>EditUser</tt> membolehkan pengguna teregistrasi memutakhirkan profilnya.</li>
- <li><tt>AdminUser</tt> membolehkan administrator untuk mengatur akun pengguna, termasuk setelan tingkat perijinan dan menghapus akun pengguna.</li>
-</ul>
-
-<p>
-Setelah menyelesaikan bagian ini, kita mengharapkan bisa melihat direktori dan file berikut:
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/directories.gif b/demos/blog-tutorial/protected/pages/Day3/id/directories.gif Binary files differdeleted file mode 100755 index f59fda58..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output.gif b/demos/blog-tutorial/protected/pages/Day3/id/output.gif Binary files differdeleted file mode 100755 index 0d812dd0..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output2.gif b/demos/blog-tutorial/protected/pages/Day3/id/output2.gif Binary files differdeleted file mode 100755 index 749255d6..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output3.gif b/demos/blog-tutorial/protected/pages/Day3/id/output3.gif Binary files differdeleted file mode 100755 index a11ee653..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/CreateListPost.page b/demos/blog-tutorial/protected/pages/Day4/CreateListPost.page index 1dada650..1c266c83 100755 --- a/demos/blog-tutorial/protected/pages/Day4/CreateListPost.page +++ b/demos/blog-tutorial/protected/pages/Day4/CreateListPost.page @@ -28,8 +28,8 @@ We now create the template and class files for the <tt>ListPost</tt> page: <tt>p Based on the functionality requirement of the <tt>ListPost</tt> page, we will use two controls in the page template:
</p>
<ul>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: this control is mainly used to display a list of data items. The presentation of the each data item can be specified via an inline template or an external template control (the approach we will use here).</li>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Pager">TPager</a>: this control is used to paginate a list of data items. It interacts with end-users to determine which page of data to be displayed in a <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">list control</a> (e.g. <tt>TListBox</tt>) or <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Data">data control</a> (e.g. <tt>TRepeater</tt>).</li>
+<li><a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: this control is mainly used to display a list of data items. The presentation of the each data item can be specified via an inline template or an external template control (the approach we will use here).</li>
+<li><a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Pager">TPager</a>: this control is used to paginate a list of data items. It interacts with end-users to determine which page of data to be displayed in a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.List">list control</a> (e.g. <tt>TListBox</tt>) or <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.Data">data control</a> (e.g. <tt>TRepeater</tt>).</li>
</ul>
<p>
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 <tt>protected/pages/posts/NewPost.page</tt> and <tt>prot <h2>Creating Page Template</h2>
<p>
-The <tt>NewPost</tt> page template contains a <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> to collect the post title and a <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.HtmlArea">THtmlArea</a> 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 <tt>NewPost</tt> page template contains a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.TextBox">TTextBox</a> to collect the post title and a <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.HtmlArea">THtmlArea</a> 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.
</p>
<com:TTextHighlighter CssClass="source" Language="prado">
diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/CreateEditPost.page b/demos/blog-tutorial/protected/pages/Day4/fr/CreateEditPost.page deleted file mode 100755 index 09220322..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/CreateEditPost.page +++ /dev/null @@ -1,136 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page modification d'un message <tt>EditPost</tt></h1>
-
-
-<p>
-La page <tt>EditPost</tt> est fournie aux auteurs et administrateurs pour modifier les messages. Comme la page <a href="?page=Day4.CreateNewPost">NewPost</a>, elle affiche un formulaire permettant de modifier les données d'un message.
-</p>
-
-
-<p>
-Nous créons deux fichiers <tt>protected/pages/posts/EditPost.page</tt> et <tt>protected/pages/posts/EditPost.php</tt> contenant respectivement le gabarit et la classe de notre page.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-Le gabarit de la page <tt>EditPost</tt> est très proche de celui de la page <tt>NewPost</tt> template. Seul le titre et le texte du bouton sont différents.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon Blog - Modification Message" %>
-
-<com:TContent ID="Main">
-
-<h1>Modification message</h1>
-
-<span>Titre:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Veuillez indiquer un titre."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-<br/>
-<span>Message:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Veuillez indiquer le contenu du message."
- Display="Dynamic" />
-<br/>
-<com:THtmlArea ID="ContentEdit" />
-
-<br/>
-<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Création du fichier de classe</h2>
-
-
-<p>
-La classe de <tt>EditPage</tt> est un peu plus complexe que celle de la page <tt>NewPage</tt> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class EditPost extends TPage
-{
- /**
- * initialise les contrôles de saisies avec les données du message.
- * cette méthode est appelée lors de l'initialisation de la page
- * @param mixed param : paramètres de l'évènement
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // récupère les données de l'utilisateur. Equivalent à:
- // $postRecord=$this->getPost();
- $postRecord=$this->Post;
- // vérification des droits: seul l'auteur ou un administrateur peuvent modifier le message
- if($postRecord->author_id!==$this->User->Name && !$this->User->IsAdmin)
- throw new THttpException(500,'Vous n êtes pas autoriser à modifier ce message.');
-
- if(!$this->IsPostBack) // est-ce le premier appel à la page
- {
- // rempli les contrôles avec les données du message
- $this->TitleEdit->Text=$postRecord->title;
- $this->ContentEdit->Text=$postRecord->content;
- }
- }
-
- /**
- * Enregistre si toutes les validations sont Ok
- * cette méthode répond à l'évènement OnClick du bouton "Enregistrer".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function saveButtonClicked($sender,$param)
- {
- if($this->IsValid) // toutes les validations sont ok ?
- {
- // récupère les données de l'utilisateur. Equivalent à:
- // $postRecord=$this->getPost();
- $postRecord=$this->Post;
-
- // affecte les données saisies aux champs de la BDD
- $postRecord->title=$this->TitleEdit->SafeText;
- $postRecord->content=$this->ContentEdit->SafeText;
-
- // enregistre les données par la méthode save de l'Active Record
- $postRecord->save();
-
- // redirige le navigateur vers la page ReadPost
- $url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
- $this->Response->redirect($url);
- }
- }
-
- /**
- * retourne les données du message devant être modifiées.
- * @return PostRecord les données devant être modifiés.
- * @throws THttpException si le message est inexistant.
- */
- protected function getPost()
- {
- // l'ID du message devant être modifié passé par un paramètre GET
- $postID=(int)$this->Request['id'];
- // utilise Active Record pour lire le message correspondant à cet ID
- $postRecord=PostRecord::finder()->findByPk($postID);
- if($postRecord===null)
- throw new THttpException(500,'Message inexistant.');
- return $postRecord;
- }
-}
-</com:TTextHighlighter>
-
-<h2>Test</h2>
-<p>
-Pour tester notre page <tt>EditPost</tt>, authentifiez-vous auparavant et allez à l'URL <tt>http://hostname/blog/index.php?page=EditPost&id=1</tt>. Cette URL peut aussi être atteinte par le bouton <tt>Modifier</tt> de notre page de détail.
-</p>
-
-<img src="<%~ output4.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/CreateListPost.page b/demos/blog-tutorial/protected/pages/Day4/fr/CreateListPost.page deleted file mode 100755 index ab6ddfc4..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/CreateListPost.page +++ /dev/null @@ -1,182 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page d'affichage des messages <tt>ListPost</tt></h1>
-
-<p>
-La page <tt>ListPost</tt> affiche les derniers messages sous forme de liste. S'il y a trop de messages, ils seront affichés dans différentes pages.
-</p>
-
-<p>
-Avant que nous ne passions à l'implémentation, nous voudrions que notre page d'accueil pointe vers la page à venir <tt>ListPost</tt>, 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 <tt>protected/application.xml</tt> de cette manière.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<services>
- <service id="page" class="TPageService" DefaultPage="posts.ListPost">
- <pages MasterClass="Application.layouts.MainLayout" />
- </service>
-</services>
-</com:TTextHighlighter>
-
-<p>
-Nous alons maintenant créer le gabarit et le fichier de classe pour notre page <tt>ListPost</tt> : <tt>protected/pages/posts/ListPost.page</tt> et <tt>protected/pages/posts/ListPost.php</tt>.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-Pour satisfaire les fonctionnalités de notre page <tt>ListPost</tt>, nous allons utiliser deux contrôles dans notre gabarit.
-</p>
-<ul>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: ce contrôle permet d'afficher principalement une liste d'éléments. La présentation de chacun ce ces éléments peut être défini soit par un gabarit interne, soit par un gabarit externe (choix que nous avons fait).</li>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Pager">TPager</a>: ce contrôle permet de faire la pagination d'une liste d'éléments. Il interagit avec l'utilisateur pour définir quelle page doit être affiché dans un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">contrôle de liste</a> (ie: <tt>TListBox</tt>) ou dans un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Data">contrôle de données</a> (ie: <tt>TRepeater</tt>).</li>
-</ul>
-<p>
-Ci-dessous le contenu du gabarit :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon Blog" %>
-
-<com:TContent ID="Main">
-
-<com:TRepeater ID="Repeater"
- ItemRenderer="Application.pages.posts.PostRenderer"
- AllowPaging="true"
- AllowCustomPaging="true"
- PageSize="5"
- />
-
-<com:TPager ControlToPaginate="Repeater" OnPageIndexChanged="pageChanged" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Dans la partie répétée <tt>TRepeater</tt>, nous indiquons que l'affichage du contenu est délégué à l'élément <tt>PostRenderer</tt> que nous allons créer après. Pour permettre à PRADO de trouver cette classe, nous fournissons l'espace de noms complet <tt>Application.pages.posts.PostRenderer</tt>, qui correspond au fichier <tt>protected/pages/posts/PostRenderer.php</tt>.
-</p>
-
-<p>
-Nous définissons aussi quelques propriétés complémentaires du <tt>TRepeater</tt> pour activer la pagination. Et nous définissons la propriété <tt>ControlToPaginate</tt> du <tt>TPager</tt> afin qu'il sache quelle est la zone répetée à paginer.
-</p>
-
-
-<h2>Création du fichier de classe</h2>
-<p>
-En fonction du gabarit précédent, nous pouvons voir que notre fichier de classe doit implémenter un gestionnaire d'évènement pour <tt>pageChanged()</tt> (déclenché par <tt>OnPageIndexChanged</tt> du <tt>TPager</tt>). Nous devons aussi remplir les données qui apparaitront dans le <tt>TRepeater</tt>. Ci-dessous le source complet du fichier de classe :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class ListPost extends TPage
-{
- /**
- * Initialise le TRepeater.
- * Cette méthode est appelé par le framework lors de l'initialisation de la page
- * @param mixed param : paramètres de l'évènement
- */
- public function onInit($param)
- {
- parent::onInit($param);
- if(!$this->IsPostBack) // la page est chargée pour la première fois ?
- {
- // récupère le nombre total de messages
- $this->Repeater->VirtualItemCount=PostRecord::finder()->count();
- // rempli le TRepeater avec les données
- $this->populateData();
- }
- }
-
- /**
- * Gestionnaire d'évènement pour OnPageIndexChanged du TPager.
- * Cette méthode est appelée lors du changement de page
- */
- public function pageChanged($sender,$param)
- {
- // change l'index de la page courante par le nouvel index
- $this->Repeater->CurrentPageIndex=$param->NewPageIndex;
- // rempli de nouveau le TRepeater
- $this->populateData();
- }
-
- /**
- * détermine quelle page doit être affichée et remplie
- * TRepeater avec les données lues
- */
- protected function populateData()
- {
- $offset=$this->Repeater->CurrentPageIndex*$this->Repeater->PageSize;
- $limit=$this->Repeater->PageSize;
- if($offset+$limit>$this->Repeater->VirtualItemCount)
- $limit=$this->Repeater->VirtualItemCount-$offset;
- $this->Repeater->DataSource=$this->getPosts($offset,$limit);
- $this->Repeater->dataBind();
- }
-
- /**
- * lis les données à partir de la base de données en utilisant les fonctionnalités offset et limit.
- */
- protected function getPosts($offset, $limit)
- {
- // construit les critères de la requête
- $criteria=new TActiveRecordCriteria;
- $criteria->OrdersBy['create_time']='desc';
- $criteria->Limit=$limit;
- $criteria->Offset=$offset;
- // lit les messages en fonction des critères précédents
- return PostRecord::finder()->withAuthor()->findAll($criteria);
- }
-}
-</com:TTextHighlighter>
-
-<h2>Création du <tt>PostRenderer</tt></h2>
-
-<p>
-Nous devons toujours créer la classe <tt>PostRenderer</tt>. Elle définit la manière dont sera affichée chaque ligne de notre <tt>TRepeater</tt>. 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 <tt>PostRenderer.tpl</tt> et <tt>PostRenderer.php</tt> dans le dossier <tt>protected/pages/posts</tt>.
-</p>
-<h3>Création du gabarit pour <tt>PostRenderer</tt></h3>
-<p>
-Le gabarit définit la présentation des différentes informations d'un message : titre, nom, heure, contenu. Nous lions le titre à la page <tt>ReadPost</tt> qui affiche le détail du message.
-</p>
-<p>
-L'expression <tt>$this->Data</tt> fait référence aux données provenant du <tt>TRepeater</tt>. Dans notre cas, c'est un objet de type <tt>PostRecord</tt>. Remarquez comment nous accédons au nom de l'auteur du message par <tt>$this->Data->author->username</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div class="post-box">
-<h3>
-<com:THyperLink Text="<%# $this->Data->title %>"
- NavigateUrl="<%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
-</h3>
-
-<p>
-Auteur:
-<com:TLiteral Text="<%# $this->Data->author->username %>" /><br/>
-Heure:
-<com:TLiteral Text="<%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
-</p>
-
-<p>
-<com:TLiteral Text="<%# $this->Data->content %>" />
-</p>
-</div>
-</com:TTextHighlighter>
-
-<h3>Création du fichier de classe pour <tt>PostRenderer</tt></h3>
-
-<p>
-Notre classe est très simple, elle hérite de <tt>TRepeaterItemRenderer</tt> et ne contient aucun autre code.
-</p>
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRenderer extends TRepeaterItemRenderer
-{
-}
-</com:TTextHighlighter>
-
-<h2>Test</h2>
-<p>
-Pour tester la page <tt>ListPost</tt>, naviguons à l'URL <tt>http://hostname/blog/index.php</tt> (rappellez-vous, nous avons défini <tt>ListPost</tt> 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 <tt>NewPost</tt>, nous pourrons ajouter des messages et revenir ici pour tester notre contrôle de pagination.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/CreateNewPost.page b/demos/blog-tutorial/protected/pages/Day4/fr/CreateNewPost.page deleted file mode 100755 index 9ddd97b9..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/CreateNewPost.page +++ /dev/null @@ -1,144 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page nouveau message <tt>NewPost</tt></h1>
-
-<p>
-La page <tt>NewPost</tt> permet aux utilisateurs authentifiés de créer des nouveaux messages. Elle doit afficher un formulaire permettant la saisie des informations du message.
-</p>
-
-
-<p>
-Parce que la page <tt>NewPost</tt> ne peut être vue que par les utilisateurs authentifiés, nous ajoutons un fichier de configuration de page <tt>config.xml</tt> dans le dossier <tt>protected/pages/posts</tt>. Ce fichier indique que seuls les utilisateurs authentifiés peuvent voir les pages <tt>NewPost</tt> et <tt>EditPost</tt> qui sera implémentée dans la section suivante. Tous les autres utilisateurs n'ont accès qu'aux pages <tt>ListPost</tt> et <tt>ReadPost</tt>.
-</p>
-
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <authorization>
- <allow pages="NewPost,EditPost" users="@" /> - <allow pages="ListPost,ReadPost" /> - <deny users="*" /> - </authorization>
-</configuration>
-</com:TTextHighlighter> -
-<com:TipBox> - Il est souvent utile de démarrer les règles d'autorisation par un <tt><deny users="*"></tt>, puis, de le compléter en donnant pas à pas les accès aux différentes pages à l'aides de règles <tt>allow</tt> supplémentaires -</com:TipBox>
-<p>
-Vu le nombre grandissant de pages, nous allons modifier le pied de page de notre <tt>gabarit principal</tt> pour qu'il inclus des liens vers : la page d'accueil, la page nouvel utilisateur <a href="?page=Day3.CreateNewUser">NewUser</a> (visible seulement par les administrateurs), et la page à venir : nouveau message <tt>NewPost</tt> (visible seulement par les utilisateurs authentifiés).
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div id="footer">
-<com:THyperLink Text="Accueil"
- NavigateUrl="<%= $this->Service->DefaultPageUrl %>" />
-
-<com:THyperLink Text="Nouveau message"
- NavigateUrl="<%= $this->Service->constructUrl('posts.NewPost') %>"
- Visible="<%= !$this->User->IsGuest %>" />
-
-<com:THyperLink Text="Nouvel utilisateur"
- NavigateUrl="<%= $this->Service->constructUrl('users.NewUser') %>"
- Visible="<%= $this->User->IsAdmin %>" />
-...autres liens...
-</div>
-</com:TTextHighlighter>
-
-<p>
-Nous allons maintenant créer deux fichiers <tt>protected/pages/posts/NewPost.page</tt> et <tt>protected/pages/posts/NewPost.php</tt> contenant respectivement le gabarit et la classe de notre page.
-</p>
-
-
-<h2>Création du gabarit</h2>
-<p>
-Le gabarit de <tt>NewPost</tt> contient une référence à un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> pour saisir le titre de notre message et à un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.HtmlArea">THtmlArea</a> 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.
-</p>
-
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="Mon Blog - Nouveau Message" %>
-
-<com:TContent ID="Main">
-
-<h1>Création nouveau message</h1>
-
-<span>Titre:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Veuillez indiquer un titre."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-<br/>
-<span>Message:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Veuillez indiquer le contenu du message."
- Display="Dynamic" />
-<br/>
-<com:THtmlArea ID="ContentEdit" />
-
-<br/>
-<com:TButton Text="Ajouter" OnClick="createButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Création du fichier de classe</h2>
-<p>
-Dans le gabarit précédent, nous voyons que la fonction principale de notre page est l'appel de la méthode <tt>createButtonClicked()</tt> implémenté par un évènement <tt>OnClick</tt> attaché au bouton <tt>Ajouter</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class NewPost extends TPage
-{
- /**
- * création d'un nouveau message si toutes les données sont valides.
- * cette méthode est appelée par l'évènement OnClick du bouton "Ajouter".
- * @param mixed sender : celui qui a généré l'évènement
- * @param mixed param : paramètres de l'évènement
- */
- public function createButtonClicked($sender,$param)
- {
- if($this->IsValid) // tous les validateurs sont Ok ?
- {
- // créer un nouvel objet PostRecord avec les données du formulaire
- $postRecord=new PostRecord;
- // utiliser SafeText à la place de Text évite les attaques XSS
- $postRecord->title=$this->TitleEdit->SafeText;
- $postRecord->content=$this->ContentEdit->SafeText;
- $postRecord->author_id=$this->User->Name;
- $postRecord->create_time=time();
- $postRecord->status=0;
-
- // enregistre les données dans la BDD par la méthode save de l'Active Record
- $postRecord->save();
-
- // redirige le navigateur vers le message nouvellement créé
- $url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
- $this->Response->redirect($url);
- }
- }
-}
-</com:TTextHighlighter>
-
-<h2>Test</h2>
-<p>
-Pour tester notre page <tt>NewPost</tt>, identifiez-vous auparavant et cliquez sur le lien <tt>Nouveau message</tt> dans le pied de page. Le navigateur affiche le résultat suivant avec comme URL <tt>http://hostname/blog/index.php?page=NewPost</tt>.
-</p> -
-<com:InfoBox>
-Quand vous visitez la page <tt>NewPost</tt> pour la première fois, vous pourrez remarquer qu'elle mettra plusieurs secondes avant de s'afficher. Ceci est dû au fait que PRADO a besoin de décompresser et de publier le code javascript et les images pour l'éditeur WYSIWYG du contrôle <tt>THtmlArea</tt>. Ceci est fait une fois pour toutes.
-</com:InfoBox>
-
-<com:TipBox>
-Pour tester la fonctionnalité de pagination que nous avons mise en place dans la page <a href="?page=Day4.CreateListPost">ListPost</a>, nous pouvons créer cinq messages ou plus et regardez ce qu'il se passe sur la page d'accueil. Le contrôle <tt>TPager</tt> de la page <tt>ListPost</tt> affiche cinq éléments par page.
-</com:TipBox>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/CreateReadPost.page b/demos/blog-tutorial/protected/pages/Day4/fr/CreateReadPost.page deleted file mode 100755 index 385737d3..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/CreateReadPost.page +++ /dev/null @@ -1,135 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Création de la page détail d'un message <tt>ReadPost</tt></h1>
-
-<p>
-La page <tt>ReadPost</tt> affiche le détail d'un message. Pour les utilisateurs autorisés, un lien sera disponible permettant de modifier ou de supprimer le message.
-</p>
-
-<p>
-Nous créons deux fichiers <tt>protected/pages/posts/ReadPost.page</tt> et <tt>protected/pages/posts/ReadPost.php</tt> qui contiendront respectivement notre gabarit et notre classe.
-</p>
-
-<h2>Création du gabarit</h2>
-<p>
-Le gabarit de <tt>ReadPost</tt> est très proche du gabarit de <tt>PostRenderer</tt>, chacun d'eux affiche le détail d'un message. La différence est que la page <tt>ReadPost</tt> doit afficher deux boutons, permettant aux utilisateurs autorisés de modifier ou supprimer le message.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<com:TContent ID="Main">
-
-<h2>
-<com:TLiteral Text="<%= $this->Post->title %>" />
-</h2>
-
-<com:TControl Visible="<%= $this->canEdit() %>">
- <a href="<%= $this->Service->constructUrl('posts.EditPost',array('id'=>$this->Post->post_id))%>">Modifier</a> |
- <com:TLinkButton Text="Supprimer"
- OnClick="deletePost"
- Attributes.onclick="javascript:if(!confirm('Etes vous sûr ?')) return false;" />
-</com:TControl>
-
-<p>
-Auteur:
-<com:TLiteral Text="<%= $this->Post->author->username %>" /><br/>
-Heure:
-<com:TLiteral Text="<%= date('m/d/Y h:m:sa', $this->Post->create_time) %>" />
-</p>
-
-<p>
-<com:TLiteral Text="<%= $this->Post->content %>" />
-</p>
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Plusieurs expressions PHP sont utilisées dans le gabarit. L'expression <tt>$this->Post</tt> fait référence à la propriété définie dans la classe de <tt>ReadPost</tt>. Elle représente l'objet <tt>PostRecord</tt> correspondant au message actuel.
-</p>
-
-<com:InfoBox>
-Même si nous utilisons régulièrement des expressions dans nos gabarits, nous n'en abusons pas. Une des règles principales pour savoir si l'on doit utiliser une expression est <i>l'expression doit être une propriété ou une simple mise en forme d'une propriété</i>. En suivant cette ligne de conduite, nous nous assurons d'une bonne séparation entre le contenu et la présentation, sans perdre en flexibilité.
-</com:InfoBox>
-
-<p>
-Nous pouvons aussi remarquer dans le gabarit précédent, que, nos deux boutons sont entourés d'un <tt>TControl</tt> dont la propriété 'visible' est déterminée par l'expression <tt>$this->canEdit()</tt>. Pour le bouton <tt>Supprimer</tt>, 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 <tt>TControl</tt> dont la propriété 'visible' est déterminée par l'expression <tt>$this->canEdit()</tt>. Pour le bouton <tt>Supprimer</tt>, nous utilisons une boite de dialogue javascript pour confirmer la suppression du message.
-</p>
-
-<com:InfoBox>
-Tous les contrôles PRADO, ont une propriété très utile <tt>Attributes</tt> qui accepte n'importe quelle paire de valeurs (nom-valeur). La plupart des contrôles PRADO répercutent directement ces informations dans la balise HTML. Par exemple, dans le bouton <tt>Supprimer</tt> nous définissons <tt>onclick</tt> qui est directement reporté dans la balise <tt><a></tt> sous forme d'un attribut <tt>onclick</tt>.
-</com:InfoBox>
-
-<h2>Création du fichier de classe</h2>
-
-<p>
-Dans le gabarit précédent, nous voyons que notre classe doit implémenter le gestionnaire d'évènement <tt>deletePost()</tt> (attaché à l'évènement <tt>Onclick</tt> de notre bouton <tt>Supprimer</tt>). Nous devons aussi lire les données du message dont l'ID est passé par un paramètre GET.</p>
-
-<com:InfoBox>
-Nous implémentons la fonctionnalité suppression dans le classe <tt>ReadPost</tt> parce qu'il est classique de faire ainsi. Quand l'utilisateur clique sur le bouton <tt>Supprimer</tt>, une boite de dialogue demande confirmation de la suppression. Si l'utilisateur confirme, l'évènement <tt>OnClick</tt> du bouton <tt>Supprimer</tt> est déclenché.
-</com:InfoBox>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class ReadPost extends TPage
-{
- private $_post;
- /**
- * lis les données du message.
- * cette méthode est appelée lors de l'initialisation de la page
- * @param mixed param : paramètres de l'évènement
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // id du message passé par un paramètre GET
- $postID=(int)$this->Request['id'];
- // lis le message ainsi que les données correspondantes à l'auteur
- $this->_post=PostRecord::finder()->withAuthor()->findByPk($postID);
- if($this->_post===null) // si l'id du message est invalide
- throw new THttpException(500, 'Impossible de trouver le message demandé.');
- // défini le titre de la page comme étant celui du message
- $this->Title=$this->_post->title;
- }
-
- /**
- * @return PostRecord retourne l'objet PostRecord correspondant au message
- */
- public function getPost()
- {
- return $this->_post;
- }
-
- /**
- * supprime le message actuellement visualisé
- * cette méthode est appelée par l'évènement OnClick du bouton "Supprimer"
- */
- public function deletePost($sender,$param)
- {
- // seul l'auteur ou un administrateur peuvent supprimer le message
- if(!$this->canEdit())
- throw new THttpException('Nous n'êtes pas autorisé à effectuer cette action.');
- // le supprime de la base de données
- $this->_post->delete();
- // redirige le navigateur vers la page d'accueil
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
-
- /**
- * @return boolean infiquant si le message peut être modifier ou supprimer par l'utilisateur actuel
- */
- public function canEdit()
- {
- // seul l'auteur ou un administrateur peuvent modifier/supprimer le message
- return $this->User->Name===$this->Post->author_id || $this->User->IsAdmin;
- }
-}
-</com:TTextHighlighter>
-
-<h2>Test</h2>
-<p>
-Pour tester notre page <tt>ReadPost</tt>, allons à l'URL <tt>http://hostname/blog/index.php</tt> et cliquons sur le titre du seul message affiché. Notre navigateur devrait afficher le résultat suivant avec l'URL <tt>http://hostname/blog/index.php?page=ReadPost&id=1</tt>. Notez que si vous n'êtes pas connecté, les deux boutons ne sont pas visibles.
-</p>
-
-<img src="<%~ output2.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/Overview.page b/demos/blog-tutorial/protected/pages/Day4/fr/Overview.page deleted file mode 100755 index baaf13af..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/Overview.page +++ /dev/null @@ -1,28 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Vue d'ensemble de la gestion des messages</h1> -
-<p>
-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).
-</p>
-
-
-<p>
-Nous allons créer les nouvelles pages dans le dossier <tt>protected/pages/posts</tt> créé à cet effet.
-</p>
-
-
-<ul>
- <li><tt>ListPost</tt> affiche la liste des messages triés par ordre de date décroissante.</li>
- <li><tt>ReadPost</tt> affiche le détail d'un message.</li>
- <li><tt>NewPost</tt> permet aux utilisateurs enregistrés de créer un nouveau message.</li>
- <li><tt>EditPost</tt> permet à l'auteur et aux administrateurs de modifier un message.</li>
-</ul>
-
-<p>
-Après avoir fini cette section, nous devrions obtenir l'arborescence suivante :
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day4/fr/directories.gif Binary files differdeleted file mode 100755 index 5ba55184..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/output.gif b/demos/blog-tutorial/protected/pages/Day4/fr/output.gif Binary files differdeleted file mode 100755 index 8c1caea8..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/output2.gif b/demos/blog-tutorial/protected/pages/Day4/fr/output2.gif Binary files differdeleted file mode 100755 index 7078e6c6..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/output3.gif b/demos/blog-tutorial/protected/pages/Day4/fr/output3.gif Binary files differdeleted file mode 100755 index ff1834a4..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/fr/output4.gif b/demos/blog-tutorial/protected/pages/Day4/fr/output4.gif Binary files differdeleted file mode 100755 index b1208a0d..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/fr/output4.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/id/CreateEditPost.page b/demos/blog-tutorial/protected/pages/Day4/id/CreateEditPost.page deleted file mode 100755 index b7ded3b3..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/CreateEditPost.page +++ /dev/null @@ -1,133 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>EditPost</tt></h1>
-
-<p>
-Halaman <tt>EditPost</tt> disediakan bagi para pembuat dan administrator untuk mengedit tulisan blog yang sudah ada. Seperti halaman <a href="?page=Day4.CreateNewPost">NewPost</a> , ia menampilkan sebuah formulir untuk mengumpulkan perubahan terhadap judul dan konten tulisan.
-</p>
-
-<p>
-Kita membuat dua file <tt>protected/pages/posts/EditPost.page</tt> dan <tt>protected/pages/posts/EditPost.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Template halaman <tt>EditPost</tt> sangat mirip dengan template <tt>NewPost</tt>. Hanya judul halaman dan tombol yang berbeda.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - Edit Post" %>
-
-<com:TContent ID="Main">
-
-<h1>Edit Post</h1>
-
-<span>Title:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Please provide a title."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-<br/>
-<span>Content:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Please provide content."
- Display="Dynamic" />
-<br/>
-<com:THtmlArea ID="ContentEdit" />
-
-<br/>
-<com:TButton Text="Save" OnClick="saveButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Kelas halaman <tt>EditPage</tt> lebih kompleks dibanding <tt>NewPage</tt> 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.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class EditPost extends TPage
-{
- /**
- * Menginisialisasi input dengan data tulisan yang sudah ada.
- * Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi.
- * @param parameter event campuran
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // Menambil data pengguna yang sudah ada. Ini sama dengan:
- // $postRecord=$this->getPost();
- $postRecord=$this->Post;
- // Pemeriksaan otorisasi: hanya pembuat atau administrator dapat mengedit tulisan
- if($postRecord->author_id!==$this->User->Name && !$this->User->IsAdmin)
- throw new THttpException(500,'You are not allowed to edit this post.');
-
- if(!$this->IsPostBack) // jika halaman pertama kali diminta
- {
- // Mempopulasikan kontrol input dengan data tulisan yang sudah ada
- $this->TitleEdit->Text=$postRecord->title;
- $this->ContentEdit->Text=$postRecord->content;
- }
- }
-
- /**
- * Menyimpan tulisan jika semua input sudah benar.
- * Metode ini merespon event OnClick pada tombol "Save".
- * @param pengirim event campuran
- * @param parameter event campuran
- */
- public function saveButtonClicked($sender,$param)
- {
- if($this->IsValid) // jika semua validasi sukses
- {
- // Mengambil data pengguna yang sudah ada. Ini sama dengan:
- // $postRecord=$this->getPost();
- $postRecord=$this->Post;
-
- // Mengambil data input
- $postRecord->title=$this->TitleEdit->SafeText;
- $postRecord->content=$this->ContentEdit->SafeText;
-
- // menyimpan ke database via mekanisme Rekaman Aktif
- $postRecord->save();
-
- // mengalihkan browser ke halaman ReadPost
- $url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
- $this->Response->redirect($url);
- }
- }
-
- /**
- * Mengembalikan data tulisan yang akan diedit.
- * @return PostRecord data tulisan yang akan diedit.
- * @throws THttpException jika data tulisan tidak ada.
- */
- protected function getPost()
- {
- // ID tulisan yang diedit dikirimkan via parameter GET 'id'
- $postID=(int)$this->Request['id'];
- // gunakan Rekaman Aktif untuk mencari ID tulisan tertentu
- $postRecord=PostRecord::finder()->findByPk($postID);
- if($postRecord===null)
- throw new THttpException(500,'Post is not found.');
- return $postRecord;
- }
-}
-</com:TTextHighlighter>
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>EditPost</tt>, masuk lebih dulu dan kemudian kunjungi URL berikut: <tt>http://hostname/blog/index.php?page=EditPost&id=1</tt>. URL ini juga bisa dijangkau dengan mengklik link <tt>Edit</tt> pada halaman rician tulisan.
-</p>
-
-<img src="<%~ output4.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page b/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page deleted file mode 100755 index d682535e..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page +++ /dev/null @@ -1,185 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>ListPost</tt></h1>
-
-<p>
-Halaman <tt>ListPost</tt> menampilkan tulisan blog terakhir dalam sebuah daftar. Jika di sana terlalu banyak tulisan, maka akan ditampilkan dalam beberapa lembar halaman.
-</p>
-
-<p>
-Sebelum kita berlanjut dengan implementasi, kita ingin mengarahkan homepage kita ke halaman <tt>ListPage</tt> mendatang, karena kita ingin para pengguna melihat tulisan terakhir saat mereka menyentuh website. Untuk melakukannya, kita mengubah konfigurasi aplikasi <tt>protected/application.xml</tt> sebagai berikut,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<services>
- <service id="page" class="TPageService" DefaultPage="posts.ListPost">
- <pages MasterClass="Application.layouts.MainLayout" />
- </service>
-</services>
-</com:TTextHighlighter>
-
-<p>
-Sekarang kita membuat file template dan kelas untuk halaman <tt>ListPost</tt>: <tt>protected/pages/posts/ListPost.page</tt> dan <tt>protected/pages/posts/ListPost.php</tt>.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Berdasarkan pada kebutuhan fungsionalitas halaman <tt>ListPost</tt>, kita akan menggunakan dua kontrol dalam template halaman:
-</p>
-<ul>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: kontrol ini dipakai terutama untuk menampilkan daftar atas item data. Penyajian dari setiap item data bisa ditetapkan melalui template inline atau kontrol template eksternal (pendekatan yang akan kita gunakan di sini).</li>
-<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Pager">TPager</a>: kontrol ini dipakai untuk memecah daftar item data. Ia berinteraksi dengan pengguna-akhir untuk menentukan halaman data mana yang ditampilkan dalam <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">kontrol daftar</a> (misalnya <tt>TListBox</tt>) pada <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Data">kontrol data</a> (misalnya <tt>TRepeater</tt>).</li>
-</ul>
-
-<p>
-Di bawah ini adalah konten dalam template halaman:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog" %>
-
-<com:TContent ID="Main">
-
-<com:TRepeater ID="Repeater"
- ItemRenderer="Application.pages.posts.PostRenderer"
- AllowPaging="true"
- AllowCustomPaging="true"
- PageSize="5"
- />
-
-<com:TPager ControlToPaginate="Repeater" OnPageIndexChanged="pageChanged" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Dalam pengulang, kita menetapkan bahwa konten yang diulang ditampilkan menggunakan penyaji item <tt>PostRenderer</tt> yang akan kita buat nantinya. Agar PRADO bisa menemukan kelas ini, kita memberikan namespace <tt>Application.pages.posts.PostRenderer</tt>, berarti file kelasnya adalah <tt>protected/pages/posts/PostRenderer.php</tt>.
-</p>
-
-<p>
-Kita juga menyetel beberapa properti lain pada pengulang untuk menghidupkan lembaran halaman. Dan kita menyetel properti <tt>ControlToPaginate</tt> pada lembaran agar ia mengetahui konten mana yang diulang harus dibuat lembaran.
-</p>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: <tt>pageChanged()</tt> (ditempelkan ke event lembaran <tt>OnPageIndexChanged</tt>). Kita juga perlu mempopulasikan data tulisan ke dalam pengulang berdasarkan pada setelan lembaran saat ini. Berikut ini adalah kode sumber lengkap kelas halaman:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class ListPost extends TPage
-{
- /**
- * Menginisialisasi pengulang.
- * Metode ini dipanggil oleh kerangka kerja saat menginisialisasi halaman
- * @param mixed event parameter
- */
- public function onInit($param)
- {
- parent::onInit($param);
- if(!$this->IsPostBack) // jika halaman diminta pertama kali
- {
- // ambil jumlah total tulisan yang tersedia
- $this->Repeater->VirtualItemCount=PostRecord::finder()->count();
- // populasikan data tulisan ke dalam pengulang
- $this->populateData();
- }
- }
-
- /**
- * Pengendali event untuk event OnPageIndexChanged pada lembaran.
- * Metode ini dipanggil saat pengguna mengklik tombol halaman
- * dan kemudian mengubah halaman tulisan yang ditampilkan.
- */
- public function pageChanged($sender,$param)
- {
- // ubah indeks halaman sekarang ke yang baru
- $this->Repeater->CurrentPageIndex=$param->NewPageIndex;
- // re-populasi data ke dalam pengulang
- $this->populateData();
- }
-
- /**
- * Menentukan halaman tulisan mana yang ditampilkan dan
- * mempopulasi pengulang dengan data yang sudah diambil.
- */
- protected function populateData()
- {
- $offset=$this->Repeater->CurrentPageIndex*$this->Repeater->PageSize;
- $limit=$this->Repeater->PageSize;
- if($offset+$limit>$this->Repeater->VirtualItemCount)
- $limit=$this->Repeater->VirtualItemCount-$offset;
- $this->Repeater->DataSource=$this->getPosts($offset,$limit);
- $this->Repeater->dataBind();
- }
-
- /**
- * Mengambil tulisan dari database dengan ofset dan limit.
- */
- protected function getPosts($offset, $limit)
- {
- // Bentuk kriteria query
- $criteria=new TActiveRecordCriteria;
- $criteria->OrdersBy['create_time']='desc';
- $criteria->Limit=$limit;
- $criteria->Offset=$offset;
- // query untuk tulisan dengan kriteria di atas dan informasi pembuat
- return PostRecord::finder()->withAuthor()->findAll($criteria);
- }
-}
-</com:TTextHighlighter>
-
-<h2>Membuat <tt>PostRenderer</tt></h2>
-
-<p>
-Kita masih perlu untuk membuat kelas penyaji item <tt>PostRenderer</tt>. 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 <tt>PostRenderer.tpl</tt> dan <tt>PostRenderer.php</tt> di bawah direktori <tt>protected/pages/posts</tt>.
-</p>
-
-<h3>Membuat Template Penyaji</h3>
-<p>
-Template penyaji menetapkan penyajian berbagai field dalam sebuah tulisan, termasuk judul, nama pembuat, waktu penulisan dan kontennya. Kita me-link judul tulisan ke <tt>ReadPost</tt> yang menampilkan lebih rinci atas tulisan yang dipilih.
-</p>
-<p>
-Ekspresi <tt>$this->Data</tt> merujuk ke item data yang dikirimkan ke pengulang. Dalam kasus kita, ia adalah obyek <tt>PostRecord</tt>. Perhatikan bagaimana kita mengambil nama pembuat pada tulisan dengan <tt>$this->Data->author->username</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div class="post-box">
-<h3>
-<com:THyperLink Text="<%# $this->Data->title %>"
- NavigateUrl="<%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
-</h3>
-
-<p>
-Author:
-<com:TLiteral Text="<%# $this->Data->author->username %>" /><br/>
-Time:
-<com:TLiteral Text="<%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
-</p>
-
-<p>
-<com:TLiteral Text="<%# $this->Data->content %>" />
-</p>
-</div>
-</com:TTextHighlighter>
-
-<h3>Membuat Kelas Penyaji</h3>
-<p>
-Kelas penyaji sangat sederhana. Ia diperluas dari <tt>TRepeaterItemRenderer</tt> dan tidak berisi kode apapun.
-</p>
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRenderer extends TRepeaterItemRenderer
-{
-}
-</com:TTextHighlighter>
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>ListPost</tt>, kunjungi URL <tt>http://hostname/blog/index.php</tt> (ingat kita telah menyetel <tt>ListPost</tt> 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 <tt>NewPost</tt>, kita dapat menambah tulisan lebih banyak dan datang kembali untuk menguji lembaran halaman lagi.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/id/CreateNewPost.page b/demos/blog-tutorial/protected/pages/Day4/id/CreateNewPost.page deleted file mode 100755 index 31aba2bb..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/CreateNewPost.page +++ /dev/null @@ -1,142 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>NewPost</tt></h1>
-
-<p>
-Halaman <tt>NewPost</tt> 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.
-</p>
-
-<p>
-Karena <tt>NewPost</tt> hanya bisa diakses oleh pengguna terotentikasi, kita menambahkan file konfigurasi <tt>config.xml</tt> di bawah direktori <tt>protected/pages/posts</tt>. Konfigurasi menetapkan bahwa para pengguna tidak bisa mengakses <tt>NewPost</tt> dan <tt>EditPost</tt> yang akan diperkenalkan dalam bagian berikutnya. Semua pengguna lainnya hanya memiliki akses ke <tt>ListPost</tt> dan <tt>ReadPost</tt>
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <authorization>
- <deny pages="NewPost,EditPost" users="?" />
- <allow pages="ListPost,ReadPost" />
- <deny users="*" />
- </authorization>
-</configuration>
-</com:TTextHighlighter>
-
-<com:TipBox>
-Selalu menjadi ide yang baik untuk memulai dengan <tt>deny="*"</tt> yang menampung semua aturan dari bawah dan secara bertahap memberikan akses ke halaman dengan aturan tambahan.
-</com:TipBox>
-
-<p>
-Karena jumlah halaman kita berkembang, kita ingin memodifikasi <tt>MainLayout</tt> agar dalam footer pada halaman blog kita ada link ke berbagai halaman, termasuk homepage, halaman <a href="?page=Day3.CreateNewUser">NewUser</a> (hanya terlihat oleh administrator), dan halaman <tt>NewPost</tt> mendatang (hanya terlihat oleh pengguna terotentikasi).
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<div id="footer">
-<com:THyperLink Text="Home"
- NavigateUrl="<%= $this->Service->DefaultPageUrl %>" />
-
-<com:THyperLink Text="New Post"
- NavigateUrl="<%= $this->Service->constructUrl('posts.NewPost') %>"
- Visible="<%= !$this->User->IsGuest %>" />
-
-<com:THyperLink Text="New User"
- NavigateUrl="<%= $this->Service->constructUrl('users.NewUser') %>"
- Visible="<%= $this->User->IsAdmin %>" />
-...other links...
-</div>
-</com:TTextHighlighter>
-
-<p>
-Sekarang kita membuat dua file <tt>protected/pages/posts/NewPost.page</tt> dan <tt>protected/pages/posts/NewPost.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Template halaman <tt>NewPost</tt> berisi <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> untuk mengumpulkan judul tulisan dan <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.HtmlArea">THtmlArea</a> untuk mengumpulkan konten tulisan. Yang terakhir adalah editor HTML WYSIWYG. Guna memastikan bahwa input pengguna sudah benar, kita mengaitkan validator dengan kontrol input ini.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<%@ Title="My Blog - New Post" %>
-
-<com:TContent ID="Main">
-
-<h1>Membuat Tulisan Baru</h1>
-
-<span>Title:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="TitleEdit"
- ErrorMessage="Please provide a title."
- Display="Dynamic" />
-<br/>
-<com:TTextBox ID="TitleEdit" Columns="50" />
-
-<br/>
-<span>Content:</span>
-<com:TRequiredFieldValidator
- ControlToValidate="ContentEdit"
- ErrorMessage="Please provide content."
- Display="Dynamic" />
-<br/>
-<com:THtmlArea ID="ContentEdit" />
-
-<br/>
-<com:TButton Text="Create" OnClick="createButtonClicked" />
-
-</com:TContent>
-</com:TTextHighlighter>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Dari template halaman di atas, kita melihat bahwa sebagian besar kita perlu menulis sebuah kelas halaman yang mengimplementasikan pengendali event: <tt>createButtonClicked()</tt> (ditempelkan ke tombo <tt>Create</tt> dalam event <tt>OnClick</tt>).
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class NewPost extends TPage
-{
- /**
- * Membuat tulisan baru jika semua input benar.
- * Metode ini merespon event OnClick pada tombol "create".
- * @param mixed event sender
- * @param mixed event parameter
- */
- public function createButtonClicked($sender,$param)
- {
- if($this->IsValid) // bila semua validasi sukses
- {
- // populasikan obyek PostRecord dengan input pengguna
- $postRecord=new PostRecord;
- // menggunakan SafeText datipada Text guna menghindari serangan Penaskahan Situs Silang
- $postRecord->title=$this->TitleEdit->SafeText;
- $postRecord->content=$this->ContentEdit->SafeText;
- $postRecord->author_id=$this->User->Name;
- $postRecord->create_time=time();
- $postRecord->status=0;
-
- // simpan ke database lewat mekanisme Rekaman Aktif
- $postRecord->save();
-
- // alihkan browser ke halaman tulisan yang baru dibuat
- $url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
- $this->Response->redirect($url);
- }
- }
-}
-</com:TTextHighlighter>
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>NewPost</tt>, masuk lebih dulu dan klik pada link tombol <tt>New Post</tt> dalam footer pada homepage. Browser kita akan menampilkan hasil berikut dengan URL <tt>http://hostname/blog/index.php?page=NewPost</tt>.
-</p>
-
-<com:InfoBox>
-Ketika Anda mengunjungi halaman <tt>NewPost</tt> untuk pertama kali, Anda bisa melihat bahwa diperlukan beberapa detik sebelum halaman ditampilkan. Ini dikarenakan PRADO perlu mengurai dan mempublikasikan kode javascript dan gambar untuk kontrol <tt>THtmlArea</tt> yang dipakai dalam halaman. Ini dikerjakan sekali dan untuk semuanya.
-</com:InfoBox>
-
-<com:TipBox>
-Untuk menguji fitur lembaran yang kita kembangkan untuk halaman <a href="?page=Day4.CreateListPost">ListPost</a>, kita dapat membuat lima atau lebih tulisan dan melihat apa yang terjadi pada homepage. Lembar dalam <tt>ListPost</tt> menampilkan lima tulisan setiap halamannya.
-</com:TipBox>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/id/CreateReadPost.page b/demos/blog-tutorial/protected/pages/Day4/id/CreateReadPost.page deleted file mode 100755 index 9aeaed7b..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/CreateReadPost.page +++ /dev/null @@ -1,135 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Membuat Halaman <tt>ReadPost</tt></h1>
-
-<p>
-Halaman <tt>ReadPost</tt> menampilkan rincian konten tulisan blog. Untuk para pengguna yang diotorisasi, akan ditampilkan tombol link yang membolehkan mereka untuk mengedit atau menghapus tulisan.
-</p>
-
-<p>
-Kita membuat dua file <tt>protected/pages/posts/ReadPost.page</tt> dan <tt>protected/pages/posts/ReadPost.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
-</p>
-
-<h2>Membuat Template Halaman</h2>
-<p>
-Template halaman <tt>ReadPost</tt> sangat mirip dengan template <tt>PostRenderer</tt>, keduanya menyajikan konten tulisan. Perbedaannya adalah bahwa <tt>ReadPost</tt> perlu menampilkan dua tombol link ketika pengguna saat ini diotorisasi untuk mengedit atau menghapus tulisan.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<com:TContent ID="Main">
-
-<h2>
-<com:TLiteral Text="<%= $this->Post->title %>" />
-</h2>
-
-<com:TControl Visible="<%= $this->canEdit() %>">
- <a href="<%= $this->Service->constructUrl('posts.EditPost',array('id'=>$this->Post->post_id))%>">Edit</a> |
- <com:TLinkButton Text="Delete"
- OnClick="deletePost"
- Attributes.onclick="javascript:if(!confirm('Are you sure?')) return false;" />
-</com:TControl>
-
-<p>
-Author:
-<com:TLiteral Text="<%= $this->Post->author->username %>" /><br/>
-Time:
-<com:TLiteral Text="<%= date('m/d/Y h:m:sa', $this->Post->create_time) %>" />
-</p>
-
-<p>
-<com:TLiteral Text="<%= $this->Post->content %>" />
-</p>
-
-</com:TContent>
-</com:TTextHighlighter>
-
-<p>
-Banyak ekspresi PHP dipakai dalam template di atas. Ekspresi <tt>$this->Post</tt> merujuk ke properti yang didefinisikan dalam kelas halaman <tt>ReadPost</tt>. Ia mewakili obyek <tt>PostRecord</tt> yang terkait dengan tulisan yang saat ini sedang dilihat.
-</p>
-
-<com:InfoBox>
-Meskipun sebagian besar kita menggunakan ekspresi dalam template, we do not overuse them. A major guideline in determining whether we should use an expression in a template is that <i>the expression should be a property or a simple presentational transformation of the property</i>. By following this guideline, we ensure content and presentation are well separated without losing sufficient flexibility.
-</com:InfoBox>
-
-<p>
-Kita juga mencatatan dalam template di atas bahwa dua link tombol dikurung di dalam <tt>TControl</tt> yang penampakannya ditentukan oleh ekspresi <tt>$this->canEdit()</tt>. Untuk link tombol <tt>Delete</tt>, kita menggunakan dialog konfirmasi javascript untuk memperoleh konfirmasi pengguna saat ia mengklik untuk menghapus tulisan.
-</p>
-
-<com:InfoBox>
-Seluruh kontrol PRADO mempunyai properti yang sangat berguna bernama <tt>Attributes</tt> yang dapat menerima pasangan nama-nilai bebas. Kebanyakan kontrol PRADO akan menyajikan pasangan nama-nilai dalam <tt>Attributes</tt> secara literal terkait tag HTML. Sebagai contoh, daam link tombol <tt>Delete</tt> di atas, kita mendefinisikan sebuah <tt>onclick</tt> yang disajikan sebagai atribut <tt>onclick</tt> yang menghasilkan tag <tt><a></tt>.
-</com:InfoBox>
-
-
-<h2>Membuat Kelas Halaman</h2>
-
-<p>
-Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: <tt>deletePost()</tt> (ditempelkan ke tombol <tt>Delete</tt> dalam event <tt>OnClick</tt>). Kita juga perlu untuk mengambil data tulisan yang ditetapkan oleh ID tulisan melalui parameter GET <tt>id</tt>. </p>
-
-<com:InfoBox>
-Kita mengimplementasikan fitur penghapusan tulisan dalam halaman <tt>ReadPost</tt> karena ini sangat alami untuk melakukannya di sini. Ketika pengguna mengklik pada tombol <tt>Delete</tt>, dialog konfirmasi javascript akan muncul. Jika pengguna mengkonfirmasinya, penghapusan akan dibawa dalam respon terhadap event <tt>OnClick</tt> dari tombol <tt>Delete</tt>.
-</com:InfoBox>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class ReadPost extends TPage
-{
- private $_post;
- /**
- * Mengambil data tulisan.
- * Metode ini dipanggil oleh kerangka kerja saat inisialisasi halaman
- * @param mixed event parameter
- */
- public function onInit($param)
- {
- parent::onInit($param);
- // id tulisan dikirimkan via parameter GET 'id'
- $postID=(int)$this->Request['id'];
- // mengambil PostRecord dengan informasi pembuat terisi dalam
- $this->_post=PostRecord::finder()->withAuthor()->findByPk($postID);
- if($this->_post===null) // jika id tulisan tidak benar
- throw new THttpException(500,'Unable to find the specified post.');
- // setel judul halaman sebagai judul tulisan
- $this->Title=$this->_post->title;
- }
-
- /**
- * @return PostRecord yang saat ini sedang dilihat
- */
- public function getPost()
- {
- return $this->_post;
- }
-
- /**
- * Menghapus tulisan yang saat ini sedang dilihat
- * Metode ini dipanggil saat pengguna mengklik tombol "Delete"
- */
- public function deletePost($sender,$param)
- {
- // hanya pembuat atau administrator bisa menghapus tulisan
- if(!$this->canEdit())
- throw new THttpException('You are not allowed to perform this action.');
- // hapus dari DB
- $this->_post->delete();
- // alihkan browser ke homepage
- $this->Response->redirect($this->Service->DefaultPageUrl);
- }
-
- /**
- * @return boolean apakah pengguna saat ini bisa mengedit/menghapus tulisan yg sedang dilihat
- */
- public function canEdit()
- {
- // hanya pembuat atau administrator bisa mengedi/menghapus tulisan
- return $this->User->Name===$this->Post->author_id || $this->User->IsAdmin;
- }
-}
-</com:TTextHighlighter>
-
-<h2>Pengujian</h2>
-<p>
-Untuk menguji halaman <tt>ReadPost</tt>, kunjungi URL <tt>http://hostname/blog/index.php</tt> dan klik pada judul tulisan. Browser kita akan menampilkan hasil berikut dengan URL <tt>http://hostname/blog/index.php?page=ReadPost&id=1</tt>. Catatan, jika kita tidak masuk, dua tombol link tidak akan terlihat.
-</p>
-
-<img src="<%~ output2.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/id/Overview.page b/demos/blog-tutorial/protected/pages/Day4/id/Overview.page deleted file mode 100755 index 3427e11f..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/Overview.page +++ /dev/null @@ -1,26 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Tinjauan Manajemen Tulisan</h1>
-
-<p>
-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.
-</p>
-
-<p>
-Berdasarkan pada kebutuhan, kita perlu membuat halaman berikut yang diatur di bawah direktori baru <tt>protected/pages/posts</tt>.
-</p>
-
-<ul>
- <li><tt>ListPost</tt> menampilkan tulisan dengan waktu pembuatan dalam urutan mengecil.</li>
- <li><tt>ReadPost</tt> menampilkan rincian tulisan.</li>
- <li><tt>NewPost</tt> membolehkan pengguna teregistrasi untuk membuat tulisan baru.</li>
- <li><tt>EditPost</tt> membolehkan pembuat atau administrator untuk mengedit tulisan yang sudah ada.</li>
-</ul>
-
-<p>
-Setelah menyelesaikan bagian ini, kita akan mengharapkan untuk melihat direktori dan file berikut:
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day4/id/directories.gif b/demos/blog-tutorial/protected/pages/Day4/id/directories.gif Binary files differdeleted file mode 100755 index 5ba55184..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/directories.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/id/output.gif b/demos/blog-tutorial/protected/pages/Day4/id/output.gif Binary files differdeleted file mode 100755 index 8c1caea8..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/id/output2.gif b/demos/blog-tutorial/protected/pages/Day4/id/output2.gif Binary files differdeleted file mode 100755 index 7078e6c6..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/id/output3.gif b/demos/blog-tutorial/protected/pages/Day4/id/output3.gif Binary files differdeleted file mode 100755 index ff1834a4..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day4/id/output4.gif b/demos/blog-tutorial/protected/pages/Day4/id/output4.gif Binary files differdeleted file mode 100755 index b1208a0d..00000000 --- a/demos/blog-tutorial/protected/pages/Day4/id/output4.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/ErrorLogging.page b/demos/blog-tutorial/protected/pages/Day5/ErrorLogging.page index 52f7ef54..6239d312 100755 --- a/demos/blog-tutorial/protected/pages/Day5/ErrorLogging.page +++ b/demos/blog-tutorial/protected/pages/Day5/ErrorLogging.page @@ -9,7 +9,7 @@ If we try to access the URL <tt>http://hostname/blog/index.php?page=EditPost&id= <img src="<%~ output2.gif %>" class="output" />
<com:InfoBox>
-An important task in a Web application is <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Error">error handling</a> which is often associated <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">logging</a>. There are two types of errors that may occur in a PRADO application: those caused by developers and those by end-users. The former should be resolved before the application is put into production, while the latter are usually within the initial design scope and should be handled nicely (e.g. log the error and display a special page instructing the end-user what to do next.) PRADO implements a very flexible yet powerful framework for error handling and logging.
+An important task in a Web application is <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.Error">error handling</a> which is often associated <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.Logging">logging</a>. There are two types of errors that may occur in a PRADO application: those caused by developers and those by end-users. The former should be resolved before the application is put into production, while the latter are usually within the initial design scope and should be handled nicely (e.g. log the error and display a special page instructing the end-user what to do next.) PRADO implements a very flexible yet powerful framework for error handling and logging.
</com:InfoBox>
diff --git a/demos/blog-tutorial/protected/pages/Day5/Performance.page b/demos/blog-tutorial/protected/pages/Day5/Performance.page index cbaae7e4..1cdfedc1 100755 --- a/demos/blog-tutorial/protected/pages/Day5/Performance.page +++ b/demos/blog-tutorial/protected/pages/Day5/Performance.page @@ -57,7 +57,7 @@ There are other techniques to further improve the performance of a PRADO applica </p>
<p>
-For a page that is relatively stable yet frequently accessed, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.OutputCache">output caching</a> 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, <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Controls.OutputCache">output caching</a> 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.
</p>
<p>
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 @@ <h1>Using Themes and Skins</h1>
<p>
-PRADO has intrinsic support for <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Themes">themes</a>. 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 <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Advanced.Themes">themes</a>. By using themes, we can better separate logic and presentation, and we can also change the overall appearance of our blog system more easily.
</p>
<h2>Creating Theme</h2>
@@ -17,7 +17,7 @@ To create a theme named <tt>Basic</tt>, we create a subdirectory <tt>theme/Basic </p>
<com:InfoBox>
-The <tt>themes</tt> directory must be Web-accessible, like the <tt>assets</tt> directory. Do not place sensitive data files under this directory. You can change the name or location of this directory by configuring the <a href="http://www.pradosoft.com/docs/classdoc/TThemeManager">TThemeManager</a> module in the application configuration.
+The <tt>themes</tt> directory must be Web-accessible, like the <tt>assets</tt> directory. Do not place sensitive data files under this directory. You can change the name or location of this directory by configuring the <a href="http://pradosoft.github.io/docs/manual/class-TThemeManager">TThemeManager</a> module in the application configuration.
</com:InfoBox>
diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/ErrorLogging.page b/demos/blog-tutorial/protected/pages/Day5/fr/ErrorLogging.page deleted file mode 100755 index 8e7c77e6..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/ErrorLogging.page +++ /dev/null @@ -1,158 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Gestion et journalisation d'erreur</h1>
-
-<p>
-Si vous tentez de naviguez à l'URL <tt>http://hostname/blog/index.php?page=EditPost&id=100</tt>, 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.
-</p>
-
-<img src="<%~ output2.gif %>" class="output" />
-
-<com:InfoBox>
-Une des tâches importantes dans les applications Web est la <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Error">gestion des erreurs</a> ainsi que leurs <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">journalisation</a>. Il y a deux types d'erreurs qui peuvent se produire dans une application PRADO : celles provenant des développeurs et celles des utilisateurs. Les premières doivent être résolues avant que l'application ne soit en production, tandis que les deuxièmes sont généralement un problème de prise en charge au niveau du design et doivent être gérées proprement (ie: journaliser cette erreur et indiquer à l'utilisateur que faire après). PRADO fournit un ensemble de fonctionnalités très utiles pour gérer et journaliser les erreurs.
-</com:InfoBox>
-
-
-<h2>Personnalisation de la gestion d'erreur</h2>
-
-<p>
-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 :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module class="Application.BlogErrorHandler" />
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-La classe <tt>BlogErrorHandler</tt> 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 <tt>TErrorHandler</tt>.
-</p>
-
-<p>
-Nous créons un fichier nommé <tt>protected/BlogErrorHandler.php</tt> avec le contenu suivant. La classe <tt>BlogErrorHandler</tt> surcharge deux méthodes de <tt>TErrorHandler</tt> :
-</p>
-<ul>
- <li><tt>getErrorTemplate()</tt> - cette méthode renvoie le gabarit utilisé pour afficher un message d'erreur utilisateur.</li>
- <li><tt>handleExternalError()</tt> - cette méthode est appelée lorsqu'une erreur utilisateur se produit et elle affiche l'erreur.</li>
-</ul>
-<com:TTextHighlighter CssClass="source" Language="php">
-Prado::using('System.Exceptions.TErrorHandler');
-Prado::using('Application.BlogException');
-
-class BlogErrorHandler extends TErrorHandler
-{
- /**
- * Renvoi le fichier gabarit utilisé pour afficher l'erreur.
- * Cette méthode surcharge la méthode originale.
- */
- protected function getErrorTemplate($statusCode,$exception)
- {
- // on utilise notre propre gabarit pour BlogException
- if($exception instanceof BlogException)
- {
- // récupère le chemin du fichier de gabarit : protected/error.html
- $templateFile=Prado::getPathOfNamespace('Application.error','.html');
- return file_get_contents($templateFile);
- }
- else // sinon on utilise le gabarit par défaut.
- return parent::getErrorTemplate($statusCode,$exception);
- }
-
- /**
- * Gère les erreurs causées par les utilisateurs.
- * Cette méthode surcharge la méthode originale.
- * Elle est appelée lorsqu'une exception utilisateur est générée.
- */
- protected function handleExternalError($statusCode,$exception)
- {
- // Journaliser l'erreur (seulement pour BlogException)
- if($exception instanceof BlogException)
- Prado::log($exception->getErrorMessage(),TLogger::ERROR,'BlogApplication');
- // appelle l'implémentation de la classe parente
- parent::handleExternalError($statusCode,$exception);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dans le code précédent, nous spécifions que lorsqu'une exception de type <tt>BlogException</tt> est générée, nous utilisons le gabarit <tt>protected/error.html</tt> pour afficher l'erreur. Par ailleurs, nous devons créer la classe <tt>BlogException</tt> et remplacer toutes les occurrences de <tt>THttpException</tt> dans notre code (par exemple dans les pages <a href="?page=Day3.CreateEditUser">EditUser</a> et <a href="?page=Day4.CreateReadPost">ReadPost</a>). Nous devons aussi créer le gabarit <tt>protected/error.html</tt>. La classe <tt>BlogException</tt> hérite de <tt>THttpException</tt> et est vide. Le fichier de classe est enregistré sous <tt>protected/BlogException.php</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class BlogException extends THttpException
-{
-}
-</com:TTextHighlighter>
-
-<p>
-Ci-dessous le contenu du gabarit <tt>protected/error.html</tt>. 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 <tt>%%ErrorMessage%%</tt>, <tt>%%ServerAdmin%%</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<html>
-<head>
-<title>%%ErrorMessage%%</title>
-</head>
-<body>
-<div id="page">
-<div id="header">
-<h1>Mon Blog</h1>
-</div>
-<div id="main">
-<p style="color:red">%%ErrorMessage%%</p>
-<p>
-Une erreur est apparue lors du traitement de votre demande.
-</p>
-<p>
-Si vous pensez que c'est une erreur de notre serveur, veuillez contacter <a href="mailto:%%ServerAdmin%%">webmaster</a>.
-</p>
-</div>
-</body>
-</html>
-</com:TTextHighlighter>
-
-
-<h2>Journalisation des erreurs</h2>
-
-<p>
-Dans la méthode <tt>handleExternalError()</tt> de <tt>BlogErrorHandler</tt>, nous appelons <tt>Prado::log()</tt> pour journaliser l'erreur si elle est de type <tt>BlogException</tt>. 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 :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module id="log" class="System.Util.TLogRouter">
- <route class="TFileLogRoute" Categories="BlogApplication" />
- </module>
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-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 <tt>BlogApplication</tt>, de manière à ce que seules les erreurs de type <tt>BlogApplication</tt> soient sauvegardées. Cette possibilité permet de réduire la taille du journal et d'en améliorer la lisibilité.
-</p>
-
-<h2>Test</h2>
-<p>
-Pour voir comme notre blog se comporte suite à une demande invalide, nous naviguons à l'URL <tt>http://hostname/blog/index.php?page=posts.ReadPost&id=100</tt>. Nous devrions voir la page suivante qui est différente de celle vue précédemment.
-</p>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-<p>
-Si nous regardons dans le dossier <tt>protected/runtime</tt>, nous devrions y trouver un fichier nommé <tt>prado.log</tt>. C'est le journal d'erreur que nous venons juste de paramétrer. Le fichier pourrait contenir quelque chose comme :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="text">
-Jun 28 22:15:27 [Error] [BlogApplication] Unable to find the specified post.
-Jun 29 08:42:57 [Error] [BlogApplication] Unable to find the specified post.
-</com:TTextHighlighter>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/Performance.page b/demos/blog-tutorial/protected/pages/Day5/fr/Performance.page deleted file mode 100755 index 59eee1b0..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/Performance.page +++ /dev/null @@ -1,66 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Amélioration des performances</h1>
-
-<p>
-Avant le déploiement de notre blog, nous voudrions améliorer les performances.
-</p>
-
-<h2>Changer le mode de fonctionnement de l'application</h2>
-
-<p>
-Une application PRADO peut-être configurée pour fonctionner suivant différents modes. Par défaut, elle fonctionne en mode <tt>Debug</tt>, 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 <tt>Debug</tt> à <tt>Normal</tt> ( qui signifie "en production"), nous devons modifier le fichier de configuration de l'application comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Normal">
- ......
-</application>
-</com:TTextHighlighter>
-
-<h2>Enabling Caching</h2>
-
-<p>
-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,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module id="cache" class="System.Caching.TDbCache" />
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-Maintenant, après avoir requis n'importe quelle page de notre blog, nous devrions trouver un fichier nommé <tt>sqlite3.cache</tt>. C'est un fichier de base de données qui mémorise les éléments analysés : gabarits, configurations, etc.
-</p>
-
-<com:InfoBox>
-Le module de <tt>cache</tt> que nous venons d'activer utilise une base de données comme support d'enregistrement. PRADO propose d'autres modules de <tt>cache</tt> plus rapide, tels que <tt>TMemCache</tt>, <tt>TAPCCache</tt>. Ces modules requièrent les extensions PHP correspondantes.
-</com:InfoBox>
-
-
-<h2>Utilisation de <tt>pradolite.php</tt></h2>
-
-<p>
-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 <tt>index.php</tt> et remplaçons <tt>prado.php</tt> par <tt>pradolite.php</tt>. Ce dernier est un gros fichier incluant les fichiers PHP nécessaires et dont on a retiré les commentaires.
-</p>
-
-<h2>Autres techniques</h2>
-
-<p>
-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 <tt>cache</tt> est la principale solution à ce problème. Le module de <tt>cache</tt> activé dans notre fichier de configuration d'application peut aussi être utilisé dans ce but.
-</p>
-<p>
-Pour une page relativement stable et souvent consultée, le <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.OutputCache">cache de sortie</a> doit être envisagé. Le <tt>cache de sortie</tt> met en <tt>cache</tt> les parties sélectionnées d'une page. Ceci peut améliorer les performances des pages mises en <tt>cache</tt> de manière significative.
-</p>
-
-<p>
-Il a été prouvé que les solutions de <tt>cache</tt> 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 <tt>Zend Optimizer</tt>, 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 <tt>cache</tt> de PRADO garantissent la validité des pages fournies.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/Summary.page b/demos/blog-tutorial/protected/pages/Day5/fr/Summary.page deleted file mode 100755 index 1472c934..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/Summary.page +++ /dev/null @@ -1,41 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Résumé</h1>
-
-<p>
-Nous pouvons finalement déployer notre blog. Pour cela, nous devons juste copier le dossier <tt>blog</tt> complet vers le dossier du serveur Web. Nous pourrions avoir besoin de modifier <tt>index.php</tt> pour qu'il puisse trouver le chemin vers l'emplacement où a été installé le framework PRADO.
-</p>
-
-<p>
-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.
-</p>
-
-<p>
-En résumé, développer une application de gestion de base de données PRADO nécessite les étapes suivantes :
-</p>
-<ol>
- <li>Analyse et création de la base de données</li>
- <li>Créer le squelette de l'application avec <tt>prado-cli</tt></li>
- <li>Mise en place de la gestion d'erreur pour gérer les erreurs d'utilisations</li>
- <li>Création et mise en place du thème</li>
- <li>Création et mise en place des gabarits principaux</li>
- <li>Création de la connexion et des classes d'accès aux données</li>
- <li>Création des différentes pages</li>
- <li>Test et amélioration des performances/li>
- <li>Déploiement</li>
-</ol>
-
-<p>
-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 <tt>THttpException</tt> par <tt>BlogException</tt> 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.
-</p>
-
-<p>
-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.
-</p>
-
-
-
-
-<hr />
-<p>Traduction (laborieuse) par Eric.M, nous pouvez me contacter par message privé ou par email sur le <a href="http://www.pradosoft.com/forum/index.php">forum PRADO</a>.</p>
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/UseTheme.page b/demos/blog-tutorial/protected/pages/Day5/fr/UseTheme.page deleted file mode 100755 index 840a26b0..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/UseTheme.page +++ /dev/null @@ -1,138 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Utilisation des Thèmes et des Skins</h1>
-
-<p>
-PRADO propose un support intrinsèque des <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Themes">thèmes</a>. 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.
-</p>
-
-<h2>Création des thèmes</h2>
-
-<p>
-Nous devons auparavant créer un dossier <tt>themes</tt>. 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.
-</p>
-
-<p>
-Pour créer un thème nommé <tt>Basic</tt>, nous créons un sous-dossier <tt>theme/Basic</tt>. Dans ce dossier, nous pouvons mettre des feuilles de styles dépendantes du thème, des fichiers Javascript, des images et des fichiers skins.
-</p>
-
-<com:InfoBox>
-Le dossier <tt>themes</tt> doit être accessible de l'extérieur. Ne mettez pas de données sensibles dans ce dossier. Nous pouvons changer l'emplacement de ce dossier en configurant le module <a href="http://www.pradosoft.com/docs/classdoc/TThemeManager">TThemeManager</a> dans le fichier de configuration de l'application.
-</com:InfoBox>
-
-
-<h3>Création de la feuille de style</h2>
-
-<p>
-Dans le dossier <tt>themes/Basic</tt>, nous créons un fichier CSS nommé <tt>style.css</tt>. 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.
-</p>
-
-<p>
-Le contenu du fichier CSS est le suivant :
-</p>
-
-<com:TTextHighlighter CssClass="source">
-body {
- font-family: verdana, 'trebuchet ms', sans-serif;
- font-size: 10pt;
- background: white;
-}
-#page {
- margin: 0 auto 0 auto;
- width: 600px;
-}
-#footer {
- text-align: center;
- margin-top: 10px;
- padding: 10px;
- border-top: 1px solid silver;
-}
-.post-box {
- margin-bottom: 10px;
- padding: 5px;
-}
-.post-box h3 {
- padding: 5px;
- font-size: 13pt;
- background: lightgray;
-}
-.post-box a {
- color: black;
- text-decoration: none;
-}
-.post-box a:hover {
- color: red;
-}
-</com:TTextHighlighter>
-
-
-<h3>Création du fichier de Skin</h2>
-
-<p>
-Nous utilisons des <tt>skin</tt> pour initialiser les propriétés des contrôles PRADO. Les fichiers <tt>skin</tt> sont enregistrés avec une extension <tt>.skin</tt> dans le dossier du thème. Chaque fichier <tt>skin</tt> peut contenir plusieurs modèles pour un ou plusieurs types de contrôles.
-</p>
-
-<p>
-Pour notre test, nous allons créer un fichier <tt>skin</tt> qui changera la couleur de fond de nos liens dans le pied de page. Nous créons un fichier nommé <tt>button.skin</tt> dans le dossier du thème <tt>themes/Basic</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<com:THyperLink SkinID="MainMenu" BackColor="lightgreen" />
-</com:TTextHighlighter>
-
-<p>
-Le fichier <tt>button.skin</tt> contient une seule définition pour les contrôles de type <tt>THyperLink</tt> dont la propriété <tt>SkinID</tt> est <tt>MainMenu</tt>. La définition applique une couleur vert-clair comme couleur de fond du contrôle.
-</p>
-
-<p>
-En accord avec cette définition, nous modifions notre fichier <tt>protected/common/MainLayout.tpl</tt> pour appliquer aux liens du pied de page la valeur <tt>MainMenu</tt> à la propriété <tt>SkinID</tt>.
-</p>
-<com:TTextHighlighter CssClass="source" Language="prado">
-......
-<div id="footer">
-......
-<com:THyperLink Text="Home" SkinID="MainMenu"
- NavigateUrl="<%= $this->Service->DefaultPageUrl %>" />
-
-<com:THyperLink Text="New Post" SkinID="MainMenu"
- NavigateUrl="<%= $this->Service->constructUrl('posts.NewPost') %>"
- Visible="<%= !$this->User->IsGuest %>" />
-......
-</div>
-......
-</com:TTextHighlighter>
-
-<com:InfoBox>
-La syntaxe des fichiers <tt>skin</tt> est très proche de celle des gabarits. Chaque balise <tt><com:></tt> définit la présentation d'un type de contrôle. PRADO concatène automatiquement les fichiers <tt>skin</tt> pour un thème et applique le tout lorsque la page est affichée.
-</com:InfoBox>
-
-
-<h2>Utilisation du thème</h2>
-
-<p>
-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 <tt>Basic</tt> (le nom du thème) à la priorité <tt>Theme</tt> pour toutes les pages.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
- <services>
- <service id="page" class="TPageService" DefaultPage="posts.ListPost">
- <pages MasterClass="Application.layouts.MainLayout" Theme="Basic" />
- </service>
- </services>
-......
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Il est possible de préciser différents thèmes pour différentes pages, et ceci peut-être faits soit en modifiant le fichier de configuration de page soit par programmation (propriété <tt>Theme</tt>). En dernier recours, on peut le faire dans la méthode <tt>onPreInit()</tt> de la page, ceci parce que PRADO applique le thème au début du cycle de vie de la page.
-</com:InfoBox>
-
-
-<h2>Test</h2>
-<p>
-Pour voir la nouvelle présentation de notre site, allons à l'URL <tt>http://hostname/blog/index.php</tt>. 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.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/output.gif b/demos/blog-tutorial/protected/pages/Day5/fr/output.gif Binary files differdeleted file mode 100755 index 67bd18a3..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/output2.gif b/demos/blog-tutorial/protected/pages/Day5/fr/output2.gif Binary files differdeleted file mode 100755 index 16c81704..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/fr/output3.gif b/demos/blog-tutorial/protected/pages/Day5/fr/output3.gif Binary files differdeleted file mode 100755 index 6879bbdf..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/fr/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/id/ErrorLogging.page b/demos/blog-tutorial/protected/pages/Day5/id/ErrorLogging.page deleted file mode 100755 index 9d69f1dd..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/ErrorLogging.page +++ /dev/null @@ -1,159 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Penanganan Kesalahan dan Pencatatan</h1>
-
-<p>
-Jika kita mencoba mengakses URL <tt>http://hostname/blog/index.php?page=EditPost&id=100</tt>, 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.
-</p>
-
-<img src="<%~ output2.gif %>" class="output" />
-
-<com:InfoBox>
-Tugas penting dalam aplikasi Web adalah <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Error">penanganan kesalahan</a> yang sering dikaitkan dengan <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">pencatatan</a>. Ada dua jenis kesalahan yang bisa terjadi dalam aplikasi PRADO: yang disebabkan oleh para pengembang dan yang disebabkan oleh pengguna-akhir. Pembentuk harus dipecahkan sebelum aplikasi dijadikan tahap produksi, sementara yang terakhir biasanya di dalam lingkup desain awal dan harus ditangani dengan baik (misalnya mencatat kesalahan dan menampilkan halaman khusus yang menginstruksikan pengguna-akhir apa yang harus dilakukan selanjutnya). PRADO mengimplementasikan kerangka kerja yang fleksibel serta bertenaga untuk menangani kesalahan dan pencatatan.
-</com:InfoBox>
-
-
-<h2>Mengkustomisasi Penanganan Kesalahan</h2>
-
-<p>
-PRADO secara implisit mengambil modul <tt>TErrorHandler</tt> 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:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module class="Application.BlogErrorHandler" />
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-Kelas <tt>BlogErrorHandler</tt> seperti ditetapkan di atas adalah modul pengendali kesalahan baru as yang akan dibuat berikutnya. Ia memperluas dan mengganti modul standar <tt>TErrorHandler</tt>.
-</p>
-
-<p>
-Kita membuat sebuah file bernama <tt>protected/BlogErrorHandler.php</tt> seperti berikut. Kelas <tt>BlogErrorHandler</tt> mengganti dua metode <tt>TErrorHandler</tt>:
-</p>
-<ul>
- <li><tt>getErrorTemplate()</tt> - metode ini mengembalikan string template yang dipakai untuk menampilkan kesalahan pengguna tertentu.</li>
- <li><tt>handleExternalError()</tt> - metode ini dipanggil saat kesalahan pengguna terjadi dan menampilkan kesalahannya.</li>
-</ul>
-<com:TTextHighlighter CssClass="source" Language="php">
-Prado::using('System.Exceptions.TErrorHandler');
-Prado::using('Application.BlogException');
-
-class BlogErrorHandler extends TErrorHandler
-{
- /**
- * Mengambil template yang dipakai untuk menampilkan eksepsi eksternal.
- * Metode ini mengganti implementasi leluhurnya.
- */
- protected function getErrorTemplate($statusCode,$exception)
- {
- // gunakan template sendiri untuk BlogException
- if($exception instanceof BlogException)
- {
- // ddapatkan path file template kesalahan: protected/error.html
- $templateFile=Prado::getPathOfNamespace('Application.error','.html');
- return file_get_contents($templateFile);
- }
- else // sebaliknya gunakan template yang didefinisikan oleh PRADO
- return parent::getErrorTemplate($statusCode,$exception);
- }
-
- /**
- * Menangani kesalahan eksternal yang disebabkan oleh pengguna-akhir.
- * Metode ini mengganti implementasi leluhurnya.
- * Ini dipanggil oleh PRADO saat eksepsi eksternal dikeluarkan.
- */
- protected function handleExternalError($statusCode,$exception)
- {
- // catat kesalahan (hanya untuk BlogException)
- if($exception instanceof BlogException)
- Prado::log($exception->getErrorMessage(),TLogger::ERROR,'BlogApplication');
- // panggil implementasi leluhur untuk menampilkan kesalahan
- parent::handleExternalError($statusCode,$exception);
- }
-}
-</com:TTextHighlighter>
-
-<p>
-Dalam kode di atas, kita menetapkan bahwa saat <tt>BlogException</tt> dikeluarkan, kita menggunakan template baru <tt>protected/error.html</tt> untuk menampilkan kesalahan. Oleh karena itu, kita perlu membuat kelas <tt>BlogException</tt> dan mengganti semua <tt>THttpException</tt> yang ada dalam kode kita (seperti misalnya <a href="?page=Day3.CreateEditUser">EditUser</a> dan halaman <a href="?page=Day4.CreateReadPost">ReadPost</a>). Kita juga perlu membuat template kesalahan <tt>protected/error.html</tt>. Kelas <tt>BlogException</tt> memperluas <tt>THttpException</tt> dan kosong. File kelas disimpan sebagai <tt>protected/BlogException.php</tt>.
-
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class BlogException extends THttpException
-{
-}
-</com:TTextHighlighter>
-
-<p>
-Di bawah ini konten dalam template kesalahan kita <tt>protected/error.html</tt>. Catatan, template bukan template PRADO karena ia hanya mengenal jumlah token yang sangat terbatas, seperti <tt>%%ErrorMessage%%</tt>, <tt>%%ServerAdmin%%</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<html>
-<head>
-<title>%%ErrorMessage%%</title>
-</head>
-<body>
-<div id="page">
-<div id="header">
-<h1>My PRADO Blog</h1>
-</div>
-<div id="main">
-<p style="color:red">%%ErrorMessage%%</p>
-<p>
-The above error happened when the server was processing your request.
-</p>
-<p>
-If you think this is a server error, please contact the <a href="mailto:%%ServerAdmin%%">webmaster</a>.
-</p>
-</div>
-</body>
-</html>
-</com:TTextHighlighter>
-
-
-<h2>Mencatat Kesalahan</h2>
-
-<p>
-Dalam metode <tt>handleExternalError()</tt> pada <tt>BlogErrorHandler</tt>, kita memanggil <tt>Prado::log()</tt> untuk mencatat kesalahan jika tipenya adalah <tt>BlogException</tt>. 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:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module id="log" class="System.Util.TLogRouter">
- <route class="TFileLogRoute" Categories="BlogApplication" />
- </module>
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-Dalam konfigurasi di atas, kita menambahkan rute log yang menyimpan catatan ke dalam sebuah file. Kita juga menetapkan filter kategori sebagai <tt>BlogApplication</tt> agar hanya mencatat pesan pada kategori yang dipilih yang disimpan. Ini membantu mengurangi ukuran file catatan dan juga meningkatkan pembacaannya.
-</p>
-
-<h2>Pengujian</h2>
-<p>
-Untuk melihat bagaimana sistem blog kita merespon permintaan tidak benar dari pengguna, kita menguji URL <tt>http://hostname/blog/index.php?page=posts.ReadPost&id=100</tt>. Kita akan melihat halaman kesalahan berikut yang berbeda dari apa yang telah kita lihat sebelumnya.
-</p>
-
-<img src="<%~ output3.gif %>" class="output" />
-
-<p>
-Jika kita mencari di bawah direktori <tt>protected/runtime</tt>, kita akan menemukan file bernama <tt>prado.log</tt>. Ini adalah file log yang baru dikonfigurasi untuk menyimpan pesan kesalahan. File dapat berisi konten seperti berikut,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-Jun 28 22:15:27 [Error] [BlogApplication] Unable to find the specified post.
-Jun 29 08:42:57 [Error] [BlogApplication] Unable to find the specified post.
-</com:TTextHighlighter>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/id/Performance.page b/demos/blog-tutorial/protected/pages/Day5/id/Performance.page deleted file mode 100755 index 62a195b3..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/Performance.page +++ /dev/null @@ -1,67 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Penyesuaian Performansi</h1>
-
-<p>
-Sebelum kita menyebarkan sistem blog, kita ingin menyesuaikan performansi sistem.
-</p>
-
-<h2>Mengubah Mode Aplikasi</h2>
-
-<p>
-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 <tt>Debug</tt> ke <tt>Normal</tt> (berarti mode produksi), kita memodifikasi konfigurasi aplikasi seperti berikut:
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<?xml version="1.0" encoding="utf-8"?>
-<application id="blog" mode="Normal">
- ......
-</application>
-</com:TTextHighlighter>
-
-<h2>Menghidupkan Cache</h2>
-
-<p>
-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,
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
-<modules>
- ......
- <module id="cache" class="System.Caching.TDbCache" />
- ......
-</modules>
-......
-</com:TTextHighlighter>
-
-<p>
-Sekarang setelah mengakses setiap halaman dalam sistem blog kita, kita akan dapat menemukan file bernama <tt>sqlite3.cache</tt>. Ini adalah file database yang memelihara template halaman yang diuraikan, konfigurasi, dll.
-</p>
-
-<com:InfoBox>
-Modul cache yang baru kita hidupkan menggunakan database sebagai medium cache persisten. PRADO juga mempunyai modul cache lain yang menggunakan medium cache lebih cepat, seperti misalnya <tt>TMemCache</tt>, <tt>TAPCCache</tt>. Diperlukan instalasi dari ekstensi PHP terkait.
-</com:InfoBox>
-
-
-<h2>Menggunakan <tt>pradolite.php</tt></h2>
-
-<p>
-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 <tt>index.php</tt> dan mengganti inklusi <tt>prado.php</tt> dengan <tt>pradolite.php</tt>. Yang kedua adalah file besar yang dibuat dengan menggabung file kode tertentu dan membuang komentar. Selanjutnya kita bisa mengubah <tt>index.php</tt> seperti berikut,
-</p>
-
-<h2>Teknik Lain</h2>
-
-<p>
-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.
-</p>
-
-<p>
-Untuk halaman yang relatif stabil dan jarang diakses, <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.OutputCache">output caching</a> 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.
-</p>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/id/Summary.page b/demos/blog-tutorial/protected/pages/Day5/id/Summary.page deleted file mode 100755 index 8925948b..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/Summary.page +++ /dev/null @@ -1,36 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Ringkasan</h1>
-
-<p>
-Akhirnya kita dapat menyebarkan sistem blog kita. Untuk melakukannya, kita hanya perlu meng-copy seluruh direktori <tt>blog</tt> directory ke direktori Web sasaran. Kita perlu untuk memodifikasi <tt>index.php</tt> agar ia dapat mencari path yang benar di mana kerangka kerja PRADO diinstalasi.
-</p>
-
-<p>
-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.
-</p>
-
-<p>
-Secara ringkas, mengembangkan aplikasi PRADO dengan kendali-DB melibatkan langkah-langkah berikut:
-</p>
-<ol>
- <li>Mendesain dan membuat database</li>
- <li>Membuat tata letak aplikasi awal menggunakan <tt>prado-cli</tt></li>
- <li>Menyiapkan proses pengendalian kesalahan untuk menghadapi kesalahan pengguna-akhir</li>
- <li>Membuat dan menyiapkan tema</li>
- <li>Mendesain dan membuat kelas master untuk berbagi tata letak umum halaman</li>
- <li>Membuat kelas database dan menyiapkan koneksi database</li>
- <li>Mendesain dan membuat bermacam-macam halaman</li>
- <li>Menguji dan menyesuaikan performansi</li>
- <li>Menyebarkan aplikasi</li>
-</ol>
-
-<p>
-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 <tt>THttpException</tt> dengan <tt>BlogException</tt> dalam tutorial kita. Jika kita mendefinisikan kelas stylesheet lebih awal, kita dapat dengan mudah menggunakannya saat membuat template halaman.
-</p>
-
-<p>
-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.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/id/UseTheme.page b/demos/blog-tutorial/protected/pages/Day5/id/UseTheme.page deleted file mode 100755 index 6766d659..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/UseTheme.page +++ /dev/null @@ -1,138 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Menggunakan Tema dan Skin</h1>
-
-<p>
-PRADO memiliki dukungan dasar untuk <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Themes">tema</a>. 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.
-</p>
-
-<h2>Membuat Tema</h2>
-
-<p>
-Pertama kita buat direktori baru bernama <tt>themes</tt>. Ini adalah direktori leluhur bagi semua tema terkait aplikasi PRADO tertentu. Setiap subdirektori di bawah direktori ini yang nama temanya adalah nama subdirektori.
-</p>
-
-<p>
-Untuk membuat tema bernama <tt>Basic</tt>, kita membuat subdirektori <tt>theme/Basic</tt>. Di bawah direktori ini, kita dapat menempatkan file stylesheet dependen-tema, file Javascript, gambar, dan file skin.
-</p>
-
-<com:InfoBox>
-Direktori <tt>themes</tt> harus bisa diakses dari Web, seperti halnya direktori <tt>assets</tt>. Jangan menempatkan file data sensitif di bawah direktori ini. Anda bisa mengubah nama atau lokasi dari direktori ini dengan mengkonfigurasi modul <a href="http://www.pradosoft.com/docs/classdoc/TThemeManager">TThemeManager</a> dalam konfigurasi aplikasi.
-</com:InfoBox>
-
-
-<h3>Membuat File Stylesheet</h2>
-
-<p>
-Di bawah direktori <tt>themes/Basic</tt>, kita membuat sebuah file CSS stylesheet bernama <tt>style.css</tt>. ketika sebuah halaman menggunakan tema ini, PRADO secara otomatis akan mengimpor stylesheet ini ke halaman. Hal yang sama terjadi untuk file Javascript.
-</p>
-
-<p>
-File CSS ditampilkan seperti berikut.
-</p>
-
-<com:TTextHighlighter CssClass="source">
-body {
- font-family: verdana, 'trebuchet ms', sans-serif;
- font-size: 10pt;
- background: white;
-}
-#page {
- margin: 0 auto 0 auto;
- width: 600px;
-}
-#footer {
- text-align: center;
- margin-top: 10px;
- padding: 10px;
- border-top: 1px solid silver;
-}
-.post-box {
- margin-bottom: 10px;
- padding: 5px;
-}
-.post-box h3 {
- padding: 5px;
- font-size: 13pt;
- background: lightgray;
-}
-.post-box a {
- color: black;
- text-decoration: none;
-}
-.post-box a:hover {
- color: red;
-}
-</com:TTextHighlighter>
-
-
-<h3>Membuat File Skin</h2>
-
-<p>
-Kita menggunakan skin untuk menginisialisasi properti kontrol PRADO. Skin disimpan sebagai file skin (nama berakhiran <tt>.skin</tt>) di bawah direktori tema. Setiap file skin bisa berisi multipel skin untuk satu atau beberapa tipe kontrol.
-</p>
-
-<p>
-Sebagai pengujian, kita akan mencoba membuat sebuah skin yang mengubah warna latar belakang link tombol dalam footer halaman. Kita membuat sebuah file bernama <tt>button.skin</tt> di bawah direktori tema <tt>themes/Basic</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="prado">
-<com:THyperLink SkinID="MainMenu" BackColor="lightgreen" />
-</com:TTextHighlighter>
-
-<p>
-File skin <tt>button.skin</tt> hanya berisi satu skin untuk kontrol <tt>THyperLink</tt> yang properti <tt>SkinID</tt>-nya adalah <tt>MainMenu</tt>. Skin menyetel warna latar belakang kontrol ke hijau-terang.
-</p>
-
-<p>
-Sejalan dengan itu, kita perlu memodifikasi <tt>protected/common/MainLayout.tpl</tt> agar link tombol dalam footer menggunakan <tt>MainMenu</tt> sebagai <tt>SkinID</tt>-nya.
-</p>
-<com:TTextHighlighter CssClass="source" Language="prado">
-......
-<div id="footer">
-......
-<com:THyperLink Text="Home" SkinID="MainMenu"
- NavigateUrl="<%= $this->Service->DefaultPageUrl %>" />
-
-<com:THyperLink Text="New Post" SkinID="MainMenu"
- NavigateUrl="<%= $this->Service->constructUrl('posts.NewPost') %>"
- Visible="<%= !$this->User->IsGuest %>" />
-......
-</div>
-......
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Sintaks untuk file skin sangat mirip dengan template PRADO. Setiap tag <tt><com:></tt> mendefinisikan sebuah skin untuk tipe kontrol tertentu. PRADO secara otomatis mengumpulkan seluruh file skin dalam sebuah tema dan menerapkannya ketika halaman bertema sedang disajikan.
-</com:InfoBox>
-
-
-<h2>Menggunakan Tema</h2>
-
-<p>
-Untuk menggunakan tema yang baru kita buat, kita memodifikasi konfigurasi aplikasi seperti berikut. Seperti kita lihat, properti <tt>Theme</tt> untuk semua halaman disetel sebagai <tt>Basic</tt>, nama tema yang baru saja kita buat.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-......
- <services>
- <service id="page" class="TPageService" DefaultPage="posts.ListPost">
- <pages MasterClass="Application.layouts.MainLayout" Theme="Basic" />
- </service>
- </services>
-......
-</com:TTextHighlighter>
-
-<com:InfoBox>
-Dimungkinkan untuk menetapkan tema berbeda untuk halaman yang berbeda, dan ini dapat dikerjakan baik dalam konfigurasi aplikasi/halaman ataupun secara programatis (perhatikan <tt>Theme</tt> adalah properti halaman). Untuk yan gterakhir, ia harus dikerjakan dalam metode <tt>onPreInit()</tt> pada halaman karena PRADO menerapkan tema ke halaman sebelumnya dalam masa hidup halaman.
-</com:InfoBox>
-
-
-<h2>Pengujian</h2>
-<p>
-Untuk melihat bagaimana halaman blog terlihat, kunjungi URL <tt>http://hostname/blog/index.php</tt>. Kita akan melihat font, tata letak, bingkai beruah dalam halaman. Juga, link tombol dalam footer mempunyai latar belakang hijau terang.
-</p>
-
-<img src="<%~ output.gif %>" class="output" />
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day5/id/output.gif b/demos/blog-tutorial/protected/pages/Day5/id/output.gif Binary files differdeleted file mode 100755 index 67bd18a3..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/output.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/id/output2.gif b/demos/blog-tutorial/protected/pages/Day5/id/output2.gif Binary files differdeleted file mode 100755 index 16c81704..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/output2.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Day5/id/output3.gif b/demos/blog-tutorial/protected/pages/Day5/id/output3.gif Binary files differdeleted file mode 100755 index 6879bbdf..00000000 --- a/demos/blog-tutorial/protected/pages/Day5/id/output3.gif +++ /dev/null diff --git a/demos/blog-tutorial/protected/pages/Overview.page b/demos/blog-tutorial/protected/pages/Overview.page index bc895a33..a4eb950c 100755 --- a/demos/blog-tutorial/protected/pages/Overview.page +++ b/demos/blog-tutorial/protected/pages/Overview.page @@ -3,7 +3,7 @@ <h1>Welcome to the PRADO Blog Tutorial</h1>
<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/">Quickstart Tutorial</a>.
+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 <a href="http://www.pradoframework.net/site/demos/quickstart/">Quickstart Tutorial</a>.
</p>
<p>
@@ -11,7 +11,7 @@ This tutorial is organized in a day-by-day fashion. Each day new PRADO concepts </p>
<p>
-In order to follow the tutorial to create and run the <a href="samples/">day-by-day examples</a>, readers should have access to a Web server installed with <b>PHP 5.1.0+</b> and <b>PRADO 3.1+</b>. Instructions for installing PRADO can be found at <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.Installation">pradosoft.com</a>.
+In order to follow the tutorial to create and run the <a href="samples/">day-by-day examples</a>, readers should have access to a Web server installed with <b>PHP 5.1.0+</b> and <b>PRADO 3.1+</b>. Instructions for installing PRADO can be found at <a href="http://www.pradoframework.net/site/demos/quickstart/?page=GettingStarted.Installation">project website</a>.
</p>
</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/fr/Overview.page b/demos/blog-tutorial/protected/pages/fr/Overview.page deleted file mode 100755 index 72fc7371..00000000 --- a/demos/blog-tutorial/protected/pages/fr/Overview.page +++ /dev/null @@ -1,17 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Bienvenue dans ce tutoriel de développement d'un Blog</h1>
-
-<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/">Quickstart Tutorial</a>.
-</p>
-
-<p>
-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 <a href="?page=Requirements">buts à atteindre</a>.
-</p>
-
-<p>
-Pour pouvoir suivre ce tutoriel et créer les <a href="samples/">exemples pas à pas</a>, les lecteurs doivent avoir accès à un serveur Web qui implémente <b>PHP 5.1.0+</b> et <b>PRADO 3.1+</b>. Les instructions pour installer PRADO peuvent être trouvées ici : <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.Installation">pradosoft.com</a>.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/fr/Requirements.page b/demos/blog-tutorial/protected/pages/fr/Requirements.page deleted file mode 100755 index 976a621f..00000000 --- a/demos/blog-tutorial/protected/pages/fr/Requirements.page +++ /dev/null @@ -1,37 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Buts à atteindre</h1>
-<p>
-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.
-</p>
-
-<p>
-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.
-</p>
-
-<h2>Gestion des utilisateurs</h2>
-<ul>
-<li>L'outil doit permettre de gérer les utilisateurs et leurs droits.</li>
-<li>L'outil doit permettre à l'administrateur de lister tous les utilisateurs.</li>
-<li>L'outil doit permettre à l'administrateur de créer des nouveaux utilisateurs.</li>
-<li>L'outil doit permettre à l'administrateur ou au propriétaire du compte de modifier son profil.</li>
-<li>L'outil doit permettre à l'administrateur de supprimer un utilisateur.</li>
-</ul>
-
-<h2>Gestion des messages</h2>
-<ul>
-<li>L'outil doit permettre de lister les messages par ordre de date décroissante et d'en gérer la pagination.</li>
-<li>L'outil doit permettre de consulter le détail d'un message.</li>
-<li>L'outil doit permettre la création d'un nouveau message par un utilisateur authentifié.</li>
-<li>L'outil doit permettre la mise à jour d'un message par son auteur ou par l'administrateur.</li>
-<li>L'outil doit permettre la suppression d'un message par son auteur ou par l'administrateur.</li>
-</ul>
-
-<h2>Maintenance de l'outil</h2>
-<ul>
-<li>L'outil doit permettre de collecter les retours utilisateurs.</li>
-<li>L'outil doit être assez flexible pour permettre l'intégration ultérieure de nouveaux composants.</li>
-<li>L'outil doit permettre de changer le thème qui régit la présentation des composants.</li>
-</ul>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/id/Overview.page b/demos/blog-tutorial/protected/pages/id/Overview.page deleted file mode 100755 index 30c2e772..00000000 --- a/demos/blog-tutorial/protected/pages/id/Overview.page +++ /dev/null @@ -1,17 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Selamat datang di Tutorial Blog PRADO</h1>
-
-<p>
-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 <a href="http://www.pradosoft.com/demos/quickstart/">Tutorial Cepat</a>.
-</p>
-
-<p>
-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 <a href="?page=Requirements">persyaratan awal</a>.
-</p>
-
-<p>
-Untuk mengikuti tutorial dalam membuat dan menjalankan <a href="samples/">contoh hari-demi-hari</a>, para pembaca harus mempunyai akses ke server Web yang diinstalasi dengan <b>PHP 5.1.0+</b> dan <b>PRADO 3.1+</b>. Instruksi untuk menginstalasi PRADO dapat ditemukan di <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.Installation">pradosoft.com</a>.
-</p>
-
-</com:TContent>
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/id/Requirements.page b/demos/blog-tutorial/protected/pages/id/Requirements.page deleted file mode 100755 index 4bee1d62..00000000 --- a/demos/blog-tutorial/protected/pages/id/Requirements.page +++ /dev/null @@ -1,38 +0,0 @@ -<com:TContent ID="Main">
-
-<h1>Analisis Persyaratan</h1>
-
-<p>
-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.
-</p>
-
-<p>
-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.
-</p>
-
-<h2>Manajemen Pengguna</h2>
-<ul>
-<li>Sistem harus membolehkan otentikasi dan otorisasi para pengguna.</li>
-<li>Sistem harus membolehkan administrator untul menampilkan seluruh akun pengguna.</li>
-<li>Sistem harus membolehkan administrator untuk membuat akun pengguna baru.</li>
-<li>Sistem harus membolehkan administrator atau pemegang akun untuk memutakhirkan akunnya yang sudah ada.</li>
-<li>Sistem harus membolehkan administrator untuk menghapus akun pengguna.</li>
-</ul>
-
-<h2>Manajemen Tulisan</h2>
-<ul>
-<li>Sistem harus membolehkan menampilkan tulisan dengan kriteria waktu pembuatannya dalam urutan mengecil dengan lembar halaman.</li>
-<li>Sistem harus membolehkan melihat rincian dari tulisan yang dipilih.</li>
-<li>Sistem harus membolehkan pembuatan tulisan baru oleh pengguna terotentikasi.</li>
-<li>Sistem harus membolehkan memutakhirkan tulisan yang sudah ada oleh pembuatnya atau administrator.</li>
-<li>Sistem harus membolehkan penghapusan tulisan yang sudah ada oleh pembbuatnya atau administrator.</li>
-</ul>
-
-<h2>Pemeliharan Sistem</h2>
-<ul>
-<li>Sistem harus bisa mengumpulkan masukan pengguna.</li>
-<li>Sistem harus cukup fleksibel untuk bisa menambahkan portlet baru di masa mendatang.</li>
-<li>Sistem harus membolehkan mengganti tema yang mendefinisikan gaya dari elemen UI umum.</li>
-</ul>
-
-</com:TContent>
\ No newline at end of file |