diff options
author | Jean-Luc Gyger <jean-luc.gyger@vysual.ch> | 2016-02-11 10:01:12 +0100 |
---|---|---|
committer | Jean-Luc Gyger <jean-luc.gyger@vysual.ch> | 2016-02-11 10:01:12 +0100 |
commit | d70861a8f9368773f2f0291454e9420174e6c14a (patch) | |
tree | e44a32e401211422fb05da355c9eef4d5934d9e9 /demos/quickstart/protected/pages/Advanced | |
parent | d32f65815eb6feb4bcb8a0c85572f722d7826342 (diff) | |
parent | 275f16b90a92c62935cb691d11e0bd124acf64e4 (diff) |
Merge branch 'master' of https://github.com/majuca/prado
Diffstat (limited to 'demos/quickstart/protected/pages/Advanced')
45 files changed, 19 insertions, 4526 deletions
diff --git a/demos/quickstart/protected/pages/Advanced/Samples/I18N/id/Home.page b/demos/quickstart/protected/pages/Advanced/Samples/I18N/id/Home.page deleted file mode 100755 index a490abce..00000000 --- a/demos/quickstart/protected/pages/Advanced/Samples/I18N/id/Home.page +++ /dev/null @@ -1,161 +0,0 @@ -<%@ Title="Internasionlisasi dalam PRADO"
- Page.Application.Globalization.TranslationCatalogue="index" %>
-<com:TContent ID="body">
-
-<h1>Internasionlisasi dalam PRADO</h1>
-<p>Demo ini memperlihatkan komponen dasar yang tersedia dalam PRADO untuk memproses Internasionalisasi dan Lokalisasi aplikasi web. Halam ini memanfaatkan template siap multipel lokal (atau kultur) untuk memperlihatkan halaman terlokalisasi yang tersedia. Untuk melihat versi dilokalisasi yang berbeda, silahkan ganti setelan bahasa dalam browser Anda.</p>
-
-<p>
-Saat ini kultur Anda adalah <%= $this->Page->CurrentCulture %>.
-<div class="links">
- Versi lokalisasi tersedia:
- <com:LanguageList />
-</div>
-</p>
-
-<p>
- Sebagai tambahan ke template siap kultur. Teks dapat dilokalisasi menggunakan banyak sumber terjemanan yang berbeda. PRADO menyediakan wadah gettext, XML, SQLite, dan MySQL untuk menyimpan terjemahan pesan. Contoh dalam link berikut mendemonstrasikan bagaimana teks dapat dilokalisasi menggunakan komponen TTranslate.
-</p>
-<hr />
-<h2>Pengenalan</h2>
-<p> Mengembangkan dan memelihara situs multi-bahasa adalah masalah umum bagi para pengembang web. </p>
-<dl>
-<dt><strong>Internasionalisasi (I18N)</strong></dt>
-<dd>Proses pengembangan sebuah produk dalam cara yang bekerja dengan data dalam bahasa berbeda dan dapat diadaptasi ke berbagai target pasar tanpa melakukan perubahan. </dd>
-<dt><strong>Lokalisasi (L10N)</strong></dt>
-<dd>Proses selanjutnya dari menterjemahkan dan mengadaptasi sebuah produk untuk pasar konvensi kultural yang tersedia.</dd>
-</dl>
-<p>Fitur berikut didukung oleh PRADO: </p>
-<ul id="u1" class="block-content">
- <li>Terjemahan teks</li>
- <li>Terjemahan atribut</li>
- <li>Substitusi parameter (dengan terjemahan bila diperlukan) </li>
- <li>Format tanggal, angka dan kurs </li>
-</ul>
-<h2>Contoh</h2>
-<h3>Tanggal: pola lengkap, kultur en_GB</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time1" Pattern="full" Culture="en_GB"/>
-</com:TTextHighlighter>
-<h4>Hasil:</h4>
-<com:TDateFormat ID="Time1" Pattern="full" Culture="en_GB"/> <br />
-<hr />
-
-<h3>Tanggal: pola pendek</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time2" Pattern="short" />
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TDateFormat ID="Time2" Pattern="short" /> <br />
-<hr />
-
-<h3>Pola standar tanggal dari <%= $this->Page->CurrentCulture %> </h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time3" Value="2004/12/06" />
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TDateFormat ID="Time3" Value="2004/12/06" /> <br />
-<hr />
-
-<h3>Format standar kurs</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat Type="currency" Value="12.4" />
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TNumberFormat Type="currency" Value="12.4" /> <br />
-<hr />
-<h3>Currency, de_DE culture with Euro</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat ID="Number2" Type="currency" Culture="de_DE" Currency="EUR"/>
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TNumberFormat ID="Number2" Type="currency" Culture="de_DE" Currency="EUR"/> <br />
-
-<hr />
-
-<h3>Kurs, format US dengan Euro</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" />
-</com:TTextHighlighter>
-
-<h4>Hasil</h4>
-<com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" /> <br />
-<hr />
-
-<h3>Contoh terjemahan</h3>
-<h4>ContohExample:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate>Hello</com:TTranslate>
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TTranslate>Hello</com:TTranslate> <br />
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate Text="Goodbye" />
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TTranslate Text="Goodbye" /> <br />
-
-<hr />
-<h3>Menggunakan tag lokalisasi</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<%[ Goodbye ]%>
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<%[ Goodbye ]%>
-<br />
-
-
-<hr />
-<h3>Menterjemahkan menggunakan katalog berbeda </h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate Text="Goodbye" Catalogue="tests" />
-</com:TTextHighlighter>
-
-<h4>Hasil:</h4>
-<com:TTranslate Text="Goodbye" Catalogue="tests" />
-<br />
-
-
-<hr />
-<h3>Translasi dengan substitusi parameter</h3>
-<h4>Contoh:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate>
- {greeting} {name}!, The unix-time is "{time}".
- <com:TTranslateParameter Key="name">
- <com:TTranslate Catalogue="tests" Text="World" />
- </com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting" Value="Hello" />
- <com:TTranslateParameter Key="time" Value="<%= Time() %>" />
-</com:TTranslate>
-</com:TTextHighlighter>
-
-
-<h4>Hasil:</h4>
-
-<com:TTranslate>
- {greeting} {name}!, The unix-time is "{time}".
- <com:TTranslateParameter Key="name">
- <com:TTranslate Catalogue="tests" Text="World" />
- </com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting" Value="Hello" />
- <com:TTranslateParameter Key="time" Value="<%= Time() %>" />
-</com:TTranslate>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/Samples/I18N/zh_TW/Home.page b/demos/quickstart/protected/pages/Advanced/Samples/I18N/zh_TW/Home.page deleted file mode 100755 index 7629e7bb..00000000 --- a/demos/quickstart/protected/pages/Advanced/Samples/I18N/zh_TW/Home.page +++ /dev/null @@ -1,155 +0,0 @@ -<%@ Title="PRADO 國際化"
- Page.Application.Globalization.TranslationCatalogue="index" %>
-<com:TContent ID="body">
-<h1>PRADO 國際化</h1>
- <p>本演示將介紹如何用PRADO中的一些部件對您的Web應用進行國際化和本地化。
- 本网頁的顯示是根据您的當地設置從多個不同語言的模板中選擇進行的。
- 如果你想查看其它語言版本,請更改瀏覽器的語言設置。</p>
-
- <p>
- 您目前的語言設置是
- <%= $this->Page->CurrentCulture %>.
- <div class="links">
- 可查看的語言版本包括:
- <com:LanguageList />
- </div>
- </p>
-
- <p>
- 除了能自動偵知語言設置的模板外,文本也可以使用不同的翻譯源進行本地化。
- PRADO提供了gettext,XML,SQLite以及MySQL等手段用于存放消息的各种翻譯。
- 下面連接所指向的例子展示了如何使用TTranslate部件對文本進行本地化。
- <hr />
- <h2>簡介</h2>
- <p>開發和維護多語言的站點對Web開發者而言是一個很常見的問題。</p>
- <dl>
- <dt><strong>國際化(I18N)</strong></dt>
- <dd>產品開發的一個步驟,它使得產品能接受不同語言的數据,并且在沒有更改設計
- 的情況下使產品能用于不同的市場。</dd>
- <dt><strong>L本地化(L10N)</strong></dt>
- <dd>國際化的一個細節步驟,它針對某個特定的市場文化對產品進行翻譯和調整。</dd>
- </dl>
- <p>PRADO支持以下功能:</p>
- <ul id="u1" class="block-content">
- <li>文本翻譯</li>
- <li>屬性翻譯(尚未完成)</li>
- <li>參數替換(如需要可進行翻譯)</li>
- <li>日期,數字和貨幣的格式化</li>
- </ul>
- <h2>例子</h2>
- <h3>日期:完整格式,en_GB語言設置</h3>
- <h4>例: </h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time1" Pattern="full" Culture="en_GB"/>
-</com:TTextHighlighter>
- <h4>結果: </h4>
- <com:TDateFormat ID="Time1" Pattern="full" Culture="en_GB"/> <br />
- <hr />
-
- <h3>日期:短格式</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time2" Pattern="short" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
- <com:TDateFormat ID="Time2" Pattern="short" /> <br />
- <hr />
-
- <h3>日期:<%= $this->Page->CurrentCulture %>的缺省模式</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TDateFormat ID="Time3" Value="2004/12/06" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
-<com:TDateFormat ID="Time3" Value="2004/12/06" /> <br />
- <hr />
-
- <h3>貨幣,缺省格式</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat Type="currency" Value="12.4" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
-<com:TNumberFormat Type="currency" Value="12.4" /> <br />
- <hr />
- <h3>貨幣,de_DE語言以及歐幣</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat ID="Number2" Type="currency" Culture="de_DE" Currency="EUR"/>
-</com:TTextHighlighter>
- <h4>結果:</h4>
- <com:TNumberFormat ID="Number2" Type="currency" Culture="de_DE" Currency="EUR"/> <br />
-
- <hr />
-
- <h3>貨幣, 美國格式以及歐幣</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
- <com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" /> <br />
- <hr />
-
- <h3>翻譯實例</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate>Hello</com:TTranslate>
-</com:TTextHighlighter>
- <h4>結果:</h4>
- <com:TTranslate>Hello</com:TTranslate> <br />
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate Text="Goodbye" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
- <com:TTranslate Text="Goodbye" /> <br />
-
-<hr />
-<h3>Using localization tag</h3>
-<h4>Example:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<%[ Goodbye ]%>
-</com:TTextHighlighter>
-
-<h4>Result:</h4>
-<%[ Goodbye ]%>
-<br />
-
- <hr />
- <h3>用不同目錄進行翻譯</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate Text="Goodbye" Catalogue="tests" />
-</com:TTextHighlighter>
- <h4>結果:</h4>
-<com:TTranslate Text="Goodbye" Catalogue="tests" />
- <br />
-
-
- <hr />
- <h3>用參數替換進行翻譯</h3>
- <h4>例:</h4>
-<com:TTextHighlighter Language="prado" CssClass="source">
-<com:TTranslate>
- {greeting} {name}!, The unix-time is "{time}".
- <com:TTranslateParameter Key="name">
- <com:TTranslate Catalogue="tests" Text="World" />
- </com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting" Value="Hello" />
- <com:TTranslateParameter Key="time" Value="<%= Time() %>" />
-</com:TTranslate>
-</com:TTextHighlighter>
-
- <h4>結果:</h4>
-
-<com:TTranslate>
- {greeting} {name}!, The unix-time is "{time}".
- <com:TTranslateParameter Key="name">
- <com:TTranslate Catalogue="tests" Text="World" />
- </com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting" Value="Hello" />
- <com:TTranslateParameter Key="time" Value="<%= Time() %>" />
-</com:TTranslate>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/Scripts1.page b/demos/quickstart/protected/pages/Advanced/Scripts1.page deleted file mode 100755 index 96ab7760..00000000 --- a/demos/quickstart/protected/pages/Advanced/Scripts1.page +++ /dev/null @@ -1,96 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6601">Developer Notes for prototype.js</h1>
-This guide is based on the <a href="http://www.sergiopereira.com/articles/prototype.js.html">
-Developer Notes for prototype.js</a> by Sergio Pereira.
-
-<h2 id="6603">What is that?</h2>
-<p id="830726" class="block-content">
-In case you haven't already used it, <a href="http://prototype.conio.net">prototype.js</a> is a
- JavaScript library written by <a href="http://www.conio.net">Sam Stephenson</a>.
- This amazingly well thought and well written piece of <b>standards-compliant</b> code takes a lot of
- the burden associated with creating rich, highly interactive web pages that characterize the Web 2.0 off your back.
-</p>
-
-<p id="830727" class="block-content">
- If you tried to use this library recently, you probably noticed that documentation is not one
- of its strongest points. As many other developers before me, I got my head around prototype.js by
- reading the source code and experimenting with it. I thought it would be nice to take notes while
- I learned and share with everybody else.
-</p>
-<p id="830728" class="block-content">
- As you read the examples and the reference, developers familiar with the Ruby
- programming language will notice an intentional similarity between Ruby's
- built-in classes and many of the extensions implemented by this library.
-</p>
-
-
-<h2 id="6604">Using the <tt>$()</tt> function</h2>
-<p id="830729" class="block-content">
- The <tt>$()</tt> function is a handy shortcut to the all-too-frequent <tt>document.getElementById()</tt> function
- of the DOM. Like the DOM function, this one returns the element that has the id passed as an argument.
-</p>
-
-<p id="830730" class="block-content">
- Unlike the DOM function, though, this one goes further. You can pass more than one id and
- <tt>$()</tt> will return an <tt>Array</tt> object with
- all the requested elements. The example below should illustrate this.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830252">
-<com:TClientScript UsingClientScripts="prado" />
-<div id="myDiv">
- <p id="830731" class="block-content">This is a paragraph</p>
-</div>
-
-<div id="myOtherDiv">
- <p id="830732" class="block-content">This is another paragraph</p>
-</div>
-
-<input type="button" value=Test1 onclick="test1();" />
-<input type="button" value=Test2 onclick="test2();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test1()
-{
- var d = $('myDiv');
- alert(d.innerHTML);
-}
-
-function test2()
-{
- var divs = $('myDiv','myOtherDiv');
- for(i=0; i<divs.length; i++)
- {
- alert(divs[i].innerHTML);
- }
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-<p id="830733" class="block-content">
- Another nice thing about this function is that you can pass either the <tt>id</tt> string or the element object itself,
- which makes this function very useful when creating other functions that can also take either form of argument.
-</p>
-
-<h2 id="6605">Using the <tt>$F()</tt> function</h2>
-
-<p id="830734" class="block-content">
- The <tt>$F()</tt> function is a another welcome shortcut. It returns the value of any field input control,
- like text boxes or drop-down lists. The function can take as argument either the element <tt>id</tt> or the element object itself.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830253">
-<input type="text" id="userName" value="Joe Doe" />
-<input type="button" value=Test3 onclick="test3();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test3()
-{
- alert($F('userName'));
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/Scripts2.page b/demos/quickstart/protected/pages/Advanced/Scripts2.page deleted file mode 100755 index 5d88b065..00000000 --- a/demos/quickstart/protected/pages/Advanced/Scripts2.page +++ /dev/null @@ -1,253 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6701">DOM Events and Javascript</h1>
-
-<h2 id="6702">Basic event handling</h2>
-
-<p id="840735" class="block-content">The syntax for working with events looks like the code below.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840254">
-Event.observe(element, name, observer, [useCapture]);
-</com:TTextHighlighter>
-
-<p id="840736" class="block-content">Assuming for a moment that we want to observe when a link was clicked,
-we could do the following:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840255">
-// <a id="clicker" href="http://foo.com">Click me</a>
-Event.observe('clicker', 'click', function(event)
-{
- alert('clicked!');
-});
-</com:TTextHighlighter>
-
-<p id="840737" class="block-content">If we wanted to get the element that fired the event, we'd do this:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840256">
-Event.observe('clicker', 'click', function(event)
-{
- alert(Event.element(event));
-});
-</com:TTextHighlighter>
-
-<h2 id="6703">Observing keystrokes</h2>
-
-<p id="840738" class="block-content">If we wanted to observe keystrokes for the entire document, we could do the following:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840257">
-Event.observe(document, 'keypress', function(event)
-{
- if(Event.keyCode(event) == Event.KEY_TAB)
- alert('Tab Pressed');
-});
-</com:TTextHighlighter>
-
-<p id="840739" class="block-content">And lets say we wanted to keep track of what has been typed :</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840258">
-Event.observe('search', 'keypress', function(event)
-{
- Element.update('search-results', $F(Event.element(event)));
-});
-</com:TTextHighlighter>
-
-<p id="840740" class="block-content">Prototype defines properties inside the event object for some
-of the more common keys, so feel free to dig around in Prototype to
-see which ones those are.</p>
-
-<p id="840741" class="block-content">A final note on keypress events; If you'd like to detect a
-left click you can use <tt>Event.isLeftClick(event)</tt>.</p>
-
-<h2 id="6704">Getting the coordinates of the mouse pointer</h2>
-
-<p id="840742" class="block-content">Drag and drop, dynamic element resizing, games, and
-much more all require the ability to track the X and Y location of
-the mouse. Prototype makes this fairly simple. The code below tracks
-the X and Y position of the mouse and spits out those values into
-an input box named mouse.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840259">
-Event.observe(document, 'mousemove', function(event)
-{
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
-});
-</com:TTextHighlighter>
-
-<p id="840743" class="block-content">If we wanted to observe the mouse location when it was
-hovering over a certain element, we'd just change the document argument to
-the id or element that was relevant.</p>
-
-<h2 id="6705">Stopping Propagation</h2>
-
-<p id="840744" class="block-content"><tt>Event.stop(event)</tt> will stop the propagation of an event .</p>
-
-<h2 id="6706">Events, Binding, and Objects</h2>
-
-<p id="840745" class="block-content">Everything has been fairly straight forward so far, but things
-start getting a little trickier when you need to work with events in
-and object-oriented environment. You have to deal with binding and funky
-looking syntax that might take a moment to get your head around.</p>
-
-<p id="840746" class="block-content">Lets look at some code so you can get a better understanding of what I'm talking about.</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840260">
-EventDispenser = Class.create();
-EventDispenser.prototype =
-{
- initialize: function(list)
- {
- this.list = list;
-
- // Observe clicks on our list items
- $$(this.list + " li").each(function(item)
- {
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
- }.bind(this));
-
- // Observe when a key on the keyboard is pressed.
- // In the observer, we check for
- // the tab key and alert a message if it is pressed.
- Event.observe(document, 'keypress', this.onKeyPress.bindEvent(this));
-
- // Observe our fake live search box. When a user types
- // something into the box, the observer will take that
- // value(-1) and update our search-results div with it.
- Event.observe('search', 'keypress', this.onSearch.bindEvent(this));
-
- Event.observe(document, 'mousemove', this.onMouseMove.bindEvent(this));
- },
-
- // Arbitrary functions to respond to events
- showTagName: function(event)
- {
- alert(Event.element(event).tagName);
- },
-
- onKeyPress: function(event)
- {
- var code = event.keyCode;
- if(code == Event.KEY_TAB)
- alert('Tab key was pressed');
- },
-
- onSearch: function(event)
- {
- Element.update('search-results', $F(Event.element(event)));
- },
-
- onMouseMove: function(event)
- {
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
- }
-}
-</com:TTextHighlighter>
-<p id="840747" class="block-content">Whoa! What's going on here? Well, we've defined our a
-custom class <tt>EventDispenser</tt>. We're going to be using this class
-to setup events for our document. Most of this code is a
-rewrite of the code we looked at earlier except this time, we
-are working from inside an object.</p>
-
-<p id="840748" class="block-content">Looking at the <tt>initialize</tt> method, we can really see how
-things are different now. Take a look at the code below:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840261">
-// Observe clicks on our list items
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840749" class="block-content">We've got iterators, binding and all sorts of stuff going on.
-Lets break down what this chunk of code is doing.</p>
-
-<p id="840750" class="block-content">First we are hunting for a collection of elements based on
-it's CSS selector. This uses the Prototype selector function <tt>$$()</tt>.
-After we've found the list items we are dealing with we send
-those into an each iteration where we will add our observers.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840262">
-Event.observe(item, 'click', this.showTagName.bindEvent(this));
-</com:TTextHighlighter>
-
-<p id="840751" class="block-content">Now looking at the code above, you'll notice the <tt>bindEvent</tt> function.
-This takes the method before it <tt>showTagName</tt> and treats it as the
-method that will be triggered when, in this case,
-someone clicks one of our list items.</p>
-
-<p id="840752" class="block-content">You'll also notice we pass this as an argument to the <tt>bindEvent</tt> function.
-This simply allows us to reference the object in context <tt>EventDispenser</tt>
-inside our function <tt>showTagName(event)</tt>. If the <tt>showTagName</tt> function
-requires additional parameters, you can attach them to the later parameters of <tt>bindEvent</tt>. For example</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840263">
-this.showTagName.bindEvent(this, param1, param2);
-
-//where the showTagName function is defined as
-showTime : function (event, param1, param2) { ... }
-</com:TTextHighlighter>
-
-<p id="840753" class="block-content">Moving on, you'll see <tt>bind(this)</tt> attached to our iterator function.
-This really has nothing to do with events, it is only here to allow me to
-use <tt>this</tt> inside the iterator. If we did not use <tt>bind(this)</tt>, I could not
-reference the method <tt>showTagName</tt> inside the iterator.</p>
-
-<p id="840754" class="block-content">Ok, so we'll move on to looking at our methods that actually get
-called when an event occurs. Since we've been dealing with <tt>showTagName</tt>, lets look at it.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840264">
-showTagName: function(event)
-{
- alert(Event.element(event).tagName);
-}
-</com:TTextHighlighter>
-
-<p id="840755" class="block-content">As you can see, this function accepts one argument--the event.
-In order for us to get the element which fired the event we need to
-pass that argument to <tt>Event.element</tt>. Now we can manipulate it at will.</p>
-
-<p id="840756" class="block-content">This covers the most confusing parts of our code. The text above is also
-relevant to the remaining parts of our code. If there is anything about
-this you don't understand, feel free to ask questions in the forum.</p>
-
-<h2 id="6707">Removing Event Listeners</h2>
-
-<p id="840757" class="block-content">This one threw me for a loop the first time I tried to use it.
-I tried something similar to what I did in the <tt>Event.observe</tt>
-call with the exception of using <tt>stopObserving</tt>, but nothing seemed
-to change. In other words, the code below does <b>NOT</b> work.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840265">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagName);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840758" class="block-content">What's the deal here? The reason this does not work is because there
-is no pointer to the observer. This means that when we passed <tt>this.showTagName</tt>
-in the <tt>Event.observe</tt> method before hand, we passed it as an
-anonymous function. We can't reference an anonymous function
-because it simply does not have a pointer.</p>
-
-<p id="840759" class="block-content">So how do we get the job done? All we need to do is give the
-observing function a pointer, or the jargon free version: Set a variable
-that points to <tt>this.showTagName</tt>. Ok, lets change our code a bit.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840266">
-this.showTagObserver = this.showTagName.bindEvent(this);
-
-// Observe clicks on our list items
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840760" class="block-content">Now we can remove the event listeners from our list like this:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840267">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/Scripts3.page b/demos/quickstart/protected/pages/Advanced/Scripts3.page index 3f41abe1..b937e274 100755 --- a/demos/quickstart/protected/pages/Advanced/Scripts3.page +++ b/demos/quickstart/protected/pages/Advanced/Scripts3.page @@ -19,22 +19,31 @@ $this->getPage()->getClientScript()->registerPradoScript("effects"); </ul>
The available packaged libraries included in Prado are
<ul id="u2" class="block-content">
- <li><tt>prado</tt> : basic PRADO javascript framework based on Prototype</li>
- <li><tt>effects</tt> : visual effects from script.aculo.us</li>
- <li><tt>ajax</tt> : ajax and callback related based on Prototype</li>
- <li><tt>validator</tt> : validation</li>
+ <li><tt>jquery</tt> : <a href="https://jquery.com/">jQuery</a> javascript framework</li>
+ <li><tt>prado</tt> : basic PRADO javascript framework based on jQuery</li>
+ <li><tt>bootstrap</tt> : <a href="http://getbootstrap.com/">Bootstrap</a> front-end framework</li>
+ <li><tt>effects</tt> : visual effects based on <a href="https://jqueryui.com/">jQueryUI</a></li>
+ <li><tt>ajax</tt> : ajax and callback related based on jQuery</li>
+ <li><tt>validator</tt> : widgets validation</li>
<li><tt>logger</tt> : javascript logger and object browser</li>
- <li><tt>datepicker</tt> : datepicker control</li>
- <li><tt>colorpicker</tt> : colorpicker control</li>
+ <li><tt>datepicker</tt> : TDatepicker control</li>
+ <li><tt>colorpicker</tt> : TColorPicker control</li>
<li><tt>dragdrop</tt> : basic support for "drag and drop" control</li>
<li><tt>dragdropextra</tt> : extra support for "drag and drop" controls</li>
- <li><tt>slider</tt> : slider control</li>
+ <li><tt>slider</tt> : TSlider control</li>
<li><tt>keyboard</tt> : software keyboard control</li>
- <li><tt>tabpanel</tt> : tabpanel control</li>
+ <li><tt>tabpanel</tt> : TTabPanel control</li>
+ <li><tt>inlineeditor</tt> : TInPlaceTextBox. control</li>
<li><tt>activedatepicker</tt> : ajax version of the datepicker control</li>
<li><tt>activefileupload</tt> : ajax version of the fileupload control</li>
- <li><tt>accordion</tt> : accordion control</li>
- <li><tt>htmlarea</tt> : tinymce control</li>
+ <li><tt>accordion</tt> : TAccordion control</li>
+ <li><tt>ratings</tt> : TRatingList control</li>
+ <li><tt>htmlarea</tt> : <a href="http://www.tinymce.com/">tinyMCE</a> version 3 editor</li>
+ <li><tt>htmlarea4</tt> : <a href="http://www.tinymce.com/">tinyMCE</a> version 4 editor</li>
+ <li><tt>prototype</tt> : <a href="http://prototypejs.org/">prototype</a> javascript framework (only for compatibility with old custom controls)</li>
+ <li><tt>dragdrop</tt> : compatibility package for old, prototype-based drag&drop controls</li>
+ <li><tt>dragdropextra</tt> : compatiblity package for old, prototype-based drag&drop controls</li>
+ <li><tt>autocomplete</tt> : compatibility package for prototype-based TAutoComplete control</li>
</ul>
<p id="850761" class="block-content">The dependencies for each library are automatically resolved. Components
diff --git a/demos/quickstart/protected/pages/Advanced/es/Assets.page b/demos/quickstart/protected/pages/Advanced/es/Assets.page deleted file mode 100755 index fc40b561..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Assets.page +++ /dev/null @@ -1,69 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5701">Assets</h1>
-<p id="740577" class="block-content">
-Assets are resource files (such as images, sounds, videos, CSS stylesheets, javascripts, etc.) that belong to specific component classes. Assets are meant to be provided to Web users. For better reusability and easier deployment of the corresponding component classes, assets should reside together with the component class files . For example, a toggle button may use two images, stored in file <tt>down.gif</tt> and <tt>up.gif</tt>, to show different toggle states. If we require the image files be stored under <tt>images</tt> directory under the Web server document root, it would be inconvenient for the users of the toggle button component, because each time they develop or deploy a new application, they would have to manually copy the image files to that specific directory. To eliminate this requirement, a directory relative to the component class file should be used for storing the image files. A common strategy is to use the directory containing the component class file to store the asset files.
-</p>
-<p id="740578" class="block-content">
-Because directories containing component class files are normally inaccessible by Web users, PRADO implements an asset publishing scheme to make available the assets to Web users. An asset, after being published, will have a URL by which Web users can retrieve the asset file.
-</p>
-
-<h2 id="5702">Asset Publishing</h2>
-<p id="740579" class="block-content">
-PRADO provides several methods for publishing assets or directories containing assets:
-</p>
-<ul id="u1" class="block-content">
-<li>In a template file, you can use <a href="?page=Configurations.Templates2#at">asset tags</a> to publish assets and obtain their URLs. Note, the assets must be relative to the directory containing the template file.</li>
-<li>In PHP code, you can call <tt>$object->publishAsset($assetPath)</tt> to publish an asset and obtain its URL. Here, <tt>$object</tt> refers to an instance of <tt>TApplicationComponent</tt> or derived class, and <tt>$assetPath</tt> is a file or directory relative to the directory containing the class file.</li>
-<li>If you want to publish an arbitrary asset, you need to call <tt>TAssetManager::publishFilePath($path)</tt>.</li>
-</ul>
-<p id="740580" class="block-content">
-BE AWARE: Be very careful with assets publishing, because it gives Web users access to files that were previously inaccessible to them. Make sure that you do not publish files that do not want Web users to see.
-</p>
-
-<h2 id="5703">Customization</h2>
-<p id="740581" class="block-content">
-Asset publishing is managed by the <tt>System.Web.TAssetManager</tt> module. By default, all published asset files are stored under the <tt>[AppEntryPath]/assets</tt> directory, where <tt>AppEntryPath</tt> refers to the directory containing the application entry script. Make sure the <tt>assets</tt> directory is writable by the Web server process. You may change this directory to another by configuring the <tt>BasePath</tt> and <tt>BaseUrl</tt> properties of the <tt>TAssetManager</tt> module in application configuration,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code1">
-<modules>
- <module id="asset"
- class="System.Web.TAssetManager"
- BasePath="Web.images"
- BaseUrl="images" />
-</modules>
-</com:TTextHighlighter>
-
-<h2 id="5704">Performance</h2>
-<p id="740582" class="block-content">
-PRADO uses caching techniques to ensure the efficiency of asset publishing. Publishing an asset essentially requires file copy operation, which is expensive. To save unnecessary file copy operations, <tt>System.Web.TAssetManager</tt> only publishes an asset when it has a newer file modification time than the published file. When an application runs under the <tt>Performance</tt> mode, such timestamp checking is also omitted.
-</p>
-<p id="740583" class="block-content">
-ADVISORY: Do not overuse asset publishing. The asset concept is mainly used to help better reuse and redistribute component classes. Normally, you should not use asset publishing for resources that are not bound to any component in an application. For example, you should not use asset publishing for images that are mainly used as design elements (e.g. logos, background images, etc.) Let Web server to directly serve these images will help improve the performance of your application.
-</p>
-
-<h2 id="5705">A Toggle Button Example</h2>
-<p id="740584" class="block-content">
-We now use the toggle button example to explain the usage of assets. The control uses two image files <tt>up.gif</tt> and <tt>down.gif</tt>, which are stored under the directory containing the control class file. When the button is in <tt>Up</tt> state, we would like to show the <tt>up.gif</tt> image. This can be done as follows,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code2">
-class ToggleButton extends TWebControl {
- ...
- protected function addAttributesToRender($writer) {
- ...
- if($this->getState()==='Up') {
- $url=$this->getAsset('up.gif');
- $writer->addAttribute('src',$url);
- }
- ...
- }
- ...
-}
-</com:TTextHighlighter>
-<p id="740585" class="block-content">
-In the above, the call <tt>$this->getAsset('up.gif')</tt> will publish the <tt>up.gif</tt> image file and return a URL for the published image file. The URL is then rendered as the <tt>src</tt> attribute of the HTML image tag.
-</p>
-<p id="740586" class="block-content">
-To redistribute <tt>ToggleButton</tt>, simply pack together the class file and the image files. Users of <tt>ToggleButton</tt> merely need to unpack the file, and they can use it right away, without worrying about where to copy the image files to.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Auth.page b/demos/quickstart/protected/pages/Advanced/es/Auth.page deleted file mode 100755 index 82af40bb..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Auth.page +++ /dev/null @@ -1,171 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5501">Autenticación y Autorizacion</h1>
-<p id="720549" class="block-content">
-Autenticación es un proceso de verificacion de alguna persona cuando esta dice ser quien es. Usualmente se utiliza para esto un nombre de usuario y un contraseña, pero podría incluir otros métodos para demostrar su identidad, tales como tarjetas inteligentes, huellas digitales, etc.
-</p>
-<p id="720550" class="block-content">
-Autorización es el proceso de saber si la persona, una vez indetificada, esta permitida a manipular recursos especificos. Esto es comunmente determinado conociendo si la persona tiene un rol especifico que le da acceso a los recursos solicitados.
-</p>
-
-<h2 id="5502">Funcionamiento de la Autenticación y Autorizacion en PRADO</h2>
-<p id="720551" class="block-content">
-PRADO proporciona una capa extensible de autenticacion/autirizacion. Como esta descrito en el <a href="">Ciclo de vida de una aplicacion PRADO</a>, <tt>TApplication</tt> reserva diversos modulos del ciclo de vida, responsables de la autenticacion y la autorizacion. PRADO proporciona el modulo <tt>TAuthManager</tt> para este propósito. Los desarrolladores pueden incorporar sus propios modulos de autenticacion/autorizacion (auth) facilmente.
-<tt>TAuthManager</tt> esta diseñado para ser usado en conjunto con el modulo <tt>TUserManager</tt>, el cual implementa una base de datos de usuarios de solo lectura (read-only).
-</p>
-<p id="720552" class="block-content">
-When a page request occurs, <tt>TAuthManager</tt> will try to restore user information from session. If no user information is found, the user is considered as an anonymous or guest user. To facilitate user identity verification, <tt>TAuthManager</tt> provides two commonly used methods: <tt>login()</tt> and <tt>logout()</tt>. A user is logged in (verified) if his username and password entries match a record in the user database managed by <tt>TUserManager</tt>. A user is logged out if his user information is cleared from session and he needs to re-login if he makes new page requests.
-</p>
-<p id="720553" class="block-content">
-During <tt>Authorization</tt> application lifecycle, which occurs after <tt>Autenticación</tt> lifecycle, <tt>TAuthManager</tt> will verify if the current user has access to the requested page according to a set of authorization rules. The authorization is role-based, i.e., a user has access to a page if 1) the page explicitly states that the user has access; 2) or the user is of a particular role that has access to the page. If the user does not have access to the page, <tt>TAuthManager</tt> will redirect user browser to the login page which is specified by <tt>LoginPage</tt> property.
-</p>
-
-<h2 id="5503">Using PRADO Auth Framework</h2>
-<p id="720554" class="block-content">
-To enable PRADO auth framework, add the <tt>TAuthManager</tt> module and <tt>TUserManager</tt> module to <a href="">application configuration</a>,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code1">
-<service id="page" class="TPageService">
- <modules>
- <module id="auth" class="System.Security.TAuthManager"
- UserManager="users" LoginPage="UserLogin" />
- <module id="users" class="System.Security.TUserManager"
- PasswordMode="Clear">
- <user name="demo" password="demo" />
- <user name="admin" password="admin" />
- </module>
- </modules>
-</service>
-</com:TTextHighlighter>
-<p id="720555" class="block-content">
-In the above, the <tt>UserManager</tt> property of <tt>TAuthManager</tt> is set to the <tt>users</tt> module which is <tt>TUserManager</tt>. Developers may replace it with a different user management module that is derived from <tt>TUserManager</tt>.
-</p>
-<p id="720556" class="block-content">
-Authorization rules for pages are specified in <a href="">page configurations</a> as follows,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code2">
-<authorization>
- <allow pages="PageID1,PageID2"
- users="User1,User2"
- roles="Role1" />
- <deny pages="PageID1,PageID2"
- users="?"
- verb="post" />
-</authorization>
-</com:TTextHighlighter>
-<p id="720557" class="block-content">
-An authorization rule can be either an <tt>allow</tt> rule or a <tt>deny</tt> rule. Each rule consists of four optional properties:
-</p>
-<ul id="u1" class="block-content">
-<li><tt>pages</tt> - list of comma-separated page names that this rule applies to. If empty, not set or wildcard '*', this rule will apply to all pages under the current directory and all its subdirectories recursively.</li>
-<li><tt>users</tt> - list of comma-separated user names that this rule applies to. If empty, not set or wildcard '*', this rule will apply to all users including anonymous/guest user. A character ? refers to anonymous/guest user. And a character @ refers to authenticated users (available since v3.1).</li>
-<li><tt>roles</tt> - list of comma-separated user roles that this rule applies to. If empty, not set or wildcard '*', this rule will apply to all user roles.</li>
-<li><tt>verb</tt> - page access method that this rule applies to. It can be either <tt>get</tt> or <tt>post</tt>. If empty, not set or wildcard '*', the rule will apply to both methods.</li>
-</ul>
-
-<p id="720558" class="block-content">
-When a page request is being processed, a list of authorization rules may be available. However, only the <i>first effective</i> rule <i>matching</i> the current user will render the authorization result.
-</p>
-<ul id="u2" class="block-content">
-<li>Rules are ordered bottom-up, i.e., the rules contained in the configuration of current page folder go first. Rules in configurations of parent page folders go after.</li>
-<li>A rule is effective if the current page is in the listed pages of the rule AND the current user action (<tt>get</tt> or <tt>post</tt>) is in the listed actions.</li>
-<li>A rule matching occurs if the current user name is in the listed user names of an <i>effective</i> rule OR if the user's role is in the listed roles of that rule.</li>
-<li>If no rule matches, the user is authorized.</li>
-</ul>
-<p id="720559" class="block-content">
-In the above example, anonymous users will be denied from posting to <tt>PageID1</tt> and <tt>PageID2</tt>, while <tt>User1</tt> and <tt>User2</tt> and all users of role <tt>Role1</tt> can access the two pages (in both <tt>get</tt> and <tt>post</tt> methods).
-</p>
-<com:SinceVersion Version="3.1.1" />
-<p class="block-content">
-Since version 3.1.1, the <tt>pages</tt> attribute in the authorization rules can take relative page paths with wildcard '*'. For example, <tt>pages="admin.Home"</tt> refers to the <tt>Home</tt> page under the <tt>admin</tt> directory, and <tt>pages="admin.*"</tt> would refer to all pages under the <tt>admin</tt> directory and subdirectories.
-</p>
-
-<p class="block-content">
-Also introduced in version 3.1.1 are IP rules. They are specified by a new attribute <tt>ips</tt> in authorization rules. The IP rules are used to determine if an authorization rule aplies to an end-user according to his IP address. One can list a few IPs together, separated by comma ','. Wildcard '*' can be used in the rules. For example, <tt>ips="192.168.0.2, 192.168.1.*"</tt> means the rule applies to users whose IP address is 192.168.0.2 or 192.168.1.*. The latter matches any host in the subnet 192.168.1. If the attribute 'ips' is empty, not set or wildcard '*', the corresponding rule will apply to requests coming from any host address.
-</p>
-
-<h2 id="5504">Using <tt>TUserManager</tt></h2>
-<p id="720560" class="block-content">
-As aforementioned, <tt>TUserManager</tt> implements a read-only user database. The user information are specified in either application configuration or an external XML file.
-</p>
-<p id="720561" class="block-content">
-We have seen in the above example that two users are specified in the application configuration. Complete syntax of specifying the user and role information is as follows,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code3">
-<user name="demo" password="demo" roles="demo,admin" />
-<role name="admin" users="demo,demo2" />
-</com:TTextHighlighter>
-<p id="720562" class="block-content">
-where the <tt>roles</tt> attribute in <tt>user</tt> element is optional. User roles can be specified in either the <tt>user</tt> element or in a separate <tt>role</tt> element.
-</p>
-
-<h2 id="5505">Using <tt>TDbUserManager</tt></h2>
-<p id="720563" class="block-content">
-<tt>TDbUserManager</tt> is introduced in v3.1.0. Its main purpose is to simplify the task of managing user accounts that are stored in a database. It requires developers to write a user class that represents the necessary information for a user account. The user class must extend from <tt>TDbUser</tt>.
-</p>
-<p id="720564" class="block-content">
-To use <tt>TDbUserManager</tt>, configure it in the application configuration like following:
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code4">
-<module id="db"
- class="System.Data.TDataSourceConfig" ..../>
-<module id="users"
- class="System.Security.TDbUserManager"
- UserClass="Path.To.MyUserClass"
- ConnectionID="db" />
-<module id="auth"
- class="System.Security.TAuthManager"
- UserManager="users" LoginPage="Path.To.LoginPage" />
-</com:TTextHighlighter>
-
-</p>
-<p id="720565" class="block-content">
-In the above, <tt>UserClass</tt> specifies what class will be used to create user instance. The class must extend from <tt>TDbUser</tt>. <tt>ConnectionID</tt> refers to the ID of a <tt>TDataSourceConfig</tt> module which specifies how to establish database connection to retrieve user information.
-</p>
-<p id="720566" class="block-content">
-The user class has to implement the two abstract methods in <tt>TDbUser</tt>: <tt>validateUser()</tt> and <tt>createUser()</tt>. Since user account information is stored in a database, the user class may make use of its <tt>DbConnection</tt> property to reach the database.
-</p>
-<com:SinceVersion Version="3.1.1" />
-<p id="720567" class="block-content">
-Since 3.1.1, <tt>TAuthManager</tt> provides support to allow remembering login by setting <tt>AllowAutoLogin</tt> to true. Accordingly, <tt>TDbUser</tt> adds two methods to facilitate the implementation of this feature. In particular, two new methods are introduced: <tt>createUserFromCookie()</tt> and <tt>saveUserToCookie()</tt>. Developers should implement these two methods if remembering login is needed. Below is a sample implementation:
-</p>
-<com:TTextHighlighter Language="php" CssClass="source block-content" id="code5">
-public function createUserFromCookie($cookie)
-{
- if(($data=$cookie->Value)!=='')
- {
- $application=Prado::getApplication();
- if(($data=$application->SecurityManager->validateData($data))!==false)
- {
- $data=unserialize($data);
- if(is_array($data) && count($data)===3)
- {
- list($username,$address,$token)=$data;
- $sql='SELECT passcode FROM user WHERE LOWER(username)=:username';
- $command=$this->DbConnection->createCommand($sql);
- $command->bindValue(':username',strtolower($username));
- if($token===$command->queryScalar() && $token!==false && $address=$application->Request->UserHostAddress)
- return $this->createUser($username);
- }
- }
- }
- return null;
-}
-
-public function saveUserToCookie($cookie)
-{
- $application=Prado::getApplication();
- $username=strtolower($this->Name);
- $address=$application->Request->UserHostAddress;
- $sql='SELECT passcode FROM user WHERE LOWER(username)=:username';
- $command=$this->DbConnection->createCommand($sql);
- $command->bindValue(':username',strtolower($username));
- $token=$command->queryScalar();
- $data=array($username,$address,$token);
- $data=serialize($data);
- $data=$application->SecurityManager->hashData($data);
- $cookie->setValue($data);
-}
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Collections.page b/demos/quickstart/protected/pages/Advanced/es/Collections.page deleted file mode 100755 index 55f0d554..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Collections.page +++ /dev/null @@ -1,135 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5501">Collections</h1>
-<p id="710529" class="block-content">
-Collection is a basic data structure in programming. In traditional PHP programming, array is used widely to represent collection data structure. A PHP array is a mix of cardinal-indexed array and hash table.
-</p>
-<p id="710530" class="block-content">
-To enable object-oriented manipulation of collections, PRADO provides a set of powerful collection classes. Among them, the <tt>TList</tt> and <tt>TMap</tt> are the most fundamental and usually serve as the base classes for other collection classes. Since many PRADO components have properties that are of collection type, it is very important for developers to master the usage of PRADO collection classes.
-</p>
-
-<h2 id="5502">Using <tt>TList</tt></h2>
-<p id="710531" class="block-content">
-A <tt>TList</tt> object represents a cardinal-indexed array, i.e., an array (object) with the index 0, 1, 2, ...
-</p>
-<p id="710532" class="block-content">
-<tt>TList</tt> may be used like a PHP array. For example,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code1">
-$list=new TList; // create a list object
-...
-$item=$list[$index]; // read the item at the specified index
-$list[]=$item; // append the item at the end
-$list[$index]=$item; // replace the item at the specified index
-unset($list[$index]); // remove the item at $index
-if(isset($list[$index])) // test if the list has an item at $index
-foreach($list as $index=>$item) // traverse each item in the list
-</com:TTextHighlighter>
-
-<p id="710533" class="block-content">
-To obtain the number of items in the list, use the <tt>Count</tt> property. Note, do not use <tt>count($list)</tt>, as it always returns 1.
-</p>
-
-<p id="710534" class="block-content">
-In addition, <tt>TList</tt> implements a few commonly used convenient methods for manipulating the data in a list. These include
-</p>
-<ul id="u1" class="block-content">
- <li><tt>clear()</tt>: removes all items in the list.</li>
- <li><tt>contains()</tt>: tests if the list contains the specified item.</li>
- <li><tt>indexOf()</tt>: obtains the zero-based index of the specified item in the list.</li>
- <li><tt>toArray()</tt>: returns an array representation of the items in the list.</li>
- <li><tt>copyFrom()</tt>: populates the list with data from an array or traversable object (including <tt>TList</tt>). Existing items will be removed first.</li>
- <li><tt>mergeWith()</tt>: appends the list with data from an array or traversable object (including <tt>TList</tt>).</li>
-</ul>
-
-<h3 id="5504">Using <tt>TList</tt>-based component properties</h3>
-<p id="710535" class="block-content">
-As aforementioned, many PRADO component properties are based on <tt>TList</tt> or <tt>TList</tt>-derived collection classes. These properties all share the above usages.
-</p>
-<p id="710536" class="block-content">
-For example, <tt>TControl</tt> (the base class for all PRADO controls) has a property called <tt>Controls</tt> which represents the collection of child controls. The type of <tt>Controls</tt> is <tt>TControlCollection</tt> which extends <tt>TList</tt>. Therefore, to append a new child control, we can use the following,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code2">
-$control->Controls[]=$newControl;
-</com:TTextHighlighter>
-<p id="710537" class="block-content">
-To traverse through the child controls, we can use,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code3">
-foreach($control->Controls as $childControl) ...
-</com:TTextHighlighter>
-<p id="710538" class="block-content">
-Another example is the <tt>Items</tt> property, available in list controls, <tt>TRepeater</tt>, <tt>TDataList</tt> and <tt>TDataGrid</tt>. In these controls, the ancestor class of <tt>Items</tt> is <tt>TList</tt>.
-</p>
-
-<h3 id="5505">Extending <tt>TList</tt></h3>
-<p id="710539" class="block-content">
-Often, we want to extend <tt>TList</tt> to perform additional operations for each addition or removal of an item. The only methods that the child class needs to override are <tt>insertAt()</tt> and <tt>removeAt()</tt>. For example, to ensure the list only contains items that are of <tt>TControl</tt> type, we can override <tt>insertAt()</tt> as follows,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code4">
-public function insertAt($index,$item)
-{
- if($item instanceof TControl)
- parent::insertAt($index,$item)
- else
- throw new Exception('TControl required.');
-}
-</com:TTextHighlighter>
-
-
-<h2 id="5503">Using <tt>TMap</tt></h2>
-<p id="710540" class="block-content">
-A <tt>TMap</tt> object represents a hash table (or we say string-indexed array).
-</p>
-<p id="710541" class="block-content">
-Similar to <tt>TList</tt>, <tt>TMap</tt> may be used like an array,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code5">
-$map=new TMap; // create a map object
-...
-$map[$key]=$value; // add a key-value pair
-unset($map[$key]); // remove the value with the specified key
-if(isset($map[$key])) // if the map contains the key
-foreach($map as $key=>$value) // traverse the items in the map
-</com:TTextHighlighter>
-<p id="710542" class="block-content">
-The <tt>Count</tt> property gives the number of items in the map while the <tt>Keys</tt> property returns a list of keys used in the map.
-</p>
-
-<p id="710543" class="block-content">
-The following methods are provided by <tt>TMap</tt> for convenience,
-</p>
-<ul id="u2" class="block-content">
- <li><tt>clear()</tt>: removes all items in the map.</li>
- <li><tt>contains()</tt>: tests if the map contains the specified key.</li>
- <li><tt>toArray()</tt>: returns an array representation of the items in the map.</li>
- <li><tt>copyFrom()</tt>: populates the map with data from an array or traversable object (including <tt>TMap</tt>). Existing items will be removed first.</li>
- <li><tt>mergeWith()</tt>: appends the map with data from an array or traversable object (including <tt>TMap</tt>).</li>
-</ul>
-
-<h3 id="5506">Using of <tt>TAttributeCollection</tt></h3>
-<p id="710544" class="block-content">
-<tt>TAttributeCollection</tt> is a special class extending from <tt>TMap</tt>. It is mainly used by the <tt>Attributes</tt> property of <tt>TControl</tt>.
-</p>
-Besides the normal functionalities provided by <tt>TMap</tt>, <tt>TAttributeCollection</tt> allows you to get and set collection items like getting and setting properties. For example,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code6">
-$collection->Label='value'; // equivalent to: $collection['Label']='value';
-echo $collection->Label; // equivalent to: echo $collection['Label'];
-</com:TTextHighlighter>
-<p id="710545" class="block-content">
-Note, in the above <tt>$collection</tt> does NOT have a <tt>Label</tt> property.
-</p>
-<p id="710546" class="block-content">
-Unlike <tt>TMap</tt>, keys in <tt>TAttributeCollection</tt> are case-insensitive. Therefore, <tt>$collection->Label</tt> is equivalent to <tt>$collection->LABEL</tt>.
-</p>
-<p id="710547" class="block-content">
-Because of the above new features, when dealing with the <tt>Attributes</tt> property of controls, we may take advantage of the subproperty concept and configure control attribute values in a template as follows,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code7">
-<com:TButton Attributes.onclick="if(!confirm('Are you sure?')) return false;" .../>
-</com:TTextHighlighter>
-<p id="710548" class="block-content">
-which adds an attribute named <tt>onclick</tt> to the <tt>TButton</tt> control.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Error.page b/demos/quickstart/protected/pages/Advanced/es/Error.page deleted file mode 100755 index 24c7ead0..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Error.page +++ /dev/null @@ -1,77 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6301">Error Handling and Reporting</h1>
-<p id="800666" class="block-content">
-PRADO provides a complete error handling and reporting framework based on the PHP 5 exception mechanism.
-</p>
-
-<h2 id="6302">Exception Classes</h2>
-<p id="800667" class="block-content">
-Errors occur in a PRADO application may be classified into three categories: those caused by PHP script parsing, those caused by wrong code (such as calling an undefined function, setting an unknown property), and those caused by improper use of the Web application by client users (such as attempting to access restricted pages). PRADO is unable to deal with the first category of errors because they cannot be caught in PHP code. PRADO provides an exception hierarchy to deal with the second and third categories.
-</p>
-<p id="800668" class="block-content">
-All errors in PRADO applications are represented as exceptions. The base class for all PRADO exceptions is <tt>TException</tt>. It provides the message internationalization functionality to all system exceptions. An error message may be translated into different languages according to the user browser's language preference.
-</p>
-<p id="800669" class="block-content">
-Exceptions raised due to improper usage of the PRADO framework inherit from <tt>TSystemException</tt>, which can be one of the following exception classes:
-</p>
-<ul id="u1" class="block-content">
-<li><tt>TConfigurationException</tt> - improper configuration, such as error in application configuration, control templates, etc.</li>
-<li><tt>TInvalidDataValueException</tt> - data value is incorrect or unexpected.</li>
-<li><tt>TInvalidDataTypeException</tt> - data type is incorrect or unexpected.</li>
-<li><tt>TInvalidDataFormatException</tt> - format of data is incorrect.</li>
-<li><tt>TInvalidOperationException</tt> - invalid operation request.</li>
-<li><tt>TPhpErrorException</tt> - catchable PHP errors, warnings, notices, etc.</li>
-<li><tt>TSecurityException</tt> - errors related with security.</li>
-<li><tt>TIOException</tt> - IO operation error, such as file open failure.</li>
-<li><tt>TDBException</tt> - errors related with database operations.</li>
-<li><tt>TNotSupportedException</tt> - errors caused by requesting for unsupported feature.</li>
-<li><tt>THttpException</tt> - errors to be displayed to Web client users.</li>
-</ul>
-<p id="800670" class="block-content">
-Errors due to improper usage of the Web application by client users inherit from <tt>TApplicationException</tt>.
-</p>
-
-<h2 id="6303">Raising Exceptions</h2>
-<p id="800671" class="block-content">
-Raising exceptions in PRADO has no difference than raising a normal PHP exception. The only thing matters is to raise the right exception. In general, exceptions meant to be shown to application users should use <tt>THttpException</tt>, while exceptions shown to developers should use other exception classes.
-</p>
-
-<h2 id="6304">Error Capturing and Reporting</h2>
-<p id="800672" class="block-content">
-Exceptions raised during the runtime of PRADO applications are captured by <tt>System.Exceptions.TErrorHandler</tt> module. Different output templates are used to display the captured exceptions. <tt>THttpException</tt> is assumed to contain error messages that are meant for application end users and thus uses a specific group of templates. For all other exceptions, a common template shown as follows is used for presenting the exceptions.
-</p>
-<a href="<%~ exception2.gif %>" target="_blank"><img src="<%~ exception.gif %>" alt="exception page" style="border:0px"/></a>
-
-<h2 id="6305">Customizing Error Display</h2>
-<p id="800673" class="block-content">
-Developers can customize the presentation of exception messages. By default, all error output templates are stored under <tt>framework/Exceptions/templates</tt>. The location can be changed by configuring <tt>TErrorHandler</tt> in application configuration,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_800226">
-<module id="error"
- class="TErrorHandler"
- ErrorTemplatePath="Application.ErrorTemplates" />
-</com:TTextHighlighter>
-<p id="800674" class="block-content">
-<tt>THttpException</tt> uses a set of templates that are differentiated according to different <tt>StatusCode</tt> property value of <tt>THttpException</tt>. <tt>StatusCode</tt> has the same meaning as the status code in HTTP protocol. For example, a status code equal to 404 means the requested URL is not found on the server. The <tt>StatusCode</tt> value is used to select which output template to use. The output template files use the following naming convention:
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_800227">
- error<status code>-<language code>.html
-</com:TTextHighlighter>
-<p id="800675" class="block-content">
-where <tt>status code</tt> refers to the <tt>StatusCode</tt> property value of <tt>THttpException</tt>, and <tt>language code</tt> must be a valid language such as <tt>en</tt>, <tt>zh</tt>, <tt>fr</tt>, etc. When a <tt>THttpException</tt> is raised, PRADO will select an appropriate template for displaying the exception message. PRADO will first locate a template file whose name contains the status code and whose language is preferred by the client browser window. If such a template is not present, it will look for a template that has the same status code but without language code.
-</p>
-<p id="800676" class="block-content">
-The naming convention for the template files used for all other exceptions is as follows,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_800228">
- exception-<language code>.html
-</com:TTextHighlighter>
-<p id="800677" class="block-content">
-Again, if the preferred language is not found, PRADO will try to use <tt>exception.html</tt>, instead.
-</p>
-<div class="note">
-<b class="tip">CAUTION:</b> When saving a template file, please make sure the file is saved using UTF-8 encoding. On Windows, you may use <tt>Notepad.exe</tt> to accomplish such saving.
-</div>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/I18N.page b/demos/quickstart/protected/pages/Advanced/es/I18N.page deleted file mode 100755 index 1a559036..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/I18N.page +++ /dev/null @@ -1,360 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6201">Internationalization (I18N) and Localization (L10N)</h1>
-<p id="790625" class="block-content">Many web application built with PHP will not have internationalization in mind when it was first written. It may be that it was not intended for use in languages and cultures. Internationalization is an important aspect due to the increase adoption of the Internet in many non-English speaking countries. The process of internationalization and localization will contain difficulties. Below are some general guidelines to internationalize an existing application.</p>
-
-<h2 id="6203">Separate culture/locale sensitive data</h2>
-
-<p id="790626" class="block-content">Identify and separate data that varies with culture. The most obvious are text/string/message. Other type of data should also be considered. The following list categorize some examples of culture sensitive data
-</p>
-
-<ul id="u1" class="block-content">
- <li> Strings, Messages, Text, in relatively small units (e.g. phrases, sentences, paragraphs, but not the full text of a book).</li>
- <li> Labels on buttons.</li>
- <li> Help files, large units of text, static text.</li>
- <li> Sounds.</li>
- <li> Colors.</li>
- <li> Graphics,Icons.</li>
- <li> Dates, Times.</li>
- <li> Numbers, Currency, Measurements.</li>
- <li> Phone numbers.</li>
- <li> Honorific and personal titles.</li>
- <li> Postal address.</li>
- <li> Page layout.</li>
-</ul>
-
-<p id="790627" class="block-content">If possible all manner of text should be isolated and store in a persistence format. These text include, application error messages, hard coded strings in PHP files, emails, static HTML text, and text on form elements (e.g. buttons).</p>
-
-<h2 id="6204">Configuration</h2>
-<p id="790628" class="block-content">To enable the localization features in PRADO, you need to add a few configuration options in your <a href="?page=Configurations.AppConfig">application configuration</a>.
-First you need to include the <tt>System.I18N.*</tt> namespace to your paths.
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790203">
-<paths>
- <using namespace="System.I18N.*" />
-</paths>
-</com:TTextHighlighter>
-
-<p id="790629" class="block-content">Then, if you wish to translate some text in your application, you need to add one translation message data source.</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790204">
-<module id="globalization" class="TGlobalization">
- <translation type="XLIFF"
- source="MyApp.messages"
- marker="@@"
- autosave="true" cache="true" />
-</module>
-</com:TTextHighlighter>
-
-<p id="790630" class="block-content">Where <tt>source</tt> in <tt>translation</tt> is the dot path to a directory
-where you are going to store your translate message catalogue. The <tt>autosave</tt>
-attribute if enabled, saves untranslated messages back into the message catalogue.
-With <tt>cache</tt> enabled, translated messages are saved in the application <tt>runtime/i18n</tt> directory.
-The <tt>marker</tt> value is used to surround any untranslated text.
-</p>
-
-<p id="790631" class="block-content">With the configuration complete, we can now start to localize your application. If you have <tt>autosave</tt> enabled, after running your application with some localization activity (i.e. translating some text), you will see a directory and a <tt>messages.xml</tt> created within your <tt>source</tt> directory.</p>
-
-<h2 id="6205">What to do with <tt>messages.xml</tt>?</h2>
-<p id="790632" class="block-content">The translation message catalogue file, if using <tt>type="XLIFF"</tt>, is a standardized translation message interchange XML format. You can edit the XML file using any UTF-8 aware editor. The format of the XML is something like the following.</p>
-
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790205">
-<?xml version="1.0"?>
-<xliff version="1.0">
- <file original="I18N Example IndexPage"
- source-language="EN"
- datatype="plaintext"
- date="2005-01-24T11:07:53Z">
- <body>
-
-<trans-unit id="1">
-<source>Hello world.</source>
-<target>Hi World!!!</target>
-</trans-unit>
-
- </body>
- </file>
-</xliff>
-</com:TTextHighlighter>
-
-Each translation message is wrapped within a <tt>trans-unit</tt> tag, where <tt>source</tt> is the original message, and <tt>target</tt> is the translated message. Editors such as <a href="http://www.heartsome.net/EN/xlfedit.html">Heartsome XLIFF Translation Editor</a> can help in editing these XML files.
-
-
-<h2 id="6206">Setting and Changing Culture</h2>
-<p id="790633" class="block-content">Once globalization is enabled, you can access the globalization settings, such as, <tt>Culture</tt>, <tt>Charset</tt>, etc, using </p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790206">
-$globalization = $this->getApplication()->getGlobalization();
-echo $globalization->Culture;
-$globalization->Charset= "GB-2312"; //change the charset
-</com:TTextHighlighter>
-
-<p id="790634" class="block-content">You also change the way the culture is determined by changing the <tt>class</tt> attribute in the module configuration. For example, to set the culture that depends on the browser settings, you can use the <tt>TGlobalizationAutoDetect</tt> class.
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790207">
-<module id="globalization" class="TGlobalizationAutoDetect">
- ...
-</module>
-</com:TTextHighlighter>
-
-<p id="790635" class="block-content">You may also provide your own globalization class to change how the application culture is set.
-Lastly, you can change the globalization settings on page by page basis using <a href="?page=Configurations.Templates1#tct">template control tags</a>. For example, changing the <tt>Culture</tt> to "zh".</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790208">
-<%@ Application.Globalization.Culture="zh" %>
-</com:TTextHighlighter>
-
-<h2 id="6207">Localizing your PRADO application</h2>
-There are two areas in your application that may need message or string localization, in PHP code and in the templates. To localize strings within PHP, use the <tt>localize</tt> function detailed below. To localize text in the template, use the <a href="#ttranslate">TTranslate</a> component.
-<h2 id="6208">Using <tt>localize</tt> function to translate text within PHP</h2>
-
-<p id="790636" class="block-content">The <tt>localize</tt> function searches for a translated string that matches original from your translation source. First, you need to locate all the hard coded text in PHP that are displayed or sent to the end user. The following example localizes the text of the <tt>$sender</tt> (assuming, say, the sender is a button). The original code before localization is as follows.
-<com:TTextHighlighter CssClass="source block-content" id="code_790209">
-function clickMe($sender,$param)
-{
- $sender->Text="Hello, world!";
-}
-</com:TTextHighlighter>
-
-<p id="790637" class="block-content">The hard coded message "Hello, world!" is to be localized using the <tt>localize</tt> function. </p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790210">
-function clickMe($sender,$param)
-{
- $sender->Text=Prado::localize("Hello, world!");
-}
-</com:TTextHighlighter>
-
-<h2 id="6209">Compound Messages</h2>
-
-<p id="790638" class="block-content">Compound messages can contain variable data. For example, in the message "There are 12 users online.", the integer 12 may change depending on some data in your application. This is difficult to translate because the position of the variable data may be difference for different languages. In addition, different languages have their own rules for plurals (if any) and/or quantifiers. The following example can not be easily translated, because the sentence structure is fixed by hard coding the variable data within message.</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790211">
-$num_users = 12;
-$message = "There are " . $num_users . " users online.";
-</com:TTextHighlighter>
-
-This problem can be solved using the <tt>localize</tt> function with string substitution. For example, the <tt>$message</tt> string above can be constructed as follows.
-<com:TTextHighlighter CssClass="source block-content" id="code_790212">
-$num_users = 12;
-$message = Prado::localize("There are {num_users} users online.", array('num_users'=>$num_users));
-</com:TTextHighlighter>
-<p id="790639" class="block-content">Where the second parameter in <tt>localize</tt> takes an associative array with the key as the substitution to find in the text and replaced it with the associated value.
-The <tt>localize</tt> function does not solve the problem of localizing languages that have plural forms, the solution is to use <a href="#choice-format">TChoiceFormat</a>.</p>
-
-<p id="790640" class="block-content">The following sample demonstrates the basics of localization in PRADO.</p>
-<com:RunBar PagePath="Advanced.Samples.I18N.Home" />
-
-<h1 id="6202">I18N Components</h1>
-<a name="ttranslate"></a>
-<h2 id="6210">TTranslate</h2>
-<p id="790641" class="block-content">Messages and strings can be localized in PHP or in templates.
-To translate a message or string in the template, use <tt>TTranslate</tt>.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790213">
-<com:TTranslate>Hello World</com:TTranslate>
-<com:TTranslate Text="Goodbye" />
-</com:TTextHighlighter>
-
-<p id="790642" class="block-content"><tt>TTranslate</tt> can also perform string substitution.
-The <tt>Parameters</tt> property can be use to add name values pairs for substitution. Substrings in the translation enclosed with "{" and "}" are consider as the
- parameter names during substitution lookup. The following example will substitute the substring "{time}" with the value of the parameter attribute "<tt>Parameters.time=<%= time() %></tt>".
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790214">
-<com:TTranslate Parameters.time=<%= time() %> >
-The time is {time}.
-</com:TTranslate>
-</com:TTextHighlighter>
-
-<p id="790643" class="block-content">A short for <tt>TTranslate</tt> is also provided using the following syntax.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790215">
-<%[string]%>
-</com:TTextHighlighter>
-<p id="790644" class="block-content">where string will be translated to different languages according to the end-user's language preference. This syntax can be used with attribute values as well.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790216">
-<com:TLabel Text="<%[ Hello World! ]%>" />
-</com:TTextHighlighter>
-
-<h2 id="6211">TDateFormat</h2>
-<p id="790645" class="block-content">Formatting localized date and time is straight forward.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790217">
-<com:TDateFormat Value="12/01/2005" />
-</com:TTextHighlighter>
-
-<p id="790646" class="block-content">The <tt>Pattern</tt> property accepts 4 predefined localized date patterns and 4 predefined localized time patterns.</p>
-<ul id="u2" class="block-content">
- <li><tt>fulldate</tt></li>
- <li><tt>longdate</tt></li>
- <li><tt>mediumdate</tt></li>
- <li><tt>shortdate</tt></li>
- <li><tt>fulltime</tt></li>
- <li><tt>longtime</tt></li>
- <li><tt>mediumtime</tt></li>
- <li><tt>shorttime</tt></li>
-</ul>
-<p id="p1" class="block-content">
-The predefined can be used in any combination. If using a combined predefined pattern,
-the first pattern must be the date, followed by a space, and lastly the time pattern.
-For example, full date pattern with short time pattern. The actual ordering of the
-date-time and the actual pattern will be determine automatically from locale data specified
-by the <tt>Culture</tt> property.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790218">
-<com:TDateFormat Pattern="fulldate shorttime" />
-</com:TTextHighlighter>
-
-<p id="790647" class="block-content">You can also specify a custom pattern using the following sub-patterns.
-The date/time format is specified by means of a string time pattern. In this pattern, all ASCII letters are reserved as pattern letters, which are defined as the following:
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790219">
- Symbol Meaning Presentation Example
- ------ ------- ------------ -------
- G era designator (Text) AD
- y year (Number) 1996
- M month in year (Text & Number) July & 07
- d day in month (Number) 10
- h hour in am/pm (1~12) (Number) 12
- H hour in day (0~23) (Number) 0
- m minute in hour (Number) 30
- s second in minute (Number) 55
- E day of week (Text) Tuesday
- D day in year (Number) 189
- F day of week in month (Number) 2 (2nd Wed in July)
- w week in year (Number) 27
- W week in month (Number) 2
- a am/pm marker (Text) PM
- k hour in day (1~24) (Number) 24
- K hour in am/pm (0~11) (Number) 0
- z time zone (Time) Pacific Standard Time
- ' escape for text (Delimiter) 'Date='
- '' single quote (Literal) 'o''clock'
-</com:TTextHighlighter>
-</p>
-
-<p id="790648" class="block-content">The count of pattern letters determine the format.</p>
-
-<p id="790649" class="block-content">(Text): 4 letters uses full form, less than 4, use short or abbreviated form
-if it exists. (e.g., "EEEE" produces "Monday", "EEE" produces "Mon")</p>
-
-<p id="790650" class="block-content">(Number): the minimum number of digits. Shorter numbers are zero-padded
- to this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is
- handled specially; that is, if the count of 'y' is 2, the Year will be
- truncated to 2 digits. (e.g., if "yyyy" produces "1997", "yy" produces "97".)
- Unlike other fields, fractional seconds are padded on the right with zero.</p>
-
-<p id="790651" class="block-content">(Text and Number): 3 or over, use text, otherwise use number. (e.g.,
-"M" produces "1", "MM" produces "01", "MMM" produces "Jan", and "MMMM"
-produces "January".)</p>
-
-<p id="790652" class="block-content">Any characters in the pattern that are not in the ranges of ['a'..'z']
-and ['A'..'Z'] will be treated as quoted text. For instance, characters
-like ':', '.', ' ', and '@' will appear in the resulting time text
-even they are not embraced within single quotes.</p>
-
-<p id="790653" class="block-content">Examples using the US locale:
-
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790220">
-Format Pattern Result
--------------- -------
-"yyyy.MM.dd G 'at' HH:mm:ss" ->> 1996.07.10 AD at 15:08:56
-"EEE, MMM d, ''yy" ->> Wed, Jul 10, '96
-"h:mm a" ->> 12:08 PM
-"hh 'o''clock' a, z" ->> 12 o'clock PM, Pacific Daylight Time
-"K:mm a" ->> 0:00 PM
-"yyyy.MMMM.dd G hh:mm a" ->> 1996.July.10 AD 12:08 PM
-</com:TTextHighlighter>
-</p>
-
-<p id="790654" class="block-content">If the <tt>Value</tt> property is not specified, the current date and time is used.</p>
-
-<h2 id="6212">TNumberFormat</h2>
-<p id="790655" class="block-content">PRADO's Internationalization framework provide localized currency formatting and number formatting. Please note that the <tt>TNumberFormat</tt> component provides formatting only, it does not perform current conversion or exchange.</p>
-
-<p id="790656" class="block-content">Numbers can be formatted as currency, percentage, decimal or scientific
-numbers by specifying the <tt>Type</tt> attribute. The valid types are:</p>
-<ul id="u3" class="block-content">
- <li><tt>currency</tt></li>
- <li><tt>percentage</tt></li>
- <li><tt>decimal</tt></li>
- <li><tt>scientific</tt></li>
-</ul>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790221">
-<com:TNumberFormat Type="currency" Value="100" />
-</com:TTextHighlighter>
-
-<p id="790657" class="block-content"><tt>Culture</tt> and <tt>Currency</tt> properties may be specified to format locale specific numbers. </p>
-
-<p id="790658" class="block-content">If someone from US want to see sales figures from a store in
-Germany (say using the EURO currency), formatted using the german
- currency, you would need to use the attribute <tt>Culture="de_DE"</tt> to get
-the currency right, e.g. 100,00$. The decimal and grouping separator is
-then also from the <tt>de_DE</tt> locale. This may lead to some confusion because
-people from US uses the "," (comma) as thousand separator. Therefore a <tt>Currency</tt>
-attribute is available, so that the output from the following example results in $100.00
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790222">
-<com:TNumberFormat Type="currency"
- Culture="en_US" Currency="EUR" Value="100" />
-</com:TTextHighlighter>
-</p>
-
-<p id="790659" class="block-content">The <tt>Pattern</tt> property determines the number of digits, thousand grouping
-positions, the number of decimal points and the decimal position. The actual characters that
-are used to represent the decimal points and thousand points are culture specific
-and will change automatically according to the <tt>Culture</tt> property. The valid
-<tt>Pattern</tt> characters are:</p>
-<ul id="u6" class="block-content">
- <li><tt># (hash)</tt> - represents the optional digits</li>
- <li><tt>0 (zero)</tt> - represents the mandatory digits, zero left filled</li>
- <li><tt>. (full stop)</tt> - the position of the decimal point (only 1 decimal point is allowed)</li>
- <li><tt>, (comma)</tt> - thousand point separation (up to 2 commas are allowed)</li>
-</ul>
-<p id="p2" class="block-content">
-For example, consider the <tt>Value="1234567.12345"</tt> and
-with <tt>Culture="en_US"</tt> (which uses "," for thousand point separator and "." for decimal separators).
-</p>
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790223">
-Pattern Output
-------- ------
-##,###.00 ->> 1,234,567.12
-##,###.## ->> 1,234,567.12345
-##,##.0000 ->> 1,23,45,67.1235
-##,###,##.0 ->> 12,345,67.1
-000,000,000.0 ->> 001,234,567.1
-</com:TTextHighlighter>
-</p>
-
-<h2 id="6213">TTranslateParameter</h2>
-<p id="790660" class="block-content">Compound messages, i.e., string substitution, can be accomplished with <tt>TTranslateParameter</tt>.
-In the following example, the strings "{greeting}" and "{name}" will be replace
-with the values of "Hello" and "World", respectively.The substitution string must be enclose with "{" and "}". The parameters can be further translated by using <tt>TTranslate</tt>.
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790224">
-<com:TTranslate>
- {greeting} {name}!
- <com:TTranslateParameter Key="name">World</com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting">Hello</com:TTranslateParameter>
-</com:TTranslate>
-</com:TTextHighlighter>
-
-
-<a name="choice-format"></a>
-<h2 id="6214">TChoiceFormat</h2>
-
-<p id="790661" class="block-content">Using the <tt>localize</tt> function or <tt>TTranslate</tt> component to translate messages does not inform the translator the cardinality of the data required to determine the correct plural structure to use. It only informs them that there is a variable data, the data could be anything. Thus, the translator will be unable to determine with respect to the substitution data the correct plural, language structure or phrase to use . E.g. in English, to translate the sentence, "There are {number} of apples.", the resulting translation should be different depending on the <tt>number</tt> of apples.</p>
-
-<p id="790662" class="block-content">The <tt>TChoiceFormat</tt> component performs message/string choice translation. The following example demonstrated a simple 2 choice message translation.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790225">
-<com:TChoiceFormat Value="1"/>[1] One Apple. |[2] Two Apples</com:TChoiceFormat>
-</com:TTextHighlighter>
-
-<p id="790663" class="block-content">In the above example, the <tt>Value</tt> "1" (one), thus the translated string
-is "One Apple". If the <tt>Value</tt> was "2", then it will show "Two Apples".</p>
-
-<p id="790664" class="block-content">The message/string choices are separated by the pipe "|" followed by a set notation of the form.</p>
-<ul id="u7" class="block-content">
- <li><tt>[1,2]</tt> -- accepts values between 1 and 2, inclusive.</li>
- <li><tt>(1,2)</tt> -- accepts values between 1 and 2, excluding 1 and 2.</li>
- <li><tt>{1,2,3,4}</tt> -- only values defined in the set are accepted.</li>
- <li><tt>[-Inf,0)</tt> -- accepts value greater or equal to negative infinity
- and strictly less than 0</li>
-</ul>
-
-<p id="790665" class="block-content">Any non-empty combinations of the delimiters of square and round brackets are acceptable.
-The string chosen for display depends on the <tt>Value</tt> property. The <tt>Value</tt> is evaluated for each set until the <tt>Value</tt> is found to belong to a particular set.</p>
-
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Logging.page b/demos/quickstart/protected/pages/Advanced/es/Logging.page deleted file mode 100755 index de67b5f6..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Logging.page +++ /dev/null @@ -1,61 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6101">Logging</h1>
-<p id="780615" class="block-content">
-PRADO provides a highly flexible and extensible logging functionality. Messages logged can be classified according to log levels and message categories. Using level and category filters, the messages can be further routed to different destinations, such as files, emails, browser windows, etc. The following diagram shows the basic architecture of PRADO logging mechanism,
-</p>
-<img src="<%~ logrouter.gif %>" alt="Log router" />
-
-<h2 id="6102">Using Logging Functions</h2>
-<p id="780616" class="block-content">
-The following two methods are provided for logging messages in PRADO,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_780201">
-Prado::log($message, $logLevel, $category);
-Prado::trace($message, $category);
-</com:TTextHighlighter>
-<p id="780617" class="block-content">
-The difference between <tt>Prado::log()</tt> and <tt>Prado::trace()</tt> is that the latter automatically selects the log level according to the application mode. If the application is in <tt>Debug</tt> mode, stack trace information is appended to the messages. <tt>Prado::trace()</tt> is widely used in the core code of the PRADO framework.
-</p>
-
-<h2 id="6103">Message Routing</h2>
-<p id="780618" class="block-content">
-Messages logged using the above two functions are kept in memory. To make use of the messages, developers need to route them to specific destinations, such as files, emails, or browser windows. The message routing is managed by <tt>System.Util.TLogRouter</tt> module. When plugged into an application, it can route the messages to different destination in parallel. Currently, PRADO provides three types of routes:
-</p>
-<ul id="u1" class="block-content">
- <li><tt>TFileLogRoute</tt> - filtered messages are stored in a specified log file. By default, this file is named <tt>prado.log</tt> under the runtime directory of the application. File rotation is provided.</li>
- <li><tt>TEmailLogRoute</tt> - filtered messages are sent to pre-specified email addresses.</li>
- <li><tt>TBrowserLogRoute</tt> - filtered messages are appended to the end of the current page output.</li>
-</ul>
-<p id="780619" class="block-content">
-To enable message routing, plug in and configure the <tt>TLogRouter</tt> module in application configuration,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_780202">
-<module id="log" class="System.Util.TLogRouter">
- <route class="TBrowserLogRoute"
- Levels="Info"
- Categories="System.Web.UI.TPage, System.Web.UI.WebControls" />
- <route class="TFileLogRoute"
- Levels="Warning, Error"
- Categories="System.Web" />
-</module>
-</com:TTextHighlighter>
-<p id="780620" class="block-content">
-In the above, the <tt>Levels</tt> and <tt>Categories</tt> specify the log and category filters to selectively retrieve the messages to the corresponding destinations.
-</p>
-
-<h2 id="6104">Message Filtering</h2>
-<p id="780621" class="block-content">
-Messages can be filtered according to their log levels and categories. Each log message is associated with a log level and a category. With levels and categories, developers can selectively retrieve messages that they are interested on.
-</p>
-<p id="780622" class="block-content">
-Log levels defined in <tt>System.Util.TLogger</tt> include : <tt>DEBUG</tt>, <tt>INFO</tt>, <tt>NOTICE</tt>, <tt>WARNING</tt>, <tt>ERROR</tt>, <tt>ALERT</tt>, <tt>FATAL</tt>. Messages can be filtered according log level criteria. For example, if a filter specifies <tt>WARNING</tt> and <tt>ERROR</tt> levels, then only those messages that are of <tt>WARNING</tt> and <tt>ERROR</tt> will be returned.
-</p>
-<p id="780623" class="block-content">
-Message categories are hierarchical. A category whose name is the prefix of another is said to be the ancestor category of the other category. For example, <tt>System.Web</tt> category is the ancestor of <tt>System.Web.UI</tt> and <tt>System.Web.UI.WebControls</tt> categories. Messages can be selectively retrieved using such hierarchical category filters. For example, if the category filter is <tt>System.Web</tt>, then all messages in the <tt>System.Web</tt> are returned. In addition, messages in the child categories, such as <tt>System.Web.UI.WebControls</tt>, are also returned.
-</p>
-<p id="780624" class="block-content">
-By convention, the messages logged in the core code of PRADO are categorized according to the namespace of the corresponding classes. For example, messages logged in <tt>TPage</tt> will be of category <tt>System.Web.UI.TPage</tt>.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/MasterContent.page b/demos/quickstart/protected/pages/Advanced/es/MasterContent.page deleted file mode 100755 index f99a64dc..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/MasterContent.page +++ /dev/null @@ -1,57 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5801">Master and Content</h1>
-<p id="750587" class="block-content">
-Pages in a Web application often share common portions. For example, all pages of this tutorial application share the same header and footer portions. If we repeatedly put header and footer in every page source file, it will be a maintenance headache if in future we want to something in the header or footer. To solve this problem, PRADO introduces the concept of master and content. It is essentially a decorator pattern, with content being decorated by master.
-</p>
-<p id="750588" class="block-content">
-Master and content only apply to template controls (controls extending <tt>TTemplateControl</tt> or its child classes). A template control can have at most one master control and one or several contents (each represented by a <tt>TContent</tt> control). Contents will be inserted into the master control at places reserved by <tt>TContentPlaceHolder</tt> controls. And the presentation of the template control is that of the master control with <tt>TContentPlaceHolder</tt> replaced by <tt>TContent</tt>.
-</p>
-<p id="750589" class="block-content">
-For example, assume a template control has the following template:
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_750192">
-<%@ MasterClass="MasterControl" %>
-<com:TContent ID="A" >
-content A
-</com:TContent >
-<com:TContent ID="B" >
-content B
-</com:TContent >
-<com:TContent ID="B" >
-content B
-</com:TContent >
-</com:TTextHighlighter>
-<p id="750590" class="block-content">
-which uses <tt>MasterControl</tt> as its master control. The master control has the following template,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_750193">
-other stuff
-<com:TContentPlaceHolder ID="A" />
-other stuff
-<com:TContentPlaceHolder ID="B" />
-other stuff
-<com:TContentPlaceHolder ID="C" />
-other stuff
-</com:TTextHighlighter>
-<p id="750591" class="block-content">
-Then, the contents are inserted into the master control according to the following diagram, while the resulting parent-child relationship can be shown in the next diagram. Note, the template control discards everything in the template other than the contents, while the master control keeps everything and replaces the content placeholders with the contents according to ID matching.
-</p>
-<img src=<%~ mastercontent.gif %> alt="Master and Content" />
-<img src=<%~ pcrelation.gif %> alt="Parent-child relationship between master and content" />
-
-<h2 id="6301">Master vs. External Template</h2>
-<p id="750592" class="block-content">
-Master is very similar to external templates which are introduced since version 3.0.5. A special <a href="?page=Configurations.Templates1">include tag</a> is used to include an external template file into a base template.
-</p>
-<p id="750593" class="block-content">
-Both master and external template can be used to share common contents among pages. A master is a template control whose template contains the common content and whose class file contains the logic associated with the master. An external template, on the other hand, is a pure template file without any class files.
-</p>
-<p id="750594" class="block-content">
-Therefore, use master control if the common content has to be associated with some logic, such as a page header with search box or login box. A master control allows you to specify how the common content should interact with end users. If you use external templates, you will have to put the needed logic in the page or control class who owns the base template.
-</p>
-<p id="750595" class="block-content">
-Performancewise, external template is lighter than master as the latter is a self-contained control participating the page lifecycles, while the former is used only when the template is being parsed.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Performance.page b/demos/quickstart/protected/pages/Advanced/es/Performance.page deleted file mode 100755 index 7bdd4589..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Performance.page +++ /dev/null @@ -1,88 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6401">Performance Tuning</h1>
-<p id="810678" class="block-content">
-Performance of Web applications is affected by many factors. Database access, file system operations, network bandwidth are all potential affecting factors. PRADO tries in every effort to reduce the performance impact caused by the framework.
-</p>
-
-<h2 id="6402">Caching</h2>
-<p id="810679" class="block-content">
-PRADO provides a generic caching technique used by in several core parts of the framework. For example, when caching is enabled, <tt>TTemplateManager</tt> will save parsed templates in cache and reuse them in the following requests, which saves time for parsing templates. The <tt>TThemeManager</tt> adopts the similar strategy to deal with theme parsing.
-</p>
-<p id="810680" class="block-content">
-Enabling caching is very easy. Simply add the cache module in the application configuration, and PRADO takes care of the rest.
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810229">
-<modules>
- <module id="cache" class="System.Caching.TSqliteCache" />
-</modules>
-</com:TTextHighlighter>
-
-<p id="810681" class="block-content">
-Developers can also take advantage of the caching technique in their applications. The <tt>Cache</tt> property of <tt>TApplication</tt> returns the plugged-in cache module when it is available. To save and retrieve a data item in cache, use the following commands,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_810230">
-if($application->Cache) {
- // saves data item in cache
- $application->Cache->set($keyName,$dataItem);
- // retrieves data item from cache
- $dataItem=$application->Cache->get($keyName);
-}
-</com:TTextHighlighter>
-<p id="810682" class="block-content">
-where <tt>$keyName</tt> should be a string that uniquely identifies the data item stored in cache.
-</p>
-
-<p id="840059" class="block-content">
-Since v3.1.0, a new control called <a href="?page=Controls.OutputCache">TOutputCache</a> has been introduced. This control allows users to selectively cache parts of a page's output. When used appropriately, this technique can significant improve pages' performance because the underlying controls are not created at all if the cached versions are hit.
-</p>
-
-<h2 id="6403">Using <tt>pradolite.php</tt></h2>
-<p id="810683" class="block-content">
-Including many PHP script files may impact application performance significantly. PRADO classes are stored in different files and when processing a page request, it may require including tens of class files.To alleviate this problem, in each PRADO release, a file named <tt>pradolite.php</tt> is also included. The file is a merge of all core PRADO class files with comments being stripped off and message logging removed.
-</p>
-<p id="810684" class="block-content">
-To use <tt>pradolite.php</tt>, in your application entry script, replace the inclusion of <tt>prado.php</tt> with <tt>pradolite.php</tt>.
-</p>
-
-<h2 id="6404">Changing Application Mode</h2>
-<p id="810685" class="block-content">
-Application mode also affects application performance. A PRADO application can be in one of the following modes: <tt>Off</tt>, <tt>Debug</tt>, <tt>Normal</tt> and <tt>Performance</tt>. The <tt>Debug</tt> mode should mainly be used during application development, while <tt>Normal</tt> mode is usually used in early stage after an application is deployed to ensure everything works correctly. After the application is proved to work stably for some period, the mode can be switched to <tt>Performance</tt> to further improve the performance.
-</p>
-<p id="810686" class="block-content">
-The difference between <tt>Debug</tt>, <tt>Normal</tt> and <tt>Performance</tt> modes is that under <tt>Debug</tt> mode, application logs will contain debug information, and under <tt>Performance</tt> mode, timestamp checking is not performed for cached templates and published assets. Therefore, under <tt>Performance</tt> mode, application may not run properly if templates or assets are modified. Since <tt>Performance</tt> mode is mainly used when an application is stable, change of templates or assets are not likely.
-</p>
-<p id="810687" class="block-content">
-To switch application mode, configure it in application configuration:
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810231">
-<application Mode="Performance" >
- ......
-</application >
-</com:TTextHighlighter>
-
-<h2 id="6405">Reducing Page Size</h2>
-<p id="810688" class="block-content">
-By default, PRADO stores page state in hidden fields of the HTML output. The page state could be very large in size if complex controls, such as <tt>TDataGrid</tt>, is used. To reduce the size of the network transmitted page size, two strategies can be used.
-</p>
-<p id="810689" class="block-content">
-First, you may disable viewstate by setting <tt>EnableViewState</tt> to false for the page or some controls on the page if they do not need user interactions. Viewstate is mainly used to keep track of page state when a user interacts with that page/control.
-</p>
-<p id="810690" class="block-content">
-Second, you may use a different page state storage. For example, page state may be stored in session, which essentially stores page state on the server side and thus saves the network transmission time. The <tt>StatePersisterClass</tt> property of the page determines which state persistence class to use. By default, it uses <tt>System.Web.UI.TPageStatePersister</tt> to store persistent state in hidden fields. You may modify this property to a persister class of your own, as long as the new persister class implements the <tt>IPageStatePersister</tt> interface. You may configure this property in several places, such as application configuration or page configuration using <pages> or <page> tags,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810232">
-<pages StatePersisterClass="MyPersister1" ... >
- <page ID="SpecialPage" StatePersisterClass="MyPersister2" ... />
-</pages>
-</com:TTextHighlighter>
-<p id="810691" class="block-content">
-Note, in the above the <tt>SpecialPage</tt> will use <tt>MyPersister2</tt> as its persister class, while the rest pages will use <tt>MyPersister1</tt>. Therefore, you can have different state persister strategies for different pages.
-</p>
-
-<h2 id="6406">Other Techniques</h2>
-<p id="810692" class="block-content">
-Server caching techniques are proven to be very effective in improving the performance of PRADO applications. For example, we have observed that by using Zend Optimizer, the RPS (request per second) of a PRADO application can be increased by more than ten times. Of course, this is at the cost of stale output, while PRADO's caching techniques always ensure the correctness of the output.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Scripts.page b/demos/quickstart/protected/pages/Advanced/es/Scripts.page deleted file mode 100755 index cca6530e..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Scripts.page +++ /dev/null @@ -1,397 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6501">Introduction to Javascript</h1>
-This guide is based on the <a href="http://www.sergiopereira.com/articles/advjs.html">
-Quick guide to somewhat advanced JavaScript tour of some OO features</a> by Sergio Pereira.
-
-<h2 id="6502">Hey, I didn't know you could do that</h2>
-<p id="820693" class="block-content">
- If you are a web developer and come from the same place I do, you have probably
- used quite a bit of Javascript in your web pages, mostly as UI glue.
-</p>
-<p id="820694" class="block-content">
-
- Until recently, I knew that Javascript had more OO capabilities than I was employing,
- but I did not feel like I needed to use it. As the browsers started to support a more
- standardized featureset of Javascript and the DOM, it became viable to write more
- complex and functional code to run on the client. That helped giving birth to the
- AJAX phenomena.
-</p>
-<p id="820695" class="block-content">
- As we all start to learn what it takes to write our cool, AJAX applications, we begin
- to notice that the Javascript we used to know was really just the tip of the iceberg.
- We now see Javascript being used beyond simple UI chores like input validation and frivolous
- tasks. The client code now is far more advanced and layered, much like a real desktop
- application or a client-server thick client. We see class libraries, object models,
- hierarchies, patterns, and many other things we got used to seeing only in our server
- side code.
-</p>
-<p id="820696" class="block-content">
- In many ways we can say that suddenly the bar was put much higher than before. It takes
- a heck lot more proficiency to write applications for the new Web and we need to improve
- our Javascript skills to get there.
- If you try to use many of the existing javascript libraries out there, like
- <a href="http://prototype.conio.net/">Prototype.js</a>,
- <a href="http://script.aculo.us/">Scriptaculous</a>,
- <a href="http://moofx.mad4milk.net/">moo.fx</a>,
- <a href="http://bennolan.com/behaviour/">Behaviour</a>,
- <a href="http://developer.yahoo.net/yui/">YUI</a>,
- etc you'll eventually find yourself reading the JS code. Maybe because you want
- to learn how they do it, or because you're curious, or more often because that's the
- only way to figure out how to use it, since documentation does not seem to be highly
- regarded with most of these libraries. Whatever the case may be, you'll face some
- kung-fu techniques that will be foreign and scary if you haven't seen anything like
- that before.
-</p>
-
-<p id="820697" class="block-content">
- The purpose of this article is precisely explaining the types of constructs that
- many of us are not familiar with yet.
-</p>
-
-
-<h2 id="6503">JSON (JavaScript Object Notation)</h2>
-<p id="820698" class="block-content">
- JavaScript Object Notation (<a href="http://www.json.org/">JSON</a>,) is one of the new
- buzzwords popping up around the AJAX theme. JSON, simply put, is a way of
- declaring an object in Javascript. Let's see an example right away and note
- how simple it is.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820233">
-var myPet = { color: 'black', leg_count: 4, communicate: function(repeatCount){
-for(i=0;i<repeatCount;i++) alert('Woof!');} };
-</com:TTextHighlighter>
-
-<p id="820699" class="block-content">
- Let's just add little bit of formatting so it looks more like how we usually find out there:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820234">
-var myPet =
-{
- color: 'black',
- legCount: 4,
- communicate: function(repeatCount)
- {
- for(i=0;i<repeatCount;i++)
- alert('Woof!');
- }
-};
-</com:TTextHighlighter>
-<p id="820700" class="block-content">
- Here we created a reference to an object with two properties (<tt>color</tt>
- and <tt>legCount</tt>) and a method (<tt>communicate</tt>.)
- It's not hard to figure out that the object's properties and methods
- are defined as a comma delimited list. Each of the members is introduced by name, followed
- by a colon and then the definition. In the case of the properties it is easy, just the value
- of the property. The methods are created by assigning an anonymous function, which we will
- explain better down the line.
- After the object is created and assigned to the variable <tt>myPet</tt>,
- we can use it like this:
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820235">
-alert('my pet is ' + myPet.color);
-alert('my pet has ' + myPet.legCount + ' legs');
-//if you are a dog, bark three times:
-myPet.communicate(3);
-</com:TTextHighlighter>
-<p id="820701" class="block-content">
- You'll see JSON used pretty much everywhere in JS these days, as arguments to functions,
- as return values, as server responses (in strings,) etc.
-</p>
-
-<h2 id="6504">What do you mean? A function is an object too?</h2>
-<p id="820702" class="block-content">
- This might be unusual to developers that never thought about that, but in JS a function is
- also an object. You can pass a function around as an argument to another function just like
- you can pass a string, for example. This is extensively used and very handy.
-</p>
-
-<p id="820703" class="block-content">
- Take a look at this example. We will pass functions to another function that will use them.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820236">
-var myDog =
-{
- bark: function()
- {
- alert('Woof!');
- }
-};
-
-var myCat =
-{
- meow: function()
- {
- alert('I am a lazy cat. I will not meow for you.');
- }
-};
-
-function annoyThePet(petFunction)
-{
- //let's see what the pet can do
- petFunction();
-}
-
-//annoy the dog:
-annoyThePet(myDog.bark);
-//annoy the cat:
-annoyThePet(myCat.meow);
-</com:TTextHighlighter>
-<p id="820704" class="block-content">
- Note that we pass myDog.bark and myCat.meow without appending parenthesis
- <tt>"()"</tt> to them. If we did that we would not be passing
- the function, rather we would be calling the method and passing the return value,
- <tt>undefined</tt> in both cases here.
-</p>
-
-<p id="820705" class="block-content">
- If you want to make my lazy cat start barking, you can easily do this:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820237">
-myCat.meow = myDog.bark;
-myCat.meow(); //alerts 'Woof!'
-</com:TTextHighlighter>
-
-<h2 id="6505">Arrays, items, and object members</h2>
-<p id="820706" class="block-content">
- The following two lines in JS do the same thing.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820238">
-var a = new Array();
-var b = [];
-</com:TTextHighlighter>
-<p id="820707" class="block-content">
- As I'm sure you already know, you can access individual items in an array
- by using the square brackets:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820239">
-var a = ['first', 'second', 'third'];
-var v1 = a[0];
-var v2 = a[1];
-var v3 = a[2];
-</com:TTextHighlighter>
-<p id="820708" class="block-content">
-
- But you are not limited to numeric indices. You can access any member of a JS
- object by using its name, in a string. The following example creates an empty
- object, and adds some members by name.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820240">
-var obj = {}; //new, empty object
-obj['member_1'] = 'this is the member value';
-obj['flag_2'] = false;
-obj['some_function'] = function(){ /* do something */};
-</com:TTextHighlighter>
-<p id="820709" class="block-content">
- The above code has identical effect as the following:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820241">
-var obj =
-{
- member_1:'this is the member value',
- flag_2: false,
- some_function: function(){ /* do something */}
-};
-</com:TTextHighlighter>
-
-<p id="820710" class="block-content">
- In many ways, the idea of objects and associative arrays (hashes) in JS are not
- distiguishable. The following two lines do the same thing too.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820242">
-obj.some_function();
-obj['some_function']();
-</com:TTextHighlighter>
-
-
-<h2 id="6506">Enough about objects, may I have a class now?</h2>
-<p id="820711" class="block-content">
-
- The great power of object oriented programming languages derive from the use
- of classes. I don't think I would have guessed how classes are defined in JS
- using only my previous experience with other languages. Judge for yourself.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820243">
-//defining a new class called Pet
-var Pet = function(petName, age)
-{
- this.name = petName;
- this.age = age;
-};
-
-//let's create an object of the Pet class
-var famousDog = new Pet('Santa\'s Little Helper', 15);
-alert('This pet is called ' + famousDog.name);
-</com:TTextHighlighter>
-<p id="820712" class="block-content">
- Let's see how we add a method to our <tt>Pet</tt> class. We will be using the
- <tt>prototype</tt> property that all classes have. The <tt>prototype</tt>
- property is an object that contains all the members that any object of the class will have.
- Even the default JS classes, like <tt>String</tt>, <tt>Number</tt>,
- and <tt>Date</tt> have a <tt>prototype</tt> object that we
- can add methods and properties to and make any object of that class automatically gain this new member.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820244">
-Pet.prototype.communicate = function()
-{
- alert('I do not know what I should say, but my name is ' + this.name);
-};
-</com:TTextHighlighter>
-<p id="820713" class="block-content">
- That's when a library like <a href="http://www.sergiopereira.com/articles/prototype.js.html">prototype.js</a> comes in
- handy. If we are using prototype.js, we can make our code look cleaner (at least in my opinion.)
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820245">
-var Pet = Class.create();
-Pet.prototype =
-{
- //our 'constructor'
- initialize: function(petName, age)
- {
- this.name = petName;
- this.age = age;
- },
-
- communicate: function()
- {
- alert('I do not know what I should say, but my name is ' + this.name);
- }
-};
-</com:TTextHighlighter>
-
-<h2 id="6507">Functions as arguments, an interesting pattern</h2>
-<p id="820714" class="block-content">
- If you have never worked with languages that support closures
- you may find the following idiom too funky.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820246">
-var myArray = ['first', 'second', 'third'];
-myArray.each( function(item, index)
-{
- alert('The item in the position #' + index + ' is:' + item);
-});
-</com:TTextHighlighter>
-<p id="820715" class="block-content">
-
- Whoa! Let's explain what is going on here before you decide I've gone too
- far and navigate to a better article than this one.
-</p>
-<p id="820716" class="block-content">
- First of all, in the above example we are using the prototype.js library, which
- adds the each function to the Array class. The each function accepts one
- argument that is a function object. This function, in turn, will be called once
- for each item in the array, passing two arguments when called, the item and the index
- for the current item. Let's call this function our iterator function.
- We could have also written the code like this.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820247">
-function myIterator(item, index)
-{
- alert('The item in the position #' + index + ' is:' + item);
-}
-
-var myArray = ['first', 'second', 'third'];
-myArray.each( myIterator );
-</com:TTextHighlighter>
-<p id="820717" class="block-content">
- But then we would not be doing like all the cool kids in school, right?
- More seriously, though, this last format is simpler to understand but causes
- us to jump around in the code looking for the myIterator function. It's nice
- to have the logic of the iterator function right there in the same place
- it's called. Also, in this case, we will not need the iterator function anywhere
- else in our code, so we can transform it into an anonymous function without penalty.
-</p>
-
-<h2 id="6508">This is <tt>this</tt> but sometimes <tt>this</tt> is also that</h2>
-<p id="820718" class="block-content">
-
- One of the most common troubles we have with JS when we start writing our code
- it the use of the <tt>this</tt> keyword. It could be a real
- tripwire.
-</p>
-<p id="820719" class="block-content">
- As we mentioned before, a function is also an object in JS, and sometimes we
- do not notice that we are passing a function around.
-</p>
-<p id="820720" class="block-content">
- Take this code snippet as an example.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820248">
-function buttonClicked()
-{
- alert('button ' + this.id + ' was clicked');
-}
-
-var myButton = document.getElementById('someButtonID');
-var myButton2 = document.getElementById('someOtherButtonID');
-myButton.onclick = buttonClicked;
-myButton2.onclick = buttonClicked;
-</com:TTextHighlighter>
-<p id="820721" class="block-content">
- Because the buttonClicked function is defined outside any object we may tend to
- think the <tt>this</tt> keyword will contain a reference to
- the <tt>window</tt> or <tt>document</tt>
- object (assuming this code is in the middle of an HTML page viewed in a browser.)
-</p>
-
-<p id="820722" class="block-content">
- But when we run this code we see that it works as intended and displays the <tt>id</tt> of
- the clicked button. What happened here is that we made the onclick method of each button contain the
- <tt>buttonClicked</tt> object reference, replacing whatever was there before. Now
- whenever the button is clicked, the browser will execute something similar to the following line.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820249">
-myButton.onclick();
-</com:TTextHighlighter>
-<p id="820723" class="block-content">
-
- That isn't so confusing afterall, is it? But see what happens you start having other
- objects to deal with and you want to act on these object upon events like the button's click.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820250">
-var myHelper =
-{
- formFields: [ ],
- emptyAllFields: function()
- {
- for(i=0; i < this.formFields.length; i++)
- {
- var elementID = this.formFields[i];
- var field = document.getElementById(elementID);
- field.value = '';
- }
- }
-};
-
-//tell which form fields we want to work with
-myHelper.formFields.push('txtName');
-myHelper.formFields.push('txtEmail');
-myHelper.formFields.push('txtAddress');
-
-//clearing the text boxes:
-myHelper.emptyAllFields();
-
-var clearButton = document.getElementById('btnClear');
-clearButton.onclick = myHelper.emptyAllFields;
-</com:TTextHighlighter>
-<p id="820724" class="block-content">
- So you think, nice, now I can click the Clear button on my page and those three text boxes
- will be emptied. Then you try clicking the button only to get a runtime error. The error
- will be related to (guess what?) the <tt>this</tt> keyword.
- The problem is that <tt>this.formFields</tt> is not defined if
- <tt>this</tt> contains a referece to the button, which is
- precisely what's happening. One quick solution would be to rewrite our last line of code.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820251">
-clearButton.onclick = function()
-{
- myHelper.emptyAllFields();
-};
-</com:TTextHighlighter>
-<p id="820725" class="block-content">
- That way we create a brand new function that calls our helper method within the helper object's context.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Scripts1.page b/demos/quickstart/protected/pages/Advanced/es/Scripts1.page deleted file mode 100755 index 96ab7760..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Scripts1.page +++ /dev/null @@ -1,96 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6601">Developer Notes for prototype.js</h1>
-This guide is based on the <a href="http://www.sergiopereira.com/articles/prototype.js.html">
-Developer Notes for prototype.js</a> by Sergio Pereira.
-
-<h2 id="6603">What is that?</h2>
-<p id="830726" class="block-content">
-In case you haven't already used it, <a href="http://prototype.conio.net">prototype.js</a> is a
- JavaScript library written by <a href="http://www.conio.net">Sam Stephenson</a>.
- This amazingly well thought and well written piece of <b>standards-compliant</b> code takes a lot of
- the burden associated with creating rich, highly interactive web pages that characterize the Web 2.0 off your back.
-</p>
-
-<p id="830727" class="block-content">
- If you tried to use this library recently, you probably noticed that documentation is not one
- of its strongest points. As many other developers before me, I got my head around prototype.js by
- reading the source code and experimenting with it. I thought it would be nice to take notes while
- I learned and share with everybody else.
-</p>
-<p id="830728" class="block-content">
- As you read the examples and the reference, developers familiar with the Ruby
- programming language will notice an intentional similarity between Ruby's
- built-in classes and many of the extensions implemented by this library.
-</p>
-
-
-<h2 id="6604">Using the <tt>$()</tt> function</h2>
-<p id="830729" class="block-content">
- The <tt>$()</tt> function is a handy shortcut to the all-too-frequent <tt>document.getElementById()</tt> function
- of the DOM. Like the DOM function, this one returns the element that has the id passed as an argument.
-</p>
-
-<p id="830730" class="block-content">
- Unlike the DOM function, though, this one goes further. You can pass more than one id and
- <tt>$()</tt> will return an <tt>Array</tt> object with
- all the requested elements. The example below should illustrate this.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830252">
-<com:TClientScript UsingClientScripts="prado" />
-<div id="myDiv">
- <p id="830731" class="block-content">This is a paragraph</p>
-</div>
-
-<div id="myOtherDiv">
- <p id="830732" class="block-content">This is another paragraph</p>
-</div>
-
-<input type="button" value=Test1 onclick="test1();" />
-<input type="button" value=Test2 onclick="test2();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test1()
-{
- var d = $('myDiv');
- alert(d.innerHTML);
-}
-
-function test2()
-{
- var divs = $('myDiv','myOtherDiv');
- for(i=0; i<divs.length; i++)
- {
- alert(divs[i].innerHTML);
- }
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-<p id="830733" class="block-content">
- Another nice thing about this function is that you can pass either the <tt>id</tt> string or the element object itself,
- which makes this function very useful when creating other functions that can also take either form of argument.
-</p>
-
-<h2 id="6605">Using the <tt>$F()</tt> function</h2>
-
-<p id="830734" class="block-content">
- The <tt>$F()</tt> function is a another welcome shortcut. It returns the value of any field input control,
- like text boxes or drop-down lists. The function can take as argument either the element <tt>id</tt> or the element object itself.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830253">
-<input type="text" id="userName" value="Joe Doe" />
-<input type="button" value=Test3 onclick="test3();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test3()
-{
- alert($F('userName'));
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Scripts2.page b/demos/quickstart/protected/pages/Advanced/es/Scripts2.page deleted file mode 100755 index 5d88b065..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Scripts2.page +++ /dev/null @@ -1,253 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6701">DOM Events and Javascript</h1>
-
-<h2 id="6702">Basic event handling</h2>
-
-<p id="840735" class="block-content">The syntax for working with events looks like the code below.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840254">
-Event.observe(element, name, observer, [useCapture]);
-</com:TTextHighlighter>
-
-<p id="840736" class="block-content">Assuming for a moment that we want to observe when a link was clicked,
-we could do the following:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840255">
-// <a id="clicker" href="http://foo.com">Click me</a>
-Event.observe('clicker', 'click', function(event)
-{
- alert('clicked!');
-});
-</com:TTextHighlighter>
-
-<p id="840737" class="block-content">If we wanted to get the element that fired the event, we'd do this:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840256">
-Event.observe('clicker', 'click', function(event)
-{
- alert(Event.element(event));
-});
-</com:TTextHighlighter>
-
-<h2 id="6703">Observing keystrokes</h2>
-
-<p id="840738" class="block-content">If we wanted to observe keystrokes for the entire document, we could do the following:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840257">
-Event.observe(document, 'keypress', function(event)
-{
- if(Event.keyCode(event) == Event.KEY_TAB)
- alert('Tab Pressed');
-});
-</com:TTextHighlighter>
-
-<p id="840739" class="block-content">And lets say we wanted to keep track of what has been typed :</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840258">
-Event.observe('search', 'keypress', function(event)
-{
- Element.update('search-results', $F(Event.element(event)));
-});
-</com:TTextHighlighter>
-
-<p id="840740" class="block-content">Prototype defines properties inside the event object for some
-of the more common keys, so feel free to dig around in Prototype to
-see which ones those are.</p>
-
-<p id="840741" class="block-content">A final note on keypress events; If you'd like to detect a
-left click you can use <tt>Event.isLeftClick(event)</tt>.</p>
-
-<h2 id="6704">Getting the coordinates of the mouse pointer</h2>
-
-<p id="840742" class="block-content">Drag and drop, dynamic element resizing, games, and
-much more all require the ability to track the X and Y location of
-the mouse. Prototype makes this fairly simple. The code below tracks
-the X and Y position of the mouse and spits out those values into
-an input box named mouse.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840259">
-Event.observe(document, 'mousemove', function(event)
-{
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
-});
-</com:TTextHighlighter>
-
-<p id="840743" class="block-content">If we wanted to observe the mouse location when it was
-hovering over a certain element, we'd just change the document argument to
-the id or element that was relevant.</p>
-
-<h2 id="6705">Stopping Propagation</h2>
-
-<p id="840744" class="block-content"><tt>Event.stop(event)</tt> will stop the propagation of an event .</p>
-
-<h2 id="6706">Events, Binding, and Objects</h2>
-
-<p id="840745" class="block-content">Everything has been fairly straight forward so far, but things
-start getting a little trickier when you need to work with events in
-and object-oriented environment. You have to deal with binding and funky
-looking syntax that might take a moment to get your head around.</p>
-
-<p id="840746" class="block-content">Lets look at some code so you can get a better understanding of what I'm talking about.</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840260">
-EventDispenser = Class.create();
-EventDispenser.prototype =
-{
- initialize: function(list)
- {
- this.list = list;
-
- // Observe clicks on our list items
- $$(this.list + " li").each(function(item)
- {
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
- }.bind(this));
-
- // Observe when a key on the keyboard is pressed.
- // In the observer, we check for
- // the tab key and alert a message if it is pressed.
- Event.observe(document, 'keypress', this.onKeyPress.bindEvent(this));
-
- // Observe our fake live search box. When a user types
- // something into the box, the observer will take that
- // value(-1) and update our search-results div with it.
- Event.observe('search', 'keypress', this.onSearch.bindEvent(this));
-
- Event.observe(document, 'mousemove', this.onMouseMove.bindEvent(this));
- },
-
- // Arbitrary functions to respond to events
- showTagName: function(event)
- {
- alert(Event.element(event).tagName);
- },
-
- onKeyPress: function(event)
- {
- var code = event.keyCode;
- if(code == Event.KEY_TAB)
- alert('Tab key was pressed');
- },
-
- onSearch: function(event)
- {
- Element.update('search-results', $F(Event.element(event)));
- },
-
- onMouseMove: function(event)
- {
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
- }
-}
-</com:TTextHighlighter>
-<p id="840747" class="block-content">Whoa! What's going on here? Well, we've defined our a
-custom class <tt>EventDispenser</tt>. We're going to be using this class
-to setup events for our document. Most of this code is a
-rewrite of the code we looked at earlier except this time, we
-are working from inside an object.</p>
-
-<p id="840748" class="block-content">Looking at the <tt>initialize</tt> method, we can really see how
-things are different now. Take a look at the code below:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840261">
-// Observe clicks on our list items
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840749" class="block-content">We've got iterators, binding and all sorts of stuff going on.
-Lets break down what this chunk of code is doing.</p>
-
-<p id="840750" class="block-content">First we are hunting for a collection of elements based on
-it's CSS selector. This uses the Prototype selector function <tt>$$()</tt>.
-After we've found the list items we are dealing with we send
-those into an each iteration where we will add our observers.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840262">
-Event.observe(item, 'click', this.showTagName.bindEvent(this));
-</com:TTextHighlighter>
-
-<p id="840751" class="block-content">Now looking at the code above, you'll notice the <tt>bindEvent</tt> function.
-This takes the method before it <tt>showTagName</tt> and treats it as the
-method that will be triggered when, in this case,
-someone clicks one of our list items.</p>
-
-<p id="840752" class="block-content">You'll also notice we pass this as an argument to the <tt>bindEvent</tt> function.
-This simply allows us to reference the object in context <tt>EventDispenser</tt>
-inside our function <tt>showTagName(event)</tt>. If the <tt>showTagName</tt> function
-requires additional parameters, you can attach them to the later parameters of <tt>bindEvent</tt>. For example</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840263">
-this.showTagName.bindEvent(this, param1, param2);
-
-//where the showTagName function is defined as
-showTime : function (event, param1, param2) { ... }
-</com:TTextHighlighter>
-
-<p id="840753" class="block-content">Moving on, you'll see <tt>bind(this)</tt> attached to our iterator function.
-This really has nothing to do with events, it is only here to allow me to
-use <tt>this</tt> inside the iterator. If we did not use <tt>bind(this)</tt>, I could not
-reference the method <tt>showTagName</tt> inside the iterator.</p>
-
-<p id="840754" class="block-content">Ok, so we'll move on to looking at our methods that actually get
-called when an event occurs. Since we've been dealing with <tt>showTagName</tt>, lets look at it.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840264">
-showTagName: function(event)
-{
- alert(Event.element(event).tagName);
-}
-</com:TTextHighlighter>
-
-<p id="840755" class="block-content">As you can see, this function accepts one argument--the event.
-In order for us to get the element which fired the event we need to
-pass that argument to <tt>Event.element</tt>. Now we can manipulate it at will.</p>
-
-<p id="840756" class="block-content">This covers the most confusing parts of our code. The text above is also
-relevant to the remaining parts of our code. If there is anything about
-this you don't understand, feel free to ask questions in the forum.</p>
-
-<h2 id="6707">Removing Event Listeners</h2>
-
-<p id="840757" class="block-content">This one threw me for a loop the first time I tried to use it.
-I tried something similar to what I did in the <tt>Event.observe</tt>
-call with the exception of using <tt>stopObserving</tt>, but nothing seemed
-to change. In other words, the code below does <b>NOT</b> work.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840265">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagName);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840758" class="block-content">What's the deal here? The reason this does not work is because there
-is no pointer to the observer. This means that when we passed <tt>this.showTagName</tt>
-in the <tt>Event.observe</tt> method before hand, we passed it as an
-anonymous function. We can't reference an anonymous function
-because it simply does not have a pointer.</p>
-
-<p id="840759" class="block-content">So how do we get the job done? All we need to do is give the
-observing function a pointer, or the jargon free version: Set a variable
-that points to <tt>this.showTagName</tt>. Ok, lets change our code a bit.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840266">
-this.showTagObserver = this.showTagName.bindEvent(this);
-
-// Observe clicks on our list items
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840760" class="block-content">Now we can remove the event listeners from our list like this:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840267">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Scripts3.page b/demos/quickstart/protected/pages/Advanced/es/Scripts3.page deleted file mode 100755 index 37885abb..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Scripts3.page +++ /dev/null @@ -1,39 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6801">Javascript in PRADO, Questions and Answers</h1>
-<h2 id="6802">How do I include the Javascript libraries distributed with Prado?</h2>
-<p id="880060" class="block-content">The javascript libraries distributed with Prado can be found in the
-<tt>framework/Web/Javascripts/source</tt> directory. The <tt>packages.php</tt>
-file in that directory defines a list of available package names available
-to be loaded. They can be loaded as follows.
-</p>
-<ul id="u1" class="block-content"><li>Adding libraries in the template
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_850268">
-<com:TClientScript PradoScripts="effects" />
-</com:TTextHighlighter>
- </li>
- <li>Adding libraries in PHP code
- <com:TTextHighlighter Language="php" CssClass="source block-content" id="code_850269">
-$this->getPage()->getClientScript()->registerPradoScript("effects");
- </com:TTextHighlighter>
- </li>
-</ul>
-The available packaged libraries included in Prado are
-<ul id="u2" class="block-content">
- <li><tt>prado</tt> : basic PRADO javascript framework based on Prototype</li>
- <li><tt>effects</tt> : visual effects from script.aculo.us</li>
- <li><tt>ajax</tt> : ajax and callback related based on Prototype</li>
- <li><tt>validator</tt> : validation</li>
- <li><tt>logger</tt> : javascript logger and object browser</li>
- <li><tt>datepicker</tt> : datepicker</li>
- <li><tt>colorpicker</tt> : colorpicker</li>
-</ul>
-
-<p id="850761" class="block-content">The dependencies for each library are automatically resolved. Components
-that require a particular library will also automatically load the necessary libraries.
-For example, if you add a <tt>TDatePicker</tt> component on the page, the <tt>datepicker</tt>
-and its dependencies will be automatically included on the page.</p>
-
-<p id="850762" class="block-content">See <a href="?page=Controls.ClientScript">TClientScript</a> for options of adding
- your custom Javascript code to the page.</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Security.page b/demos/quickstart/protected/pages/Advanced/es/Security.page deleted file mode 100755 index c3d0b511..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Security.page +++ /dev/null @@ -1,79 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5601">Security</h1>
-
-<h2 id="5602">Viewstate Protection</h2>
-<p id="730563" class="block-content">
-Viewstate lies at the heart of PRADO. Viewstate represents data that can be used to restore pages to the state that is last seen by end users before making the current request. By default, PRADO uses hidden fields to store viewstate information.
-</p>
-<p id="730564" class="block-content">
-It is extremely important to ensure that viewstate is not tampered by end users. Without protection, malicious users may inject harmful code into viewstate and unwanted instructions may be performed when page state is being restored on server side.
-</p>
-<p id="730565" class="block-content">
-To prevent viewstate from being tampered, PRADO enforces viewstate HMAC (Keyed-Hashing for Message Authentication) check before restoring viewstate. Such a check can detect if the viewstate has been tampered or not by end users. Should the viewstate is modified, PRADO will stop restoring the viewstate and return an error message.
-</p>
-<p id="730566" class="block-content">
-HMAC check requires a private key that should be secret to end users. Developers can either manually specify a key or let PRADO automatically generate a key. Manually specified key is useful when the application runs on a server farm. To do so, configure <tt>TSecurityManager</tt> in application configuration,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_730186">
-<modules>
- <module id="security"
- class="TSecurityManager"
- ValidationKey="my private key" />
-</modules>
-</com:TTextHighlighter>
-<p id="730567" class="block-content">
-HMAC check does not prevent end users from reading the viewstate content. An added security measure is to encrypt the viewstate information so that end users cannot decipher it. To enable viewstate encryption, set the <tt>EnableStateEncryption</tt> of pages to true. This can be done in <a href="?page=Configurations.PageConfig">page configurations</a> or in page code. Note, encrypting viewstate may degrade the application performance. A better strategy is to store viewstate on the server side, rather than the default hidden field.
-</p>
-
-<h2 id="5603">Cross Site Scripting Prevention</h2>
-<p id="730568" class="block-content">
-Cross site scripting (also known as XSS) occurs when a web application gathers malicious data from a user. Often attackers will inject JavaScript, VBScript, ActiveX, HTML, or Flash into a vulnerable application to fool other application users and gather data from them. For example, a poorly design forum system may display user input in forum posts without any checking. An attacker can then inject a piece of malicious JavaScript code into a post so that when other users read this post, the JavaScript runs unexpectedly on their computers.
-</p>
-<p id="730569" class="block-content">
-One of the most important measures to prevent XSS attacks is to check user input before displaying them. One can do HTML-encoding with the user input to achieve this goal. However, in some situations, HTML-encoding may not be preferable because it disables all HTML tags.
-</p>
-<p id="730570" class="block-content">
-PRADO incorporates the work of <a href="http://pixel-apes.com/safehtml/">SafeHTML</a> and provides developers with a useful component called <tt>TSafeHtml</tt>. By enclosing content within a <tt>TSafeHtml</tt> component tag, the enclosed content are ensured to be safe to end users. In addition, the commonly used <tt>TTextBox</tt> has a <tt>SafeText</tt> property which contains user input that are ensured to be safe if displayed directly to end users.
-</p>
-
-<h2 id="5604">Cookie Attack Prevention</h2>
-<p id="730571" class="block-content">
-Protecting cookies from being attacked is of extreme important, as session IDs are commonly stored in cookies. If one gets hold of a session ID, he essentially owns all relevant session information.
-</p>
-<p id="730572" class="block-content">
-There are several countermeasures to prevent cookies from being attacked.
-</p>
-<ul id="u1" class="block-content">
- <li>An application can use SSL to create a secure communication channel and only pass the authentication cookie over an HTTPS connection. Attackers are thus unable to decipher the contents in the transferred cookies.</li>
- <li>Expire sessions appropriately, including all cookies and session tokens, to reduce the likelihood of being attacked.</li>
- <li>Prevent cross-site scripting (XSS) which causes arbitrary code to run in a user's browser and expose his cookies.</li>
- <li>Validate cookie data and detect if they are altered.</li>
-</ul>
-<p id="730573" class="block-content">
-PRADO implements a cookie validation scheme that prevents cookies from being modified. In particular, it does HMAC check for the cookie values if cookie validation is enable.
-</p>
-<p id="730574" class="block-content">
-Cookie validation is disabled by default. To enable it, configure the <tt>THttpRequest</tt> module as follows,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_730187">
-<modules>
- <module id="request" class="THttpRequest" EnableCookieValidation="true" />
-</modules>
-</com:TTextHighlighter>
-<p id="730575" class="block-content">
-To make use of cookie validation scheme provided by PRADO, you also need to retrieve cookies through the <tt>Cookies</tt> collection of <tt>THttpRequest</tt> by using the following PHP statements,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_730188">
-foreach($this->Request->Cookies as $cookie)
- // $cookie is of type THttpCookie
-</com:TTextHighlighter>
-<p id="730576" class="block-content">
-To send cookie data encoded with validation information, create new <tt>THttpCookie</tt> objects and add them to the <tt>Cookies</tt> collection of <tt>THttpResponse</tt>,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_730189">
-$cookie=new THttpCookie($name,$value);
-$this->Response->Cookies[]=$cookie;
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/State.page b/demos/quickstart/protected/pages/Advanced/es/State.page deleted file mode 100755 index c43a9dff..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/State.page +++ /dev/null @@ -1,54 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6001">Persistent State</h1>
-<p id="770606" class="block-content">
-Web applications often need to remember what an end user has done in previous page requests so that the new page request can be served accordingly. State persistence is to address this problem. Traditionally, if a page needs to keep track of user interactions, it will resort to session, cookie, or hidden fields. PRADO provides a new line of state persistence schemes, including view state, control state, and application state.
-</p>
-
-<h2 id="6002">View State</h2>
-<p id="770607" class="block-content">
-View state lies at the heart of PRADO. With view state, Web pages become stateful and are capable of restoring pages to the state that end users interacted with before the current page request. Web programming thus resembles to Windows GUI programming, and developers can think continuously without worrying about the round trips between end users and the Web server. For example, with view state, a textbox control is able to detect if the user input changes the content in the textbox.
-</p>
-<p id="770608" class="block-content">
-View state is only available to controls. View state of a control can be disabled by setting its <tt>EnableViewState</tt> property to false. To store a variable in view state, call the following,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770197">
-$this->setViewState('Caption',$caption);
-</com:TTextHighlighter>
-<p id="770609" class="block-content">
-where <tt>$this</tt> refers to the control object, <tt>Caption</tt> is a unique key identifying the <tt>$caption</tt> variable stored in viewstate. To retrieve the variable back from view state, call the following,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770198">
-$caption = $this->getViewState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6003">Control State</h2>
-<p id="770610" class="block-content">
-Control state is like view state in every aspect except that control state cannot be disabled. Control state is intended to be used for storing crucial state information without which a page or control may not work properly.
-</p>
-<p id="770611" class="block-content">
-To store and retrieve a variable in control state, use the following commands,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770199">
-$this->setControlState('Caption',$caption);
-$caption = $this->getControlState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6004">Application State</h2>
-<p id="770612" class="block-content">
-Application state refers to data that is persistent across user sessions and page requests. A typical example of application state is the user visit counter. The counter value is persistent even if the current user session terminates. Note, view state and control state are lost if the user requests for a different page, while session state is lost if the user session terminates.
-</p>
-<p id="770613" class="block-content">
-To store and retrieve a variable in application state, use the following commands,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770200">
-$application->setGlobalState('Caption',$caption);
-$caption = $application->getGlobalState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6005">Session State</h2>
-<p id="770614" class="block-content">
-PRADO encapsulates the traditional session management in <tt>THttpSession</tt> module. The module can be accessed from within any component by using <tt>$this->Session</tt>, where <tt>$this</tt> refers to the component object.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/Themes.page b/demos/quickstart/protected/pages/Advanced/es/Themes.page deleted file mode 100755 index 4e440ce5..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/Themes.page +++ /dev/null @@ -1,60 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5901">Themes and Skins</h1>
-
-<h2 id="5902">Introduction</h2>
-<p id="760596" class="block-content">
-Themes in PRADO provide a way for developers to provide a consistent look-and-feel across an entire web application. A theme contains a list of initial values for properties of various control types. When applying a theme to a page, all controls on that page will receive the corresponding initial property values from the theme. This allows themes to interact with the rich property sets of the various PRADO controls, meaning that themes can be used to specify a large range of presentational properties that other theming methods (e.g. CSS) cannot. For example, themes could be used to specify the default page size of all data grids across an application by specifying a default value for the <tt>PageSize</tt> property of the <tt>TDataGrid</tt> control.
-</p>
-
-<h2 id="5903">Understanding Themes</h2>
-<p id="760597" class="block-content">
-A theme is a directory consists of skin files, javascript files and CSS files. Any javascript or CSS files contained in a theme will be registered with the page that the theme is applied to. A skin is a set of initial property values for a particular control type. A control type may have one or several skins, each identified by a unique <tt>SkinID</tt>. When applying a theme to a page, a skin is applied to a control if the control type and the <tt>SkinID</tt> value both match to those of the skin. Note, if a skin has an empty <tt>SkinID</tt> value, it will apply to all controls of the particular type whose <tt>SkinID</tt> is not set or empty. A skin file consists of one or several skins, for one or several control types. A theme is the union of skins defined in all skin files.
-</p>
-
-<h2 id="5904">Using Themes</h2>
-<p id="760598" class="block-content">
-To use a theme, you need to set the <tt>Theme</tt> property of the page with the theme name, which is the theme directory name. You may set it in either <a href="?page=Configurations.PageConfig">page configurations</a> or in the constructor or <tt>onPreInit()</tt> method of the page. You cannot set the property after <tt>onPreInit()</tt> because by that time, child controls of the page are already created (skins must be applied to controls right after they are created.)
-</p>
-<p id="760599" class="block-content">
-To use a particular skin in the theme for a control, set <tt>SkinID</tt> property of the control in template like following,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_760194">
-<com:TButton SkinID="Blue" ... />
-</com:TTextHighlighter>
-<p id="760600" class="block-content">
-This will apply the 'Blue' skin to the button. Note, the initial property values specified by the 'Blue' skin will overwrite any existing property values of the button. Use stylesheet theme if you do not want them to be overwritten. To use stylesheet theme, set the <tt>StyleSheetTheme</tt> property of the page instead of <tt>Theme</tt> (you can have both <tt>StyleSheetTheme</tt> and <tt>Theme</tt>).
-</p>
-<p id="760601" class="block-content">
-To use the Javascript files and CSS files contained in a theme, a <tt>THead</tt> control must be placed on the page template. This is because the theme will register those files with the page and <tt>THead</tt> is the right place to load those files.
-</p>
-<p id="760602" class="block-content">
-It is possible to specify media types of CSS files contained in a theme. By default, a CSS file applies to all media types. If the CSS file is named like <tt>mystyle.print.css</tt>, it will be applied only to <tt>print</tt> media type. As another example, <tt>mystyle.screen.css</tt> applies to <tt>screen</tt> media only, and <tt>mystyle.css</tt> applies to all media types.
-</p>
-
-<h2 id="5905">Theme Storage</h2>
-<p id="760603" class="block-content">
-All themes by default must be placed under the <tt>[AppEntryPath]/themes</tt> directory, where <tt>AppEntryPath</tt> refers to the directory containing the application entry script. If you want to use a different directory, configure the <tt>BasePath</tt> and <tt>BaseUrl</tt> properties of the <tt>System.Web.UI.TThemeManager</tt> module in application configuration,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_760195">
-<service id="page" class="TPageService">
- <modules>
- <module id="theme"
- class="System.Web.UI.TThemeManager"
- BasePath="mythemes"
- BaseUrl="mythemes" />
- </modules>
-</service>
-</com:TTextHighlighter>
-
-<h2 id="5906">Creating Themes</h2>
-<p id="760604" class="block-content">
-Creating a theme involves creating the theme directory and writing skin files (and possibly Javascript and CSS files). The name of skin files must be terminated with <tt>.skin</tt>. The format of skin files are the same as that of control template files. Since skin files do not define parent-child presentational relationship among controls, you cannot place a component tag within another. And any static texts between component tags are discarded. To define the aforementioned 'Blue' skin for <tt>TButton</tt>, write the following in a skin file,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_760196">
-<com:TButton SkinID="Blue" BackColor="blue" />
-</com:TTextHighlighter>
-<p id="760605" class="block-content">
-As aforementioned, you can put several skins within a single skin file, or split them into several files. A commonly used strategy is that each skin file only contains skins for one type of controls. For example, <tt>Button.skin</tt> would contain skins only for the <tt>TButton</tt> control type.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/es/exception.gif b/demos/quickstart/protected/pages/Advanced/es/exception.gif Binary files differdeleted file mode 100755 index 93b1a07f..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/exception.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/es/exception2.gif b/demos/quickstart/protected/pages/Advanced/es/exception2.gif Binary files differdeleted file mode 100755 index 5fe0e625..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/exception2.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/es/logrouter.gif b/demos/quickstart/protected/pages/Advanced/es/logrouter.gif Binary files differdeleted file mode 100755 index 5a74dfe1..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/logrouter.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/es/mastercontent.gif b/demos/quickstart/protected/pages/Advanced/es/mastercontent.gif Binary files differdeleted file mode 100755 index 9354d65c..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/mastercontent.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/es/pcrelation.gif b/demos/quickstart/protected/pages/Advanced/es/pcrelation.gif Binary files differdeleted file mode 100755 index c1960d74..00000000 --- a/demos/quickstart/protected/pages/Advanced/es/pcrelation.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/id/Assets.page b/demos/quickstart/protected/pages/Advanced/id/Assets.page deleted file mode 100755 index b34426ea..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Assets.page +++ /dev/null @@ -1,69 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5701">Assets</h1>
-<p id="740577" class="block-content">
-Asset adalah file sumber daya (seperti gambar, suara, video, CSS stylesheet, javascript, dll.) yang dimiliki oleh kelas komponen tertentu. Assets disediakan bagi para pengguna Web. Untuk kegunaan dan kemudahan penyebaran kelas komponen terkait, asset harus berada bersama dengan file kelas komponen. Sebagai contoh, tombol toggle dapat memakai dua gambar, disimpan dalam file <tt>down.gif</tt> dan <tt>up.gif</tt>, untuk menampilkan kondisi toggle berbeda. Jika kita ingin file gambar disimpan di bawah direktori <tt>images</tt> di bawah akar dokumen server Web, tidak akan memembuat nyaman bagi para pengguna komponen tombol toggle, karena setiap kali mereka mengembangkan atau menyebarkan aplikasi baru, mereka harus meng-copy file gambar ke direktori tertentu itu secara manual. Untuk mengeliminir persyaratan ini, direktori relatif ke file kelas komponen harus digunakan untuk menyimpan file gambar. Strategi umum adalah menggunakan direktori yang berisi file kelas komponen untuk menyimpan file asset.
-</p>
-<p id="740578" class="block-content">
-Karena direktori yang berisi file kelas komponen biasanya tidak bisa diakses oleh pengguna Web, PRADO menerapkan skema penerbitan asset untuk menjadikan assets tersedia bagi para pengguna Web. Sebuah asset, setelah diterbitkan, akan mempunyai URL di mana para pengguna bisa mengambil file asset.
-</p>
-
-<h2 id="5702">Penerbitan Asset</h2>
-<p id="740579" class="block-content">
-PRADO menyediakan beberapa metode untuk penerbitan asset atau direktori yang berisi asset:
-</p>
-<ul id="u1" class="block-content">
-<li>Dalam file template, Anda dapat menggunakan <a href="?page=Configurations.Templates2#at">tag asset</a> guna menerbitkan asset dan mendapatkan URL-nya. Catatan, asset harus relatif ke direktori yang berisi file template.</li>
-<li>Dalam kode PHP, Anda dapat memanggil <tt>$object->publishAsset($assetPath)</tt> untuk menerbitkan asset dan mendapatkan URL-nya. <tt>$object</tt> di sini merujuk ke turunan <tt>TApplicationComponent</tt> atau kelas asalnya, dan <tt>$assetPath</tt> adalah file atau direktori relatif ke direktori yang berisi file kelas.</li>
-<li>Jika Anda ingin menerbitkan asset sesuka hati, Anda perlu memanggil <tt>TAssetManager::publishFilePath($path)</tt>.</li>
-</ul>
-<p id="740580" class="block-content">
-HATI-HATI: Berhati-hatilah dengan penerbitan asset, karena ia memberikan para pengguna Web mengakses ke file yang sebelumnya tidak dapat diakses. Pastikan bahwa Anda tidak menerbitkan file yang tidak ingin dilihat pengguna lain.
-</p>
-
-<h2 id="5703">Kustomisasi</h2>
-<p id="740581" class="block-content">
-Penerbitan asset diatur oleh modul <tt>System.Web.TAssetManager</tt>. Standarnya, semua file asset yang diterbitkan disimpan di bawah direktori <tt>[AppEntryPath]/assets</tt>, di mana <tt>AppEntryPath</tt> merujuk ke direktori yang berisi naskah entri aplikasi. Pastikan direktori <tt>assets</tt> bisa ditulisi oleh proses server Web. Anda dapat mengubah direktorinya ke direktori lain dengan mengkonfigurasi properti <tt>BasePath</tt> dan <tt>BaseUrl</tt> pada modul <tt>TAssetManager</tt> dalam konfigurasi aplikasi,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code1">
-<modules>
- <module id="asset"
- class="System.Web.TAssetManager"
- BasePath="Web.images"
- BaseUrl="images" />
-</modules>
-</com:TTextHighlighter>
-
-<h2 id="5704">Performansi</h2>
-<p id="740582" class="block-content">
-PRADO menggunakan teknik cache guna memastikan efisiensi penerbitan asset. Menerbitkan asset intinya memerlukan operasi copy file, yang mahal. Untuk menyimpan operasi copy file yang tidak diperlukan, <tt>System.Web.TAssetManager</tt> hanya menerbitkan asset saat ia memiliki waktu modifikasi file lebih baru daripada file yang pernah diterbitkan. Ketika aplikasi dijalankan dengan mode <tt>Performance</tt>, pemeriksaan cap waktu tersebut juga diabaikan.
-</p>
-<p id="740583" class="block-content">
-SARAN: Jangan menggunakan penerbitan asset secara berlebihan. Konsep asset dipakai terutama untuk membantu pemakaian ulang dan redistribusi kelas komponen agar lebih baik. Normalnya, Anda tidak akan menggunakan penerbitan asset untuk sumberdaya yang tidak terikat ke komponen mana pun dalam aplikasi. Sebagai contoh, Anda jangan menggunakan penerbitan asset untuk gambar yang digunakan terutama sebagai elemen desain (misalnya logo, gambar latar belakang, dll). Biarkan server Web melayani gambar ini secara langsung yang akan membantu meningkatkan performansi aplikasi Anda.
-</p>
-
-<h2 id="5705">Contoh Tombol Toggle</h2>
-<p id="740584" class="block-content">
-Sekarang kita menggunakan contoh tombol toggle untuk menjelaskan penggunaan asset. Kontrol menggunakan dua file gambar <tt>up.gif</tt> dan <tt>down.gif</tt>, yang disimpan di bawah direktori yang berisi file kelas. Ketika tombol dalam kondisi <tt>Up</tt>, kita ingin menampilkan gambar <tt>up.gif</tt>. Ini dapat dikerjakan seperti berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code2">
-class ToggleButton extends TWebControl {
- ...
- protected function addAttributesToRender($writer) {
- ...
- if($this->getState()==='Up') {
- $url=$this->getAsset('up.gif');
- $writer->addAttribute('src',$url);
- }
- ...
- }
- ...
-}
-</com:TTextHighlighter>
-<p id="740585" class="block-content">
-Dalam contoh di atas, pemanggilan <tt>$this->getAsset('up.gif')</tt> akan menerbitkan file gambar <tt>up.gif</tt> dan mengembalikan URL untuk file gambar yang diterbitkan. URL kemudian disajikan sebagai atribut dari tag gambar HTML.
-</p>
-<p id="740586" class="block-content">
-Untuk meredistribusi <tt>ToggleButton</tt>, cukup paketkan bersama file kelas dan file gambar. Para pengguna <tt>ToggleButton</tt> cuma perlu untuk mengurai file, dan mereka bisa menggunakannya secara langsung tanpa mencemaskan mengenai ke mana meng-copy file gambar itu.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Auth.page b/demos/quickstart/protected/pages/Advanced/id/Auth.page deleted file mode 100755 index eb7ab026..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Auth.page +++ /dev/null @@ -1,170 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5501">Otentikasi dan Otorisasi</h1>
-<p id="720549" class="block-content">
-Otentikasi adalah proses verifikasi apakah seseorang yang mengaku siapa dirinya. Biasanya menyangkut nama pengguna dan kata sandi, tapi bisa menyertakan metode lain dari mendemonstrasikan identitas, seperti kartu pintar, sidik jari, dll.
-</p>
-<p id="720550" class="block-content">
-Otorisasi adalah mendapatkan keterangan jika orang yang sekali teridentifikasi, diijinkan untuk memanipulasi sumber daya tertentu. Ini biasanya ditentukan dengan menyelidiki apakah orang itu memiliki aturan akses tertentu terhadap sumber daya atau tidak.
-</p>
-
-<h2 id="5502">Bagaimana Kerangka Kerja Otentikasi PRADO Bekerja</h2>
-<p id="720551" class="block-content">
-PRADO menyediakan kerangka kerja otentikasi/otorisasi yang dapat diperluas. Seperti dijelaskan dalam <a href="?page=Fundamentals.Applications">masa hidup aplikasi</a>, <tt>TApplication</tt> menyimpan beberapa masa hidup untuk modul yang bertanggung jawab terhadap otentikasi dan otorisasi. PRADO menyediakan modul <tt>TAuthManager</tt> untuk keperluan tersebut. Para pengembang dapat memasukan modul otentikasinya sendiri dengan mudah. <tt>TAuthManager</tt> didesain untuk dipakai bersama dengan modul <tt>TUserManager</tt>, yang menerapkan datbase pengguna hanya-baca.
-</p>
-<p id="720552" class="block-content">
-Ketika sebuah permintaan halaman terjadi, <tt>TAuthManager</tt> akan mencoba untuk mengembalikan informasi pengguna dari sesi. Jika tidak ada informasi pengguna yang ditemukan, pengguna dianggap sebagai pengguna anonim atau tamu. Guna menjembatani verifikasi identitas pengguna, <tt>TAuthManager</tt> menyediakan dua metode yang umum dipakai: <tt>login()</tt> dan <tt>logout()</tt>. Pengguna dimasukan (diverifikasi) jika entitas nama pengguna serta kata sandinya sama dengan rekaman dalam database pengguna yang diatur oleh <tt>TUserManager</tt>. Pengguna dikeluarkan jika informasi pengguna dihapus dari sesi dan dia perlu masuk lagi jika dia membuat permintaan baru terhadap halaman.
-</p>
-<p id="720553" class="block-content">
-Selama masa hidup aplikasi <tt>Otorisasi</tt>, yang terjadi setelah masa hidup <tt>Otentikasi</tt>, <tt>TAuthManager</tt> akan memverifikasi apakah pengguna saat ini mempunyai akses ke halaman yang diminta berdasarkan set aturan otorisasi. Otorisasi adalah berbasis-aturan, misalnya seorang pengguna memiliki akses ke sebuah halaman jika 1) halaman secara ekplisit menyatakan bahwa pengguna mempunyai akses; 2) atau pengguna adalah aturan tertentu yang memiliki akses ke halaman. Jika pengguna tidak mempunyai akses ke halaman, <tt>TAuthManager</tt> akan mengalihkan browser pengguna ke halaman masuk yang ditetapkan oleh properti <tt>LoginPage</tt>.
-</p>
-
-<h2 id="5503">Menggunakan Kerangka Kerja Otentikasi PRADO</h2>
-<p id="720554" class="block-content">
-Untuk menghidupkan kerangka kerja otentikasi PRADO, tambahkan modul <tt>TAuthManager</tt> dan modul <tt>TUserManager</tt> ke <a href="?page=Configurations.AppConfig">konfigurasi aplikasi</a>,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code1">
-<service id="page" class="TPageService">
- <modules>
- <module id="auth" class="System.Security.TAuthManager"
- UserManager="users" LoginPage="UserLogin" />
- <module id="users" class="System.Security.TUserManager"
- PasswordMode="Clear">
- <user name="demo" password="demo" />
- <user name="admin" password="admin" />
- </module>
- </modules>
-</service>
-</com:TTextHighlighter>
-<p id="720555" class="block-content">
-Di atas, properti <tt>UserManager</tt> dari <tt>TAuthManager</tt> disetel ke modul <tt>users</tt> yang adalah <tt>TUserManager</tt>. Para pengembang dapat menggantinya dengan modul manajemen pengguna yang berasal dari <tt>TUserManager</tt>.
-</p>
-<p id="720556" class="block-content">
-Aturan otorisasi untuk halaman ditetapkan dalam <a href="?page=Configurations.PageConfig">konfigurasi halaman</a> seperti berikut,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code2">
-<authorization>
- <allow pages="PageID1,PageID2"
- users="User1,User2"
- roles="Role1" />
- <deny pages="PageID1,PageID2"
- users="?"
- verb="post" />
-</authorization>
-</com:TTextHighlighter>
-<p id="720557" class="block-content">
-Aturan otorisasi bisa berupa aturan <tt>allow</tt> atau aturan <tt>deny</tt>. Setiap aturan terdiri dari empat properti opsional:
-</p>
-<ul id="u1" class="block-content">
-<li><tt>pages</tt> - daftar nama halaman dipisahkan koma yang menerapkan aturan ini. Jika kosong atau tidak disetel, aturan ini akan berlaku ke semua halaman di bawah direktori saat ini dan seluruh subdirektorinya secara rekursif.</li>
-<li><tt>users</tt> - daftar nama pengguna yang menerapkan aturan dipisahkan koma di mana aturan ini berlaku. Karakter * menunjukan semua pengguna termasuk pengguna anonim/tamu. Karakter ? menunjukan pengguna anonim/tamu . Dan karakter @ menunjukan pengguna terotentikasi (tersedia sejak v3.1).</li>
-<li><tt>roles</tt> - daftar aturan pengguna yang menerapkan aturan ini.</li>
-<li><tt>verb</tt> - metode akses halaman yang memberlakukan aturan ini. Ia bisa berupa <tt>get</tt> atau <tt>post</tt>. Jika kosong atau tidak disetel, aturan berlaku untuk kedua metode tersebut.</li>
-</ul>
-
-<p id="720558" class="block-content">
-Ketika permintaan halaman sedang diproses, daftar aturan otorisassi menjadi tersedia. Akan tetapi, hanya aturan <i>efektif yang pertama</i> <i>menyamai</i> pengguna saat ini akan menyajikan hasil otorisasi.
-</p>
-<ul id="u2" class="block-content">
-<li>Aturan diurut dari bawah-ke atas, misalnya aturan yang berisi dalam konfigurasi dari folder halaman saat ini menjadi yang pertama. Aturan dalam konfigurasi dari folder halaman leluhurnya menjadi yang berikutnya.</li>
-<li>Sebuah aturan efektif jika halaman saat ini dalam halaman yang didaftarkan pada aturan DAN aksi pengguna saat ini (<tt>get</tt> atau <tt>post</tt>) dalam aksi terdaftar.</li>
-<li>Sebuah aturan sama terjadi jika nama pengguna saat ini ada dalam daftar nama pengguna pada aturan <i>efektif</i> ATAU jika aturan pengguna ada dalam aturan terdaftar yang mengaturnya.</li>
-<li>Jika tidak ada aturan yang sama, pengguna diotorisasi.</li>
-</ul>
-<p id="720559" class="block-content">
-Dalam contoh di atas, pengguna anonim akan ditolak atas penulisan ke <tt>PageID1</tt> dan <tt>PageID2</tt>, sementara <tt>User1</tt> dan <tt>User2</tt> dan semua pengguna aturan <tt>Role1</tt> bisa mengakses dua halaman (baik metode <tt>get</tt> maupun <tt>post</tt>).
-</p>
-<com:SinceVersion Version="3.1.1" />
-<p class="block-content">
-Sejak versi 3.1.1, atribut <tt>pages</tt> dalam aturan otorisasi dapat mengambil path halaman relatif dengan '*'. Sebagai contoh, <tt>pages="admin.Home"</tt> merujuk ke halaman <tt>Home</tt> di bawah direktori <tt>admin</tt>, dan <tt>pages="admin.*"</tt> akan merujuk ke seluruh halaman di bawah direktori <tt>admin</tt> dan subdirektorinya.
-</p>
-
-<p class="block-content">
-Juga diperkenalkan dalam versi 3.1.1 adalah aturan IP. Ini ditetapkan oleh atribut baru <tt>ip</tt> dalam aturan otorisasi. Aturan IP dipakai untuk menentukan apakah aturan otorisasi berlaku ke pengguna-akhir berdasarkan alamat IP-nya. Seseorang dapat mendaftar beberapa IP sekaligus, dipisahkan dengan koma ','. Wildcard '*' dapat dipakai dalam aturan. Sebagai contoh, <tt>ip="192.168.0.2, 192.168.1.*"</tt> berarti aturan berlaku untuk para pengguna yang alamat IP-nya 192.168.0.2 atau 192.168.1.*. Yang kedua sama dengan setiap host dalam subnet 192.168.1.
-</p>
-
-<h2 id="5504">Menggunakan <tt>TUserManager</tt></h2>
-<p id="720560" class="block-content">
-Seperti telah disebutkan di atas, <tt>TUserManager</tt> menerapkan database pengguna hanya-baca. Informasi pengguna ditetapkan baik dalam konfigurasi aplikasi ataupun file XML eksternal.
-</p>
-<p id="720561" class="block-content">
-Kita telah melihat contoh di atas yang menggunakan dua pengguna ditetapkan dalam konfigurasi aplikasi. Sintaks lengkap atas penetapan pengguna dan informasi aturan adalah sebagai berikut,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code3">
-<user name="demo" password="demo" roles="demo,admin" />
-<role name="admin" users="demo,demo2" />
-</com:TTextHighlighter>
-<p id="720562" class="block-content">
-di mana atribut <tt>roles</tt> dalam elemen <tt>user</tt> adalah opsional. Aturan pengguna dapat ditetapkan baik dalam elemen <tt>user</tt> ataupun dalam elemen <tt>role</tt> terpisah.
-</p>
-
-<h2 id="5505">Menggunakan <tt>TDbUserManager</tt></h2>
-<p id="720563" class="block-content">
-<tt>TDbUserManager</tt> diperkenalkan dalam v3.1.0. Tujuan utamanya adalah untuk menyederhanakan tugas pengaturan akun pengguna yang disimpan dalam sebuah database. Ini membutuhkan para pengembang untuk menulis kelas pengguna yang mewakili informasi yang diperlukan untuk akun pengguna. Kelas pengguna harus diperluas dari <tt>TDbUser</tt>.
-</p>
-<p id="720564" class="block-content">
-Untuk menggunakan <tt>TDbUserManager</tt>, konfigurasi itu dalam konfigurasi aplikasi seperti berikut:
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code4">
-<module id="db"
- class="System.Data.TDataSourceConfig" ..../>
-<module id="users"
- class="System.Security.TDbUserManager"
- UserClass="Path.To.MyUserClass"
- ConnectionID="db" />
-<module id="auth"
- class="System.Security.TAuthManager"
- UserManager="users" LoginPage="Path.To.LoginPage" />
-</com:TTextHighlighter>
-
-</p>
-<p id="720565" class="block-content">
-Dalam contoh di atas, <tt>UserClass</tt> menetapkan bahwa kelas akan dipakai untuk membuat turunan pengguna. Kelas harus diperluas dari <tt>TDbUser</tt>. <tt>ConnectionID</tt> merujuk ke ID dari modul <tt>TDataSourceConfig</tt> yang menetapkan bagaimana untuk melakukan koneksi database guna mendapatkan informasi penggunanya.
-</p>
-<p id="720566" class="block-content">
-Kelas pengguna harus menerapkan dua metode abstrak dalam <tt>TDbUser</tt>: <tt>validateUser()</tt> dan <tt>createUser()</tt>. Karena informasi akun pengguna disimpan dalam sebuah database, kelas pengguna dapat menggunakan properti <tt>DbConnection</tt>-nya untuk menjangkau database.
-</p>
-<com:SinceVersion Version="3.1.1" />
-<p id="720567" class="block-content">
-Sejak versi 3.1.1, <tt>TAuthManager</tt> menyediakan dukungan guna membolehkan mengingat yang masuk dengan menyetel <tt>AllowAutoLogin</tt> menjadi true. Oleh karena itu, <tt>TDbUser</tt> menambahkan dua metode untuk memfasilitasi implementasi fitur ini. Dalam keadaan tertentu, dua metode baru diperkenalkan: <tt>createUserFromCookie()</tt> dan <tt>saveUserToCookie()</tt>. Para pengembang harus mengimplementasikan dua metode ini jika mengingat yang sudah masuk diperlukan. Di bawah ini adalah contoh implementasi:
-</p>
-<com:TTextHighlighter Language="php" CssClass="source block-content" id="code5">
-public function createUserFromCookie($cookie)
-{
- if(($data=$cookie->Value)!=='')
- {
- $application=Prado::getApplication();
- if(($data=$application->SecurityManager->validateData($data))!==false)
- {
- $data=unserialize($data);
- if(is_array($data) && count($data)===3)
- {
- list($username,$address,$token)=$data;
- $sql='SELECT passcode FROM user WHERE LOWER(username)=:username';
- $command=$this->DbConnection->createCommand($sql);
- $command->bindValue(':username',strtolower($username));
- if($token===$command->queryScalar() && $token!==false && $address=$application->Request->UserHostAddress)
- return $this->createUser($username);
- }
- }
- }
- return null;
-}
-
-public function saveUserToCookie($cookie)
-{
- $application=Prado::getApplication();
- $username=strtolower($this->Name);
- $address=$application->Request->UserHostAddress;
- $sql='SELECT passcode FROM user WHERE LOWER(username)=:username';
- $command=$this->DbConnection->createCommand($sql);
- $command->bindValue(':username',strtolower($username));
- $token=$command->queryScalar();
- $data=array($username,$address,$token);
- $data=serialize($data);
- $data=$application->SecurityManager->hashData($data);
- $cookie->setValue($data);
-}
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Collections.page b/demos/quickstart/protected/pages/Advanced/id/Collections.page deleted file mode 100755 index e79da29c..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Collections.page +++ /dev/null @@ -1,135 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5501">Koleksi</h1>
-<p id="710529" class="block-content">
-Koleksi adalah struktur data dasar dalam pemrograman. Sebagai tambahan pada pemrograman PHP, array dipakai secara luas untuk mewakili koleksi struktur data. Array PHP adalah campuran dari array berindeks-kardinal dan tabel campuran.
-</p>
-<p id="710530" class="block-content">
-Untuk menghidupkan manipulasi obyek-terorientasi atas koleksi, PRADO menyediakan kelas koleksi yang bertenaga. Diantaranya, <tt>TList</tt> dan <tt>TMap</tt> adalah yang paling mendasar dan biasanya melayani sebagai basis kelas untuk kelas koleksi lainnya. Karena banyak komponen PRADO memiliki properti yang bertipe koleksi, penting bagi para pengembang untuk menguasai pemakaian kelas koleksi PRADO.
-</p>
-
-<h2 id="5502">Menggunakan <tt>TList</tt></h2>
-<p id="710531" class="block-content">
-Obyek <tt>TList</tt> mewakili array berindeks-kardinal, misalnya array (obyek) dengan indeks 0, 1, 2, ...
-</p>
-<p id="710532" class="block-content">
-<tt>TList</tt> bisa dipakai seperti array PHP. Sebagai contoh,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code1">
-$list=new TList; // buat obyek list
-...
-$item=$list[$index]; // baca item pada indeks yang ditetapkan
-$list[]=$item; // tambah item di akhir
-$list[$index]=$item; // ganti item pada indeks yang ditetapkan
-unset($list[$index]); // hapus item di posisi $index
-if(isset($list[$index])) // uji apakah daftar memiliki item di posisi $index
-foreach($list as $index=>$item) // jelajahi setiap item dalam daftar
-</com:TTextHighlighter>
-
-<p id="710533" class="block-content">
-Untuk memperoleh jumlah item dalam daftar, gunakan properti <tt>Count</tt>. Catatan, jangan gunakan <tt>count($list)</tt>, karena ia selalu mengembalikan 1.
-</p>
-
-<p id="710534" class="block-content">
-Sebagai tambahan, <tt>TList</tt> menerapkan beberapa metode yang nyaman untuk dipakai secara umum guna memanipulasi data dalam sebuah daftar. Ini termasuk
-</p>
-<ul id="u1" class="block-content">
- <li><tt>clear()</tt>: membersihkan seluruh item dalam daftar.</li>
- <li><tt>contains()</tt>: menguji apakah daftar berisi item yang ditetapkan.</li>
- <li><tt>indexOf()</tt>: mendapatkan indeks berbasis-nol dari item yang ditetapkan dalam daftar.</li>
- <li><tt>toArray()</tt>: mengembalikan perwakilan array atas item dalam daftar.</li>
- <li><tt>copyFrom()</tt>: mempopulasikan daftar dengan data dari array atau obyek yang bisa dijelajahi (termasuk <tt>TList</tt>). Item yang sudah ada akan dihapus terlebih dahulu.</li>
- <li><tt>mergeWith()</tt>: menambahkan daftar dengan data dari array atau obyek yang bisa dijelajahi (termasuk <tt>TList</tt>).</li>
-</ul>
-
-<h3 id="5504">Menggunakan properti komponen berbasis-<tt>TList</tt></h3>
-<p id="710535" class="block-content">
-Seperti telah disebutkan di atas, banyak properti komponen PRADO didasarkan pada <tt>TList</tt> atau kelas koleksi berasal dari <tt>TList</tt>. Properti ini semuanya berbagi pemakaian tersebut di atas.
-</p>
-<p id="710536" class="block-content">
-Sebagai contoh, <tt>TControl</tt> (basis kelas untuk semua kontrol PRADO) mempunyai properti yang disebut <tt>Controls</tt> yang mewakili koleksi dari kontrol anak. Tipe <tt>Controls</tt> adalah <tt>TControlCollection</tt> yang memperluas <tt>TList</tt>. Oleh karena itu, untuk menambahkan kontrol anak baru, kita dapat menggunakan cara berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code2">
-$control->Controls[]=$newControl;
-</com:TTextHighlighter>
-<p id="710537" class="block-content">
-Untuk menjelajahi melalui kontrol anak, kita bisa menggunakan,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code3">
-foreach($control->Controls as $childControl) ...
-</com:TTextHighlighter>
-<p id="710538" class="block-content">
-Controh lain adalah properti <tt>Items</tt>, tersedia dalam kontrol list, <tt>TRepeater</tt>, <tt>TDataList</tt> dan <tt>TDataGrid</tt>. Dalam kontrol ini, kelas leluhur dari <tt>Items</tt> adalah <tt>TList</tt>.
-</p>
-
-<h3 id="5505">Memperluas <tt>TList</tt></h3>
-<p id="710539" class="block-content">
-Seringkali kita ingin memperluas <tt>TList</tt> untuk melakukan operasi tambahan untuk setiap penambahan atau penghapusan sebuah item. Satu-satunya metode yang diperlukan kelas anak untuk mengganti adalah <tt>insertAt()</tt> dan <tt>removeAt()</tt>. Sebagai contoh, guna memastikan daftar hanya berisi item yang bertipe <tt>TControl</tt>, kita dapat mengganti <tt>insertAt()</tt> sebagai berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code4">
-public function insertAt($index,$item)
-{
- if($item instanceof TControl)
- parent::insertAt($index,$item)
- else
- throw new Exception('TControl required.');
-}
-</com:TTextHighlighter>
-
-
-<h2 id="5503">Menggunakan <tt>TMap</tt></h2>
-<p id="710540" class="block-content">
-Obyek <tt>TMap</tt> mewakili tabel campuran (atau kami katakan array berindeks-string).
-</p>
-<p id="710541" class="block-content">
-Mirip dengan <tt>TList</tt>, <tt>TMap</tt> bisa dipakai layaknya sebuah array,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code5">
-$map=new TMap; // buat obyek map
-...
-$map[$key]=$value; // tambah pasangan kunci-nilai
-unset($map[$key]); // hapus nilai dengan kunci yang ditetapkan
-if(isset($map[$key])) // apakah map berisi kunci
-foreach($map as $key=>$value) // jelajahi item dalam map
-</com:TTextHighlighter>
-<p id="710542" class="block-content">
-Properti <tt>Count</tt> memberikan jumlah item dalam map sementara properti <tt>Keys</tt> mengembalikan daftar kunci yang dipakai dalam map.
-</p>
-
-<p id="710543" class="block-content">
-Metode berikut disediakan oleh <tt>TMap</tt> demi kenyamanan,
-</p>
-<ul id="u2" class="block-content">
- <li><tt>clear()</tt>: menghapus semua item dalam map.</li>
- <li><tt>contains()</tt>: menguji apakah map berisi kunci yang ditetapkan.</li>
- <li><tt>toArray()</tt>: mengembalikan perwakilan array dari item dalam map.</li>
- <li><tt>copyFrom()</tt>: mempopulasikan map dengan data dari array atau obyek yang bisa dijelajahi (termasuk <tt>TMap</tt>). Item yang sudah ada akan dihapus terlebih dulu.</li>
- <li><tt>mergeWith()</tt>: menambahkan map dengan data dari array atau obyek yang bisa dijelajahi (termasuk <tt>TMap</tt>).</li>
-</ul>
-
-<h3 id="5506">Penggunaan <tt>TAttributeCollection</tt></h3>
-<p id="710544" class="block-content">
-<tt>TAttributeCollection</tt> adalah kelas khusus yang diperluas dari <tt>TMap</tt>. Ia dipakai terutama oleh properti <tt>Attributes</tt> dari <tt>TControl</tt>.
-</p>
-Selain fungsionalitas normal yang disediakan oleh <tt>TMap</tt>, <tt>TAttributeCollection</tt> membolehkan anda untuk mendapatkan dan menyetel item koleksi seperti mendapatkan dan menyetel properti. Sebagai contoh,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code6">
-$collection->Label='value'; // sama dengan: $collection['Label']='value';
-echo $collection->Label; // sama dengan: echo $collection['Label'];
-</com:TTextHighlighter>
-<p id="710545" class="block-content">
-Catatan, dalam <tt>$collection</tt> di atas TIDAK mempunyai properti <tt>Label</tt>.
-</p>
-<p id="710546" class="block-content">
-Tidak seperti <tt>TMap</tt>, kunci dalam <tt>TAttributeCollection</tt> tidak sensitif huruf. Oleh karena itu <tt>$collection->Label</tt> sama dengan <tt>$collection->LABEL</tt>.
-</p>
-<p id="710547" class="block-content">
-Karena fitur baru di atas, ketika berhadapan dengan properti <tt>Attributes</tt> dari kontrol, kita dapat mengambil keuntungan dari konsep subproperti dan mengkonfigurasi nilai atribut kontrol dalam sebuah template seperti berikut,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code7">
-<com:TButton Attributes.onclick="if(!confirm('Are you sure?')) return false;" .../>
-</com:TTextHighlighter>
-<p id="710548" class="block-content">
-yang menambahkan atribut bernama <tt>onclick</tt> ke kontrol <tt>TButton</tt>.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Error.page b/demos/quickstart/protected/pages/Advanced/id/Error.page deleted file mode 100755 index 419b390f..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Error.page +++ /dev/null @@ -1,77 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6301">Penanganan Kesalahan dan Laporan</h1>
-<p id="800666" class="block-content">
-PRADO menyediakan kerangka kerja penanganan kesalahan dan laporan lengkap berdasarkan pada mekanisme eksepsi dari PHP 5.
-</p>
-
-<h2 id="6302">Kelas Eksepsi</h2>
-<p id="800667" class="block-content">
-Kesalahan yang terjadi dalam aplikasi PRADO dapat diklasifikasikan ke dalam tiga kategori: kesalahan yang disebabkan oleh penguraian naskah PHP, kode yang salah (seperti memanggil fungsi yang tidak didefinisikan, menyetel properti yang tidak dikenal), dan yang disebabkan oleh pemakaian yang tidak benar pada aplikasi Web oleh pengguna klien (seperti mencoba untuk mengakses halaman terbatas). PRADO tidak dapat berhadapan dengan kesalahan kategori pertama karena tidak dapat ditangkap dalam kode PHP. PRADO menyediakan sebuah hirarki eksepsi untuk berhadapan dengan kategori kedua dan ketiga.
-</p>
-<p id="800668" class="block-content">
-Semua kesalahan dalam aplikasi PRADO digambarkan sebagai eksepsi. Basis kelas untuk seluruh eksepsi PRADO adalah <tt>TException</tt>. Ia menyediakan fungsionalitas internasionalisasi pesan bagi semua eksepsi sistem. Pesan kesalahan dapat diterjemahkan ke dalam bahasa yang berbeda tergantung pada preferensi bahasa browser pengguna.
-</p>
-<p id="800669" class="block-content">
-Eksepsi muncul karena pemakaian yang tidak benar dari kerangka kerja PRADO yang diturunkan dari <tt>TSystemException</tt>, yang bisa berupa salah satu dari kelas eksepsi berikut:
-</p>
-<ul id="u1" class="block-content">
-<li><tt>TConfigurationException</tt> - konfigurasi salah, seperti kesalahan dalam konfigurasi aplikasi, template kontrol, dll.</li>
-<li><tt>TInvalidDataValueException</tt> - nilai data tidak benar atau tidak diharapkan.</li>
-<li><tt>TInvalidDataTypeException</tt> - tipe data tidak benar atau tidak diharapkan.</li>
-<li><tt>TInvalidDataFormatException</tt> - format data tidak benar.</li>
-<li><tt>TInvalidOperationException</tt> - permintaan operasi tidak benar.</li>
-<li><tt>TPhpErrorException</tt> - kesalahan PHP dapat ditangkap, peringatan, perhatian, dll.</li>
-<li><tt>TSecurityException</tt> - kesalahan terkait dengan keamanan.</li>
-<li><tt>TIOException</tt> - kesalahan operasi IO, seperti kegagalan membuka file.</li>
-<li><tt>TDBException</tt> - kesalahan terkait dengan operasi database.</li>
-<li><tt>TNotSupportedException</tt> - kesalahan disebabkan oleh permintaan dari fitur yang tidak didukung.</li>
-<li><tt>THttpException</tt> - kesalahan untuk ditampilkan ke pengguna klien Web.</li>
-</ul>
-<p id="800670" class="block-content">
-Kesalahan karena pemakaian yang salah dari aplikasi Web oleh pengguna klien diturunkan dari <tt>TApplicationException</tt>.
-</p>
-
-<h2 id="6303">Memunculkan Eksepsi</h2>
-<p id="800671" class="block-content">
-Memunculkan eksepsi dalam PRADO tidak berbeda dengan memunculkan eksepsi normal PJHP. Satu hal yang sama adalah untuk memunculkan eksepsi yang benar. Secara umum, eksepsi yang ditujukan untuk ditampilkan ke pengguna aplikasi harus menggunakan <tt>THttpException</tt>, sementara eksepsi yang ditampilkan bagi para pengembang harus menggunakan kelas eksepsi lain.
-</p>
-
-<h2 id="6304">Penangkapan Kesalahan dan Pelaporan</h2>
-<p id="800672" class="block-content">
-Eksepsi muncul selama menjalankan aplikasi PRADO ditangkap oleh modul <tt>System.Exceptions.TErrorHandler</tt>. Template output berbeda dipakai untuk menampilkan eksepsi yang ditangkap. <tt>THttpException</tt> dianggap berisi pesan kesalahan yang ditujukan untuk aplikasi pengguna akhir dan kemudian menggunakan grup template khusus. Untuk semua eksepsi lainnya, template umum ditampilkan seperti berikut dipakai untuk menyajikan eksepsi.
-</p>
-<a href="<%~ exception2.gif %>" target="_blank"><img src="<%~ exception.gif %>" alt="exception page" style="border:0px"/></a>
-
-<h2 id="6305">Mengkustomisasi Tampilan Kesalahan</h2>
-<p id="800673" class="block-content">
-Para pengembang dapat mengkustomisasi penyajian pesan kesalahan. Standarnya, semua template output kesalahan disimpan dalam <tt>framework/Exceptions/templates</tt>. Lokasi dapat diubah dengan mengkonfigurasi <tt>TErrorHandler</tt> dalam konfigurasi aplikasi,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_800226">
-<module id="error"
- class="TErrorHandler"
- ErrorTemplatePath="Application.ErrorTemplates" />
-</com:TTextHighlighter>
-<p id="800674" class="block-content">
-<tt>THttpException</tt> menggunakan satu set template yang dibedakan berdasarkan pada nilai properti <tt>StatusCode</tt> yang berbeda dari <tt>THttpException</tt>. <tt>StatusCode</tt> memiliki arti yang sama seperti kode status dalam protokol HTTP. Sebagai contoh, kode status yang sama dengan 404 berarti URL yang diminta tidak ditemukan pada server. File template output menggunakan konvensi penamaan berikut:
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_800227">
- error<status code>-<language code>.html
-</com:TTextHighlighter>
-<p id="800675" class="block-content">
-di mana <tt>status code</tt> merujuk ke nilai properti <tt>StatusCode</tt> dari <tt>THttpException</tt>, dan <tt>kode bahasa</tt> harus bahasa yang benar seperti misalnya <tt>en</tt>, <tt>zh</tt>, <tt>fr</tt>, dll. Ketika <tt>THttpException</tt> muncul, PRADO akan memilih template yang sesuai untuk menampilkan pesan eksepsi. Pertama PRADO akan mencari file template yang namanya berisi kode status dan yang bahasanya lebih disukai oleh jendela browser klien. Jika template seperti itu tidak ada, ia akan mencari template yang memiliki kode status yang sama tapi tanpa kode bahasa.
-</p>
-<p id="800676" class="block-content">
-Konvensi penamaan untuk file template yang dipakai bagi semua eksepsi adalah sebagai berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_800228">
- exception-<language code>.html
-</com:TTextHighlighter>
-<p id="800677" class="block-content">
-Sekali lagi, jika bahasa yang diinginkan tidak ditemukan, sebaliknya PRADO akan mencoba menggunakan <tt>exception.html</tt>.
-</p>
-<div class="note">
-<b class="tip">PERHATIAN:</b> Ketika menyimpan file template, pastikan file disimpan menggunakan pengkodean UTF-8. Pada Windows, Anda bisa menggunakan <tt>Notepad.exe</tt> untuk melakukan penyimpanan tersebut.
-</div>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/I18N.page b/demos/quickstart/protected/pages/Advanced/id/I18N.page deleted file mode 100755 index 16c234f6..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/I18N.page +++ /dev/null @@ -1,336 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6201">Internasionalisasi (I18N) dan Lokalisasi (L10N)</h1>
-<p id="790625" class="block-content">Banyak aplikasi web dibangun dengan PHP tidak memikirkan internasionlisasi saat ia pertama kali ditulis. Itu mungkin dikarenakan tidak dimaksudkan untuk digunakan dalam bahasa dan kultur. Internasionalisasi adalah aspek penting karena meningkatkan adopsi Internet dalam banyak negara yang berbicara non-Ingris. Proses internasionalisasi dan lokalisasi akan menghadapi kesulitan. Di bawah adalah beberapa petunjuk umum untuk menginternasionalisasi aplikasi yang sudah ada.</p>
-
-<h2 id="6203">Pisahkan data sensitif kultur/lokal</h2>
-
-<p id="790626" class="block-content">Identifikasi dan pisahkan data yang beragam dengan kultur. Yang paling jelas adalah teks/string/pesan. Tipe lain dari data juga harus dipertimbangkan. Daftar berikut mengkategorikan beberapa contoh data sensitif kultur
-</p>
-
-<ul id="u1" class="block-content">
- <li> String, Pesan, Teks, dalam unit relatif kecil (misalnya prasa, kalimat, paragraf, tapi tidak teks lengkap dari buku).</li>
- <li> Label pada tombol.</li>
- <li> File bantuan, unit besar teks, teks statis.</li>
- <li> Suara.</li>
- <li> Warna.</li>
- <li> Grafik,Ikon.</li>
- <li> Tanggal, Jam.</li>
- <li> Angka, Kurs, Pengukuran.</li>
- <li> Nomor Telepon.</li>
- <li> Penghargaan dan titel personal.</li>
- <li> Alamat pos.</li>
- <li> Tata letak halaman.</li>
-</ul>
-
-<p id="790627" class="block-content">Bila memungkinkan semua ragam teks harus diisolasi dan disimpan dalam format persisten. Teks ini termasuk, pesan kesalahan aplikasi, string ditulis tangan dalam file PHP, email, teks statis HTML, dan teks pada elemen formulir (misalnya tombol).</p>
-
-<h2 id="6204">Konfigurasi</h2>
-<p id="790628" class="block-content">Untuk menghidupkan fitur lokalisasi dalam PRADO, Anda perlu menambahkan beberapa opsi konfigurasi dalam <a href="?page=Configurations.AppConfig">konfigurasi aplikasi</a> Anda.
-Pertama Anda perlu menyertakan namespace <tt>System.I18N.*</tt> ke path Anda.
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790203">
-<paths>
- <using namespace="System.I18N.*" />
-</paths>
-</com:TTextHighlighter>
-
-<p id="790629" class="block-content">Kemudian, jika Anda ingin menerjemahkan beberapa teks dalam aplikasi Anda, perlu ditambahkan sumber data pesan terjemahan.</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790204">
-<module id="globalization" class="TGlobalization">
- <translation type="XLIFF"
- source="MyApp.messages"
- marker="@@"
- autosave="true" cache="true" />
-</module>
-</com:TTextHighlighter>
-
-<p id="790630" class="block-content">Di mana <tt>source</tt> dalam <tt>translation</tt> adalah path titik ke direktori di mana Anda akan menyimpan katalog pesan terjemahan. Atribut <tt>autosave</tt> jika dihidupkan, menyimpan pesan tidak diterjemahkan kembali ke dalam katalog pesasn.
-Dengan menghidupkan <tt>cache</tt>, pesan yang diterjemahkan disimpan dalam direktori aplikasi <tt>runtime/i18n</tt>.
-Nilai <tt>marker</tt> dipakai untuk mengelilingi teks yang tidak diterjemahkan.
-</p>
-
-<p id="790631" class="block-content">Dengan konfigurasi lengkap, sekarang kita dapat mulai melokalisasi aplikasi Anda. Jika Anda menghidupkan <tt>autosave</tt>, setelah menjalankan aplikasi Anda dengan beberapa aktivitas lokalisasi (misalnya menterjemahkan beberapa teks), Anda akan melihat sebuah direktori dan <tt>messages.xml</tt> dibuat di dalam direktori <tt>source</tt>.</p>
-
-<h2 id="6205">Apa yang harus dilakukan dengan <tt>messages.xml</tt>?</h2>
-<p id="790632" class="block-content">File katalog pesan terjemahan, jika menggunakan <tt>type="XLIFF"</tt>, adalah format intechange XML pesan terjemahan distandarisasi. Anda bisa mengedit file XML menggunakan editor yang mampu menangani UTF-8. Format dari XML adalah sesuatu mirip seperti berikut ini.</p>
-
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790205">
-<?xml version="1.0"?>
-<xliff version="1.0">
- <file original="I18N Example IndexPage"
- source-language="EN"
- datatype="plaintext"
- date="2005-01-24T11:07:53Z">
- <body>
-
-<trans-unit id="1">
-<source>Hello world.</source>
-<target>Hi World!!!</target>
-</trans-unit>
-
- </body>
- </file>
-</xliff>
-</com:TTextHighlighter>
-
-Setiap pesan terjemahan dilapisi dengan tag <tt>trans-unit</tt>, di mana <tt>source</tt> adalah pesan asli, dan <tt>target</tt> adalah pesan yang diterjemahkan. Editor seperti <a href="http://www.heartsome.net/EN/xlfedit.html">Heartsome XLIFF Translation Editor</a> dapat membantu mengedit file XML ini.
-
-
-<h2 id="6206">Menyetel dan Mengubah Kultur</h2>
-<p id="790633" class="block-content">Sekali globalisasi dihidupkan, Anda dapat mengakses setelan globalisasi, seperti <tt>Culture</tt>, <tt>Charset</tt>, dll, menggunakan </p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790206">
-$globalization = $this->getApplication()->getGlobalization();
-echo $globalization->Culture;
-$globalization->Charset= "GB-2312"; //ubah charset
-</com:TTextHighlighter>
-
-<p id="790634" class="block-content">Anda juga mengubah cara kultur ditentukan dengan mengubah atribut <tt>class</tt> dalam konfigurasi modul. Sebagai contoh, untuk menyetel kultur yang tergantung pada setelan browser, Anda bisa menggunakan kelas <tt>TGlobalizationAutoDetect</tt>.
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_790207">
-<module id="globalization" class="TGlobalizationAutoDetect">
- ...
-</module>
-</com:TTextHighlighter>
-
-<p id="790635" class="block-content">Anda juga bisa menyediakan kelas globalisasi sendiri untuk mengubah bagaimana kultur aplikasi ditetapkan.
-Terakhir, Anda dapat mengubah setelan globalisasi dengan basis halaman demi halaman menggunakan <a href="?page=Configurations.Templates1#tct">tag kontrol template</a>. Sebagai contoh, mengubah <tt>Culture</tt> ke "zh".</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790208">
-<%@ Application.Globalization.Culture="zh" %>
-</com:TTextHighlighter>
-
-<h2 id="6207">Melokalisir aplikasi PRADO Anda</h2>
-Ada dua area dalam aplikasi Anda yang mungkin membutuhkan lokalisasi pesan atau string, dalam kode PHP dan dalam template. Untuk melokalisasi string di dalam PHP, gunakan fungsi <tt>localize</tt> yang dijelaskan di bawah. Untuk melokalisasi teks dalam template, gunakan komponen <a href="#ttranslate">TTranslate</a>.
-<h2 id="6208">Menggunakan fungsi <tt>localize</tt> untuk mennerjemahkan teks dalam PHP</h2>
-
-<p id="790636" class="block-content">Fungsi <tt>localize</tt> mencari string yang diterjemahkan yang sama dengan aslinya dari sumber terjemahan Anda. Pertama, Anda perlu mencari semua teks dikode langsung dalam PHP yang ditampilkan atau dikirimkan ke pengguna akhir. Contoh berikut melokalisasi teks <tt>$sender</tt> (menganggap, katakanlah, sender adalah sebuah tombol). Kode asli sebelum lokalisasi adalah sebagai berikut.
-<com:TTextHighlighter CssClass="source block-content" id="code_790209">
-function clickMe($sender,$param)
-{
- $sender->Text="Hello, world!";
-}
-</com:TTextHighlighter>
-
-<p id="790637" class="block-content">Pesan dikodekan langsung "Hello, world!" dilokalisasi menggunakan fungsi <tt>localize</tt>. </p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790210">
-function clickMe($sender,$param)
-{
- $sender->Text=Prado::localize("Hello, world!");
-}
-</com:TTextHighlighter>
-
-<h2 id="6209">Pesan Gabungan</h2>
-
-<p id="790638" class="block-content">Pesan gabungan dapat berisi data variabel. Sebagai contoh, dalam pesan "There are 12 users online.", integer 12 dapat berubah tergantung pada beberapa data dalam aplikasi Anda. Ini sulit diterjemahkan karena posisi dari data variabel mungkin berbeda untuk bahasa yang berbeda. Seabgai tambahan, bahasa yang berbeda memiliki aturannya sendiri untuk bentuk jamak (jika ada) dan/atau pembilang. Contoh berikut tidak mudah untuk diterjemahkan, karena struktur kalimat sudah tetap dengan dikodekan langsung data variabel dengan pesan.</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_790211">
-$num_users = 12;
-$message = "There are " . $num_users . " users online.";
-</com:TTextHighlighter>
-
-Masalah ini bisa dipecahkan menggunakan fungsi <tt>localize</tt> dengan penempatan string. Sebagai contoh, string <tt>$message</tt> di atas dapat dibentuk seperti berikut.
-<com:TTextHighlighter CssClass="source block-content" id="code_790212">
-$num_users = 12;
-$message = Prado::localize("There are {num_users} users online.", array('num_users'=>$num_users));
-</com:TTextHighlighter>
-<p id="790639" class="block-content">Di mana parameter kedua dalam <tt>localize</tt> mengambil array asosiatif dengan kunci sebagai penempatan yang dicari dalam teks dan menggantinya dengan nilai terkait.
-Fungsi <tt>localize</tt> tidak memecahkan masalah lokalisasi bahasa yang memiliki bentuk jamak, solusinya adalah menggunakan <a href="#choice-format">TChoiceFormat</a>.</p>
-
-<p id="790640" class="block-content">The following sample demonstrates the basics of localization in PRADO.</p>
-<com:RunBar PagePath="Advanced.Samples.I18N.Home" />
-
-<h1 id="6202">Komponen I18N</h1>
-<a name="ttranslate"></a>
-<h2 id="6210">TTranslate</h2>
-<p id="790641" class="block-content">Pesan dan string bisa dilokalisasi dalam PHP atau dalam template.
-Untuk menerjemahkan pesan atau string dalam template, gunakan <tt>TTranslate</tt>.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790213">
-<com:TTranslate>Hello World</com:TTranslate>
-<com:TTranslate Text="Goodbye" />
-</com:TTextHighlighter>
-
-<p id="790642" class="block-content"><tt>TTranslate</tt> juga dapat melakukan penempatan string. Properti <tt>Parameters</tt> bisa digunakan untuk menambah pasangan nama nilai untuk penempatan. Substring dalam terjemahan dikurung dengan "{" dan "}" yang dianggap sebagai nama parameter selama pencarian penempatan. Contoh berikut akan menempatkan substring "{time}" dengan nilai atribut parameter "<tt>Parameters.time=<%= time() %></tt>".
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790214">
-<com:TTranslate Parameters.time=<%= time() %> >
-The time is {time}.
-</com:TTranslate>
-</com:TTextHighlighter>
-
-<p id="790643" class="block-content">Kependekan dari <tt>TTranslate</tt> juga disediakan menggunakan sintaks berikut.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790215">
-<%[string]%>
-</com:TTextHighlighter>
-<p id="790644" class="block-content">di mana string akan diterjemahkan ke bahasa berbeda berdasarkan preferensi bahasa pengguna akhir. Sintaks ini bisa dipakai dengan nilai atribut juga.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790216">
-<com:TLabel Text="<%[ Hello World! ]%>" />
-</com:TTextHighlighter>
-
-<h2 id="6211">TDateFormat</h2>
-<p id="790645" class="block-content">Memformat tanggal dan jam dilokalisasi adalah pekerjaan langsung.</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790217">
-<com:TDateFormat Value="12/01/2005" />
-</com:TTextHighlighter>
-
-<p id="790646" class="block-content">Properti <tt>Pattern</tt> menerima 4 predefininisi pola tanggal dilokalisasi dan 4 predefininisi pola jam dilokalisasi.</p>
-<ul id="u2" class="block-content">
- <li><tt>fulldate</tt></li>
- <li><tt>longdate</tt></li>
- <li><tt>mediumdate</tt></li>
- <li><tt>shortdate</tt></li>
- <li><tt>fulltime</tt></li>
- <li><tt>longtime</tt></li>
- <li><tt>mediumtime</tt></li>
- <li><tt>shorttime</tt></li>
-</ul>
-<p id="p1" class="block-content">
-Predefinisi bisa dipakai dalam setiap kombinasi. Jika menggunakan pola predefinisi gabungan, pola pertama harus tanggal, diikuti oleh spasi, dan terakhir pola jam. Sebagai contoh, pola tanggal lengkap dengan pola jam pendek. Aktual uruta dari tanggal-jam dan pola aktual akan ditentukan secara otomatis dari data lokal yang ditetapkan oleh properti <tt>Culture</tt>.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790218">
-<com:TDateFormat Pattern="fulldate shorttime" />
-</com:TTextHighlighter>
-
-<p id="790647" class="block-content">Anda dapat menetapkan pola kustom menggunakan sub-pola berikut.
-Format tanggal/jam ditetapkan dalam arti pola waktu string. Dalam pola ini, semua huruf ASCII disimpan sebagai huruf pola, yang ditetapkan sebagai berikut:
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790219">
- Simbol Arti Penyajian Contoh
------- ---- --------- ------
- G tanda abad (Teks) AD
- y tahun (Angka) 1996
- M bulan dalam tahun (Teks & Angka) July & 07
- d hari dalam bulan (Angka) 10
- h jam dalam am/pm (1~12) (Angka) 12
- H jam dalam hari (0~23) (Angka) 0
- m menit dalam jam (Angka) 30
- s detik dalam menit (Angka) 55
- E hari dalam minggu (Teks) Tuesday
- D hari dalam tahun (Angka) 189
- F hari minggu dalam bulan (Angka) 2 (2nd Wed in July)
- w minggu dalam tahun (Angka) 27
- W minggu dalam bulan (Angka) 2
- a tanda am/pm (Teks) PM
- k jam dalam hari (1~24) (Angka) 24
- K jam dalam am/pm (0~11) (Angka) 0
- z zona waktu (Jam) Pacific Standard Time
- ' tanda kutip teks (Delimiter) 'Date='
- '' tanda kutip tunggal (Literal) 'o''clock'
-</com:TTextHighlighter>
-</p>
-
-<p id="790648" class="block-content">Jumlah pola huruf menentukan format.</p>
-
-<p id="790649" class="block-content">(Teks): 4 huruf menggunakan bentuk lengkap, kurang dari 4 menggunakan bentuk pendek atau singkatan
-jika ada. (misalnya "EEEE" menghasilkan "Monday", "EEE" menghasilkan "Mon")</p>
-
-<p id="790650" class="block-content">(Angka): jumlah digit minimum. Angka lebih pendek adalah diisi-nol ke jumlah ini (misalnya jika "m" menghasilkan "6", "mm" menghasilkan "06"). Tahun ditangani secara khusus; yakni jika jumlah 'y' adalah 2, Tahun akan dipotong 2 digit. (misalnya jika "yyyy" menghasilkan "1997", "yy" menghasilkan "97".)
- Tidak seperti field lain, pecahan detik dipadatkan pada sisi kanan dengan nol.</p>
-
-<p id="790651" class="block-content">(Teks dan Angka): 3 atau lebih, pakai teks, sebaliknya pakai angka. (misalnya
-"M" menghasilkan "1", "MM" menghasilkan "01", "MMM" menghasilkan "Jan", and "MMMM"
-menghasilkan "January".)</p>
-
-<p id="790652" class="block-content">Setiap karakter dalam pola yang tidak dalam jangkauan ['a'..'z']
-dan ['A'..'Z'] akan diperlakukan sebagai teks bertanda kutip. Contohnya, karakter seperti
-':', '.', ' ', dan '@' akan muncul dalam hasil teks waktu
-meskipun tidak dikurung dalam tanda kutip tunggal.</p>
-
-<p id="790653" class="block-content">Contoh menggunakan lokal US:
-
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790220">
-Pola Formasi Hasil
------------- -----
-"yyyy.MM.dd G 'at' HH:mm:ss" ->> 1996.07.10 AD at 15:08:56
-"EEE, MMM d, ''yy" ->> Wed, Jul 10, '96
-"h:mm a" ->> 12:08 PM
-"hh 'o''clock' a, z" ->> 12 o'clock PM, Pacific Daylight Time
-"K:mm a" ->> 0:00 PM
-"yyyy.MMMM.dd G hh:mm a" ->> 1996.July.10 AD 12:08 PM
-</com:TTextHighlighter>
-</p>
-
-<p id="790654" class="block-content">Jika properti <tt>Value</tt> tidak ditetapkan, tanggal dan jam saat ini yang dipakai.</p>
-
-<h2 id="6212">TNumberFormat</h2>
-<p id="790655" class="block-content">Kerangka kerja Internasionalisasi PRADO menyediakan pembentukan kurs lokal dan pembentukan angka. Harap dicatat bahwa komponen <tt>TNumberFormat</tt> hanya menyediakan pembentukan, saat ini ia tidak melakukan konversi atau pertukaran.</p>
-
-<p id="790656" class="block-content">Numbers can be formatted as currency, percentage, decimal or scientific
-numbers by specifying the <tt>Type</tt> attribute. The valid types are:</p>
-<ul id="u3" class="block-content">
- <li><tt>currency</tt></li>
- <li><tt>percentage</tt></li>
- <li><tt>decimal</tt></li>
- <li><tt>scientific</tt></li>
-</ul>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790221">
-<com:TNumberFormat Type="currency" Value="100" />
-</com:TTextHighlighter>
-
-<p id="790657" class="block-content">Properti <tt>Culture</tt> dan <tt>Currency</tt> dapat ditetapkan untuk membentuk angka spesifik lokal. </p>
-
-<p id="790658" class="block-content">Jika seseorang dari US ingin melihat gambar penjualan dari sebuah toko dalam bahasa Jerman (katakanlah menggunakan kurs EURO), diformat menggunakan kurs jerman, Anda perlu untuk menggunakan atribut <tt>Culture="de_DE"</tt> guna memperoleh kurs yang benar, misalnya 100,00$. Pemisah desimal dan pengelompokan kemudian juga dari lokal <tt>de_DE</tt>. Ini dapat menimbulkan beberapa kebingungan karena orang dari US memakai "," (koma) sebagai pemisah ribuan. Oleh karena itu, atribut <tt>Currency</tt> tersedia agar output dari hasil contoh berikut menghasilkan $100.00
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790222">
-<com:TNumberFormat Type="currency"
- Culture="en_US" Currency="EUR" Value="100" />
-</com:TTextHighlighter>
-</p>
-
-<p id="790659" class="block-content">Properti <tt>Pattern</tt> menetapkan jumlah digit, posisi pengelompokan ribuan, jumlah titik desimal dan posisi desimal. Karakter aktual yang dipakai untuk menyajikan titik desimal dan titik ribuan adalah spesifik kultur dan akan berubah secara otomatis berdasarkan properti <tt>Culture</tt>. Karakter <tt>Pattern</tt> yang benar adalah:</p>
-<ul id="u6" class="block-content">
- <li><tt># (kris)</tt> - mewakili digit opsional</li>
- <li><tt>0 (nol)</tt> - mewakili digit mandatori, nol di kiri terisi</li>
- <li><tt>. (berhenti)</tt> - posisi titik desimal (hanya 1 titik desimal dibolehkan)</li>
- <li><tt>, (koma)</tt> - pemisahan titik ribuan (sampai 2 koma dibolehkan)</li>
-</ul>
-<p id="p2" class="block-content">
-Sebagai contoh, anggap <tt>Value="1234567.12345"</tt> dan dengan
-<tt>Culture="en_US"</tt> (yang menggunakan "," untuk titik pemisah ribuan dan "." untuk pemisah desimal).
-</p>
-<com:TTextHighlighter Language="text" CssClass="source block-content" id="code_790223">
-Pola Output
----- ------
-##,###.00 ->> 1,234,567.12
-##,###.## ->> 1,234,567.12345
-##,##.0000 ->> 1,23,45,67.1235
-##,###,##.0 ->> 12,345,67.1
-000,000,000.0 ->> 001,234,567.1
-</com:TTextHighlighter>
-</p>
-
-<h2 id="6213">TTranslateParameter</h2>
-<p id="790660" class="block-content">Pesan gabungan, misalnya penempatan string, bisa dilakukan dengan <tt>TTranslateParameter</tt>.
-Dalam contoh berikut, string "{greeting}" dan "{name}" masing-masing akan diganti dengan nilai "Hello" dan "World". Penempatan string harus dikurung dengan "{" dan "}". Parameter selanjutnya diterjemahkan dengan menggunakans <tt>TTranslate</tt>.
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790224">
-<com:TTranslate>
- {greeting} {name}!
- <com:TTranslateParameter Key="name">World</com:TTranslateParameter>
- <com:TTranslateParameter Key="greeting">Hello</com:TTranslateParameter>
-</com:TTranslate>
-</com:TTextHighlighter>
-
-
-<a name="choice-format"></a>
-<h2 id="6214">TChoiceFormat</h2>
-
-<p id="790661" class="block-content">Menggunakan fungsi <tt>localize</tt> atau komponen <tt>TTranslate</tt> untuk menerjemahkan pesan tidak memberitahu penerjemah kardinalitas dari data yang diminta untuk menentukan struktur jamak yang benar yang dipakai. Ia hanya memberitahunya bahwa ada data tersedia, data dapat berupa apa saja. Selanjutnya, penerjemah tidak akan bisa menentukan dengan memperhatikan penempatan data plural yang benar, struktur bahasa atau prasa yang dipakai. Misalnya dalam bahasa Inggris, untuk menerjemahkan kalimat, "There are {number} of apples.", hasil terjemahan akan berbeda tergantung pada <tt>jumlah</tt> apel.</p>
-
-<p id="790662" class="block-content">Komponen <tt>TChoiceFormat</tt> melakukan pilihan terjemahan pesan/string. Contoh berikut mendemonstrasikan terjemahan pesan 2 pilihan sederhana.</p>
-
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_790225">
-<com:TChoiceFormat Value="1"/>[1] One Apple. |[2] Two Apples</com:TChoiceFormat>
-</com:TTextHighlighter>
-
-<p id="790663" class="block-content">Dalam contoh di atas, <tt>Value</tt> "1" (satu), kemudian string yang diterjemahkan adalah "One Apple". Jika <tt>Value</tt> adalah "2", maka ia akan menampilkan "Two Apples".</p>
-
-<p id="790664" class="block-content">Pilihan pesan/string dipisashkan oleh pipa "|" diikuti oleh set notasi dari formulir.</p>
-<ul id="u7" class="block-content">
- <li><tt>[1,2]</tt> -- menerima nilai antara 1 dan 2, inklusif.</li>
- <li><tt>(1,2)</tt> -- menerima nilai antara 1 dan 2, kecuali 1 dan 2.</li>
- <li><tt>{1,2,3,4}</tt> -- hanya nilai yang didefinisikan dalam set yang diterima.</li>
- <li><tt>[-Inf,0)</tt> -- menerima nilai lebih besar dari atau sama dengan infinitif negatif dan kurang dari 0</li>
-</ul>
-
-<p id="790665" class="block-content">Setiap kombinasi tidak-kosong dari kurung kotak dan bulat dapat diterima.
-String yang dipilih untuk tampilan tergantung pada properti <tt>Value</tt>. <tt>Value</tt> dievaluiasi untuk setiap set-nya sampai <tt>Value</tt> ditemukan milik set tertentu.</p>
-
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Logging.page b/demos/quickstart/protected/pages/Advanced/id/Logging.page deleted file mode 100755 index 169329a0..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Logging.page +++ /dev/null @@ -1,61 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6101">Pencatatan</h1>
-<p id="780615" class="block-content">
-PRADO menyediakan fungsionalitas sangat fleksibel dan bisa diperluas. Pesan yang dicatat dapat diklasifikasikan berdasarkan tingkat catatan dan kategori pesan. Menggunakan tingkat dan katkegori filter, pesan selanjutnya bisa dialihkan ke tujuan yang berbeda, seperti file, email, jendela browser, dll. Diagram berikut memperlihatkan arsitektur dasar dari mekanisme pencatatan PRADO,
-</p>
-<img src="<%~ logrouter.gif %>" alt="Pengalih catatan" />
-
-<h2 id="6102">Menggunakan Fungsi Pencatatan</h2>
-<p id="780616" class="block-content">
-Dua metode berikut disediakan untuk mencatat pesan dalam PRADO,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_780201">
-Prado::log($message, $logLevel, $category);
-Prado::trace($message, $category);
-</com:TTextHighlighter>
-<p id="780617" class="block-content">
-Perbedaan antara <tt>Prado::log()</tt> dan <tt>Prado::trace()</tt> adalah bahwa yang kedua memilih secara otomatis tingkat catatan berdasarkan mode aplikasi. Jika aplikasi dalam mode <tt>Debug</tt>, informasi pelacakan stack ditambahkan ke pesan. <tt>Prado::trace()</tt> dipakai secara luas dalam kode inti kerangka kerja PRADO.
-</p>
-
-<h2 id="6103">Pengalihan Pesan</h2>
-<p id="780618" class="block-content">
-Pesan yang dicatat menggunakan dua fungsi di atas dipelihara dalam memori. Untuk menggunakan pesan, para pengembang perlu mengalihkannya ke tujuan tertentu seperti file, email, atau jendela browser. Pengalihan pesan diatur oleh modul <tt>System.Util.TLogRouter</tt>. Ketika dimasukan ke dalam aplikasi, ia bisa mengalihkan pesan ke tujuan yang berbeda secara paralel. Saat ini PRADO menyediakan tiga jenis rute:
-</p>
-<ul id="u1" class="block-content">
- <li><tt>TFileLogRoute</tt> - pesan yang disaring disimpan dalam file log yang ditetapkan. Standarnya, file ini bernama <tt>prado.log</tt> di bawah direktori dari aplikasi. Perputaran file disediakan.</li>
- <li><tt>TEmailLogRoute</tt> - pesan yang disaring dikirimkan ke alamat email yang ditetapkan sebelumnya.</li>
- <li><tt>TBrowserLogRoute</tt> - pesan yang disaring ditambahkan ke akhir output halaman saat ini.</li>
-</ul>
-<p id="780619" class="block-content">
-Untuk menghidupkan pengalihan pesan, masukan dan konfigurasi modul <tt>TLogRouter</tt> dalam konfigurasi aplikasi,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_780202">
-<module id="log" class="System.Util.TLogRouter">
- <route class="TBrowserLogRoute"
- Levels="Info"
- Categories="System.Web.UI.TPage, System.Web.UI.WebControls" />
- <route class="TFileLogRoute"
- Levels="Warning, Error"
- Categories="System.Web" />
-</module>
-</com:TTextHighlighter>
-<p id="780620" class="block-content">
-Dalam contoh di atas, <tt>Levels</tt> dan <tt>Categories</tt> menetapkan log dan filter kategori untuk mengambil secara selektif pesan ke tujuan terkait.
-</p>
-
-<h2 id="6104">Penyaringan Pesan</h2>
-<p id="780621" class="block-content">
-Pesan bisa disaring berdasarkan tingkat catatan serta kategorinya. Setiap catatan pesan dikaitkan dengan tingkat dan kategori catatan. Dengan tingkat dan kategori, para pengembang dapat mengambil pesan secara selektif yang menarik bagi mereka.
-</p>
-<p id="780622" class="block-content">
-Tingkat catatan didefinisikan dalam <tt>System.Util.TLogger</tt> termasuk: <tt>DEBUG</tt>, <tt>INFO</tt>, <tt>NOTICE</tt>, <tt>WARNING</tt>, <tt>ERROR</tt>, <tt>ALERT</tt>, <tt>FATAL</tt>. Pesan bisa disaring berdasarkan kriteria tingkat catatan. Sebagai contoh, jika sebuah filter menetapkan tingkat <tt>WARNING</tt> dan <tt>ERROR</tt>, maka hanya pesan tersebut yakni <tt>WARNING</tt> and <tt>ERROR</tt> yang akan dikembalikan.
-</p>
-<p id="780623" class="block-content">
-Kategori pesan adalah hirarkis. Kategori yang namanya awalan dari yang lain disebut leluhur kategori atas kategori lainnya. Sebagai contoh, kategori <tt>System.Web</tt> adalah leluhur dari kategori <tt>System.Web.UI</tt> dan <tt>System.Web.UI.WebControls</tt>. Pesan bisa diambil secara selektif menggunakan filter kategori hirarkis tersebut. Sebagai contoh, jika filter kategori adalah <tt>System.Web</tt>, maka semua pesan dalam <tt>System.Web</tt> dikembalikan. Sebagai tambahan, pesan dalam kategori anak seperti <tt>System.Web.UI.WebControls</tt>, juga dikembalikan.
-</p>
-<p id="780624" class="block-content">
-Dengan ketentuan, pesan yang dicatat dalam kode inti PRADO dikategorikan berdasarkan namespace dari kelas terkait. Sebagai contoh, pesan yang dicatat dalam <tt>TPage</tt> akan menjadi kategori <tt>System.Web.UI.TPage</tt>.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/MasterContent.page b/demos/quickstart/protected/pages/Advanced/id/MasterContent.page deleted file mode 100755 index a5480ce3..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/MasterContent.page +++ /dev/null @@ -1,57 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5801">Master dan Konten</h1>
-<p id="750587" class="block-content">
-Halaman dalam aplikasi Web sering berbagi bagian yang sama. Sebagai contoh, semua halaman dari aplikasi tutorial berbagi bagian header dan footer yang sama. Jika kita menyimpan header dan footer secara berulang dalam setiap file sumber halaman, ia akan memusingkan pemeliharaan jika suatu saat kita menginginkan sesuatu pada header atau footer. Untuk memecahkan masalah ini, PRADO memperkenalkan konsep master dan konten. Ini terutama pola dekorator, dengan konten didekorasi oleh master.
-</p>
-<p id="750588" class="block-content">
-Master dan konten hanya berlaku ke kontrol template (kontrol memperluas <tt>TTemplateControl</tt> atau kelas anaknya). Kontrol template dapat mempunyai paling banyak satu kontrol master dan satu atau beberapa konten (masing-masing diwakili oleh kontrol <tt>TContent</tt>). Konten akan disisipkan ke dalam kontrol master di tempat yang disiapkan oleh kontrol <tt>TContentPlaceHolder</tt>. Dan penyajian kontrol template adalah <tt>TContentPlaceHolder</tt> yang disiapkan kontrol master diganti dengan <tt>TContent</tt>.
-</p>
-<p id="750589" class="block-content">
-Sebagai contoh, anggap kontrol template mempunyai template berikut:
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_750192">
-<%@ MasterClass="MasterControl" %>
-<com:TContent ID="A" >
-content A
-</com:TContent >
-<com:TContent ID="B" >
-content B
-</com:TContent >
-<com:TContent ID="B" >
-content B
-</com:TContent >
-</com:TTextHighlighter>
-<p id="750590" class="block-content">
-yang menggunakan <tt>MasterControl</tt> sebagai kontrol masternya. Kontrol master mempunyai template berikut,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_750193">
-other stuff
-<com:TContentPlaceHolder ID="A" />
-other stuff
-<com:TContentPlaceHolder ID="B" />
-other stuff
-<com:TContentPlaceHolder ID="C" />
-other stuff
-</com:TTextHighlighter>
-<p id="750591" class="block-content">
-Kemudian, konten disisipkan ke dalam kontrol master berdasarkan diagram berikut, sementara hubungan leluhur-anak dapat dilihat dalam berikutnya. Catatan, kontrol template mengabaikan apapun dalam template selain konten, sementara kontrol master memelihara apapun dan mengganti tempat konten dengan konten berdasarkan ID yang sama.
-</p>
-<img src=<%~ mastercontent.gif %> alt="Master dan Konten" />
-<img src=<%~ pcrelation.gif %> alt="Hubungan leluhur-anak antara master dan konten" />
-
-<h2 id="6301">Master vs. Template Eksternal</h2>
-<p id="750592" class="block-content">
-Master sangat mirip dengan template eksternal yang diperkenalkan sejak versi 3.0.5. <a href="?page=Configurations.Templates1">Tag include</a> khusus dipakai untuk menyertakan file template eksternal ke dalam basis template.
-</p>
-<p id="750593" class="block-content">
-Baik template master maupun eksternal bisa dipakai untuk berbagi konten yang sama diantara halaman. Master adalah kontrol template yang berisi konten umum dan file kelasnya berisi logika terkait dengan master. Dilain pihak, template eksternal adalah file template murni tanpa file kelas apapun.
-</p>
-<p id="750594" class="block-content">
-Oleh karena itu, gunakan kontrol master jika konten umum harus dikaitkan dengan beberapa logika, seperti header halaman dengan kotak pencarian atau kotak login. Kontrol master membolehkan Anda untuk menetapkan bagaimana konten umum harus berinteraksi dengan pengguna akhir. Jika Anda menggunakan template eksternal, Anda harus menyimpan logika yang diperlukan dalam halaman atau kelas kontrol yang memiliki basis template.
-</p>
-<p id="750595" class="block-content">
-Performansinya, template eksternal lebih ringan daripada master seperti berisi kontrol sendiri yang berparisipasi dalam masa hidup halaman, karena pembentuk hanya dipakai saat template sedang diuraikan.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Performance.page b/demos/quickstart/protected/pages/Advanced/id/Performance.page deleted file mode 100755 index 68c88bf0..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Performance.page +++ /dev/null @@ -1,88 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6401">Penyesuaian Performansi</h1>
-<p id="810678" class="block-content">
-Performansi aplikasi Web dipengaruhi oleh banyak faktor. Akses database, operasi sistem file, bandwidth jaringan adalah faktor pengaruh potensial. PRADO mencoba dalam setiap usaha untuk mengurangi akibat performansi yang disebabkan oleh kerangka kerja.
-</p>
-
-<h2 id="6402">Caching</h2>
-<p id="810679" class="block-content">
-PRADO menyediakan teknik cache generik yang dipakai oleh beberapa bagian inti kerangka kerja. Sebagai contoh, ketika cache dihidupkan, <tt>TTemplateManager</tt> akan menyimpan template yang diurai dalam cache dan menggunakannya kembali dalam permintaan berikut, yang menghemat waktu penguraian template. <tt>TThemeManager</tt> mengadopsi strategi yang mirip untuk berhadapan dengan penguraian tema.
-</p>
-<p id="810680" class="block-content">
-Menghidupkan cache sangat mudah. Cukup tambahkan modul cache dalam konfigurasi aplikasi, dan PRADO memelihara semuanya.
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810229">
-<modules>
- <module id="cache" class="System.Caching.TSqliteCache" />
-</modules>
-</com:TTextHighlighter>
-
-<p id="810681" class="block-content">
-Para pengembang juga bisa mengambil keuntungan dari teknik cache dalam aplikasinya. Properti <tt>Cache</tt> dari <tt>TApplication</tt> mengembalikan modul cache yang dimasukan bila ia tersedia. Untuk menyimpan dan mengambil item data dari dalam cache, gunakan perintah berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_810230">
-if($application->Cache) {
- // menyimpan item data ke cache
- $application->Cache->set($keyName,$dataItem);
- // mengambil item data dari cache
- $dataItem=$application->Cache->get($keyName);
-}
-</com:TTextHighlighter>
-<p id="810682" class="block-content">
-di mana <tt>$keyName</tt> harus berupa string yang secara unik mengidentifikasi item data yang disimpan dalam cache.
-</p>
-
-<p id="840059" class="block-content">
-Sejak v3.1.0, kontrol baru bernama <a href="?page=Controls.OutputCache">TOutputCache</a> telah diperkenalkan. Kontrol ini membolehkan para pengguna untuk men-cache bagian-bagian dari output halaman. Bila dipakai dengan benar, teknik ini bisa meningkatkan performansi halaman secara signifikan karena kontrol di dalamnya tidak dibuat sama sekali jika versi yang di-cache diminta.
-</p>
-
-<h2 id="6403">Menggunakan <tt>pradolite.php</tt></h2>
-<p id="810683" class="block-content">
-Banyak file naskah PHP yang disertakan dapat mempengaruhi performansi aplikasi secara signifikan. Kelas PRADO disimpan dalam file berbeda dan ketika memproses sebuah permintaan halaman, ia bisa menyertakan puluhan file kelas. Untuk mengurangi masalah ini, setiap rilis PRADO, sebuah file bernama <tt>pradolite.php</tt> juga disertakan. File ini adalah gabungan dari seluruh file kelas inti PRADO dengan komentar dan pencatatan pesannya yang sudah dibuang.
-</p>
-<p id="810684" class="block-content">
-Untuk menggunakan <tt>pradolite.php</tt> dalam naskah entri aplikasi, ganti penyertaan <tt>prado.php</tt> dengan <tt>pradolite.php</tt>.
-</p>
-
-<h2 id="6404">Mengubah Mode Aplikasi</h2>
-<p id="810685" class="block-content">
-Mode aplikasi juga mempengaruhi performansi aplikasi. Aplikasi PRADO dapat berupa salah satu dari mode berikut: <tt>Off</tt>, <tt>Debug</tt>, <tt>Normal</tt> dan <tt>Performance</tt>. Mode <tt>Debug</tt> harus dipakai terutama selama pengembangan aplikasi, sementara mode <tt>Normal</tt> biasanya dipakai dalam tahap berikutnya setelah aplikasi disebarkan guna memastikan semuanya berjalan dengan baik. Setelah aplikasi terbukti bekerja stabil, selanjutnya mode bisa dialihkan ke <tt>Performance</tt> untuk meningkatkan performansi.
-</p>
-<p id="810686" class="block-content">
-Perbedaan antara mode <tt>Debug</tt>, <tt>Normal</tt> dan <tt>Performance</tt> yaitu di bawah mode <tt>Debug</tt>, catatan aplikasi akan berisi informasi debug, dan di bawah mode <tt>Performance</tt>, pemeriksaan cap waktu tidak dilakukan untuk template yang di-cache dan asset yang dipublikasikan. Oleh karena itu, di bawah mode <tt>Performance</tt>, aplikasi mungkin tidak berjalan dengan baik jika template atau asset dimodifikasi. Karena mode <tt>Performance</tt> dipakai terutama saat aplikasi sudah stabil, mengubah template atau asset tidak disukai.
-</p>
-<p id="810687" class="block-content">
-Untuk berganti mode aplikasi, konfigurasi itu dalam konfigurasi aplikasi:
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810231">
-<application Mode="Performance" >
- ......
-</application >
-</com:TTextHighlighter>
-
-<h2 id="6405">Mengurangi Ukuran Halaman</h2>
-<p id="810688" class="block-content">
-Standarnya PRADO menyimpan kondisi halaman dalam field tersembunyi dari output HTML. Kondisi halaman bisa berukuran sangat besar jika menggunakan kontrol yang kompleks, seperti <tt>TDataGrid</tt>. Guna mengurangi ukuran besarnya halaman yang dikirimkan melalui jaringan, dua strategi dapat dipakai.
-</p>
-<p id="810689" class="block-content">
-Pertama, Anda dapat mematikan kondisi tampilan dengan menyetel <tt>EnableViewState</tt> menjadi false untuk halaman atau beberapa kontrol pada halaman jika pengguna tidak perlu berinteraksi dengan halaman/kontrol.
-</p>
-<p id="810690" class="block-content">
-Kedua, Anda bisa menggunakan penyimpanan kondisi halaman berbeda. Sebagai contoh, kondisi halaman bisa disimpan dalam sesi, yang menyimpan kondisi halamaa terutama pada sisi server dan menghemat waktu transmisi jaringan. Properti <tt>StatePersisterClass</tt> dari halaman menentukan kelas persisten kondisi yang dipakai. Standarnya menggunakan <tt>System.Web.UI.TPageStatePersister</tt> untuk menyimpan kondisi persisten dalam field tersembunyi. Anda bisa mengubah properti ini ke kelas persisten Anda sendiri, selama kelas persister menerapkan antarmuka <tt>IPageStatePersister</tt>. Anda dapat mengkonfigurasi properti ini dalam beberapa tempat, seperti konfigurasi aplikasi atau konfigurasi halaman menggunakan tag <pages> or <page>,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_810232">
-<pages StatePersisterClass="MyPersister1" ... >
- <page ID="SpecialPage" StatePersisterClass="MyPersister2" ... />
-</pages>
-</com:TTextHighlighter>
-<p id="810691" class="block-content">
-Catatan, dalam <tt>SpecialPage</tt> di atas akan menggunakan <tt>MyPersister2</tt> sebagai kelas persisternya, sementara halaman lainnya akan menggunakan <tt>MyPersister1</tt>. Oleh karena itu, Anda dapat memiliki strategi perister kondisi untuk halaman yang berbeda.
-</p>
-
-<h2 id="6406">Teknik Lainnya</h2>
-<p id="810692" class="block-content">
-Teknik cache server terbukti sangat efektif meningkatkan performansi aplikasi PRADO. Sebagai contoh, kita telah mengamati bahwa dengan menggunakan Zend Optimizer, RPS (request per second) dari aplikasi PRADO bisa meningkat lebih dari sepuluh kali. Tentunya, ini merupakan harga dari output yang stabil, sementara teknik cache PRADO selalu memastikan kebenaran output.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Scripts.page b/demos/quickstart/protected/pages/Advanced/id/Scripts.page deleted file mode 100755 index 714678ab..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Scripts.page +++ /dev/null @@ -1,334 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6501">Pengenalan Javascript</h1>
-Bimbingan ini berdasarkan pada <a href="http://www.sergiopereira.com/articles/advjs.html">
-Bimbingan cepat bagi tur JavaScript tingkat lanjut dengan beberapa fitur OO</a> oleh Sergio Pereira.
-
-<h2 id="6502">Hey, Saya tidak tahu Anda bisa melakukannya</h2>
-<p id="820693" class="block-content">
- Jika Anda adalah seorang pengembang web developer dan datang dari tempat yang sama seperti saya, Anda mungkin telah mengenal sedikit Javascript dalam halaman web Anda, terutama sebagai perekat UI.
-</p>
-<p id="820694" class="block-content">
-
- Sampai saat ini, saya tahu bahwa Javascript mempunyai kemampuan OO daripada ketika saya dipekerjakan, tetapi saya tidak merasa perlu menggunakannya. Karena browser mulai mendukung set fitur Javascript dan DOM lebih distandarisasikan, itu menjadi semangat untuk menulis kode yang lebih fungsional dan kompleks untuk dijalankan pada klien. Itu membantu kelahiran fenomena AJAX.
-</p>
-<p id="820695" class="block-content">
- Saat kita mulai mempelajari apa yang diperlukan untuk menulis aplikasi AJAX yang baik, kita mulai memperhatikan bahwa Javascript yang kita pakai benar-benar berada di puncak gunung es.
- Sekarang kita melihat Javascript dipakai melampaui pekerjaan UI sehari-hari yang sederhana seperti validasi input dan tugas-tugas kecil. Kode klien sekarang jauh lebih maju dan berlapis, lebih mirip aplikasi desktop sebenarnya atau klien tebal dari klien-server. Kita melihat librari kelas, model obyek, hirarki, pola, dan banyak hal lain yang dapat kita pakai hanya dalam kode di dalam server.
-</p>
-<p id="820696" class="block-content">
- Dalam banyak cata kita dapat mengatakan bahwa dengan tiba-tiba palang ditaruh lebih tinggi dari sebelumnya. Ia mengambil palang pintu lebih ahli menulis aplikasi untuk Web baru dan kita perlu mengingkatkan keahlian Javascript kita agar bisa sampai ke sana.
- Jika Anda mencoba untuk menggunakan banyak librari javascript yang ada di luar sana, seperti
- <a href="http://prototype.conio.net/">Prototipe.js</a>,
- <a href="http://script.aculo.us/">Scriptaculous</a>,
- <a href="http://moofx.mad4milk.net/">moo.fx</a>,
- <a href="http://bennolan.com/behaviour/">Perilaku</a>,
- <a href="http://developer.yahoo.net/yui/">YUI</a>,
- dan lain-lain, Anda secara kebetulan akan menemukan diri Anda sendiri sedang membaca kode JS. Mungkin dikarenakan Anda ingin mempelajari bagaimana mereka melakukannya, atau karena Anda penasaran, atau lebih sering karena itulah satu-satunya cara untuk memahami bagaimana untuk memakainya, karena dokumentasi nampaknya tidak banyak ditujukan terutama terhadap librari ini. Apapun kasusnya, Anda akan menghadapi teknik kung-fu yang akan menjadi asing dan menakutkan jika Anda belum melihat itu sebelumnya.
-</p>
-
-<p id="820697" class="block-content">
- Kegunaan dari artikel ini tepatnya menjelaskan tipe konstruksi yang banyak dari kita belum terbiasa dengannya.
-</p>
-
-
-<h2 id="6503">JSON (JavaScript Object Notation)</h2>
-<p id="820698" class="block-content">
- JavaScript Object Notation (<a href="http://www.json.org/">JSON</a>,) adalah salah satu dari isu baru yang muncul sekitar tema AJAX. JSON, cukup dikatakan suatu cara mendeklarasikan obyek dalam Javascript. Mari kita lihat contoh segera dan perhatikan bagaimana kemudahannya.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820233">
-var myPet = { color: 'black', leg_count: 4, communicate: function(repeatCount){
-for(i=0;i<repeatCount;i++) alert('Woof!');} };
-</com:TTextHighlighter>
-
-<p id="820699" class="block-content">
- Mari kita tambahkan sedikit pembentukan agar terlihat lebih mirip bagaimana kita biasa menemukannya di sana:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820234">
-var myPet =
-{
- color: 'black',
- legCount: 4,
- communicate: function(repeatCount)
- {
- for(i=0;i<repeatCount;i++)
- alert('Woof!');
- }
-};
-</com:TTextHighlighter>
-<p id="820700" class="block-content">
- Di sini kita membuat referensi ke obyek dengan dua properti (<tt>color</tt>
- dan <tt>legCount</tt>) serta metode (<tt>communicate</tt>.)
- Tidak sulit untuk memahami bahwa properti obyek dan metode didefinisikan sebagai daftar dipisahkan koma. Masing-masing anggota diperkenalkan dengan nama, diikuti oleh titik dua dan kemudian definisi. Dalam hal properti, ini cukup mudah, hanya nilai properti. Metode yang dibuat dengan penempatan fungsi anonim, yang akan kami jelaskan lebih baik di bawah baris.
- Setelah obyek dibuat dan ditempatkan ke variabel <tt>myPet</tt>, kita dapat menggunakanya seperti ini:
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820235">
-alert('my pet is ' + myPet.color);
-alert('my pet has ' + myPet.legCount + ' legs');
-//jika Anda anjing, mengonggong tiga kali:
-myPet.communicate(3);
-</com:TTextHighlighter>
-<p id="820701" class="block-content">
- Anda akan melihat JSON banyak dipakai di mana saja dalam JS baru-baru ini, sebagai argumen bagi fungsi, sebagai nilai hasil, sebagai respon server (dalam string,) dll.
-</p>
-
-<h2 id="6504">Apa yang Anda maksud? Fungsi juga adalah sebuah obyek?</h2>
-<p id="820702" class="block-content">
- Ini mungkin tidak biasa bagi para pengembang yang tidak pernah memikirkan tentang itu, tapi dalam fungsi JS adalah sebuah obyek. Anda bisa mengirimkan sebuah fungsi sebagai argumen terhadap fungsi lain sama seperti Anda mengirimkan sebuah string, misalnya. Ini sering dipakai dan siap digunakan.
-</p>
-
-<p id="820703" class="block-content">
- Lihat pada contoh ini. Kami akan mengirimkan fungsi ke fungsi lain yang akan memakainya.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820236">
-var myDog =
-{
- bark: function()
- {
- alert('Woof!');
- }
-};
-
-var myCat =
-{
- meow: function()
- {
- alert('I am a lazy cat. I will not meow for you.');
- }
-};
-
-function annoyThePet(petFunction)
-{
- //let's see what the pet can do
- petFunction();
-}
-
-//ganggu anjing:
-annoyThePet(myDog.bark);
-//ganggu kucing:
-annoyThePet(myCat.meow);
-</com:TTextHighlighter>
-<p id="820704" class="block-content">
- Catatan bahwa kami mengirimkan myDog.bark dan myCat.meow tanpa menambahkan tanda kurung <tt>"()"</tt> kepadanya. Jika kita melakukan itu kita tidak mengirimkan fungsi, sebaliknya kita akan memanggil metode dan mengirimkan nilai hasilnya, <tt>tidak terdefinisi</tt> dalam kedua kasus di sini.
-</p>
-
-<p id="820705" class="block-content">
- Jika Anda ingin membuat kucing malas mulai mengeong, Anda dapat dengan mudah melakukan ini:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820237">
-myCat.meow = myDog.bark;
-myCat.meow(); //alerts 'Woof!'
-</com:TTextHighlighter>
-
-<h2 id="6505">Arrays, items, and object members</h2>
-<p id="820706" class="block-content">
- Dua baris berikut dalam JS melakukan hal yang sama.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820238">
-var a = new Array();
-var b = [];
-</com:TTextHighlighter>
-<p id="820707" class="block-content">
- Karena saya yakin Anda sudah mengetahuinya, anda dapat mengakses item individual dalam sebuah array menggunakan tanda kurung kotak:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820239">
-var a = ['first', 'second', 'third'];
-var v1 = a[0];
-var v2 = a[1];
-var v3 = a[2];
-</com:TTextHighlighter>
-<p id="820708" class="block-content">
-
- Tetapi Anda tidak dibatasi pada indeks numerik. Anda bisa mengakses banyak obyek JS dengan menggunakan namanya, dalam sebuah string. Contoh berikut membuat obyek kosong, dan menambah beberapa anggotanya dengan nama.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820240">
-var obj = {}; //baru, obyek kosong
-obj['member_1'] = 'this is the member value';
-obj['flag_2'] = false;
-obj['some_function'] = function(){ /* lakukan sesuatu */};
-</com:TTextHighlighter>
-<p id="820709" class="block-content">
- Kode di atas mempunyai pengaruh yang sama seperti berikut:
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820241">
-var obj =
-{
- member_1:'this is the member value',
- flag_2: false,
- some_function: function(){ /* lakukan sesuatu */}
-};
-</com:TTextHighlighter>
-
-<p id="820710" class="block-content">
- Dalam banyak cara, ide obyek dan array asosiatif (hashes) dalam JS tidak dibedakan. Dua baris berikut melakukan hal yang sama juga.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820242">
-obj.some_function();
-obj['some_function']();
-</com:TTextHighlighter>
-
-
-<h2 id="6506">Cukup tentang obyek, boleh saya memiliki kelas sekarang?</h2>
-<p id="820711" class="block-content">
-
- Kekuatan besar dari bahasa pemrograman obyek berasal dari pemakaian kelas. Saya tidak berpikir telah menebak bagaimana kelas didefinisikan dalam JS hanya menggunakan pengalaman saya sebelumnya dengan bahasa lainnya. Nilailah bagi diri Anda sendiri.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820243">
-//mendefinisikan kelas baru bernama Pet
-var Pet = function(petName, age)
-{
- this.name = petName;
- this.age = age;
-};
-
-//mari kita membuat obyek dari kelas Pet
-var famousDog = new Pet('Santa\'s Little Helper', 15);
-alert('This pet is called ' + famousDog.name);
-</com:TTextHighlighter>
-<p id="820712" class="block-content">
- Mari kita lihat bagaimana kita menambahkan metode pada kelas <tt>Pet</tt> kita. Kita akan menggunakan properti <tt>prototype</tt> yang dimiliki oleh semua kelas. Properti <tt>prototype</tt> adalah sebuah obyek yang berisi semua anggota yang merupakan obyek yang akan dimiliki oleh kelas.
- Bahkan kelas JS standarnya, seperti <tt>String</tt>, <tt>Number</tt>,
- dan <tt>Date</tt> mempunyai obyek <tt>prototype</tt> yang bisa kita tambah metode serta propertinya dan menjadikan setiap obyek dari kelas itu secara otomatis mendapatkan anggota baru ini.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820244">
-Pet.prototype.communicate = function()
-{
- alert('I do not know what I should say, but my name is ' + this.name);
-};
-</com:TTextHighlighter>
-<p id="820713" class="block-content">
- Itulah saatnya librari seperti <a href="http://www.sergiopereira.com/articles/prototype.js.html">prototype.js</a> siap digunakan. Jika kita menggunakan prototype.js, kita dapat membuat kode kita lebih bersih (setidaknya menurut saya.)
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820245">
-var Pet = Class.create();
-Pet.prototype =
-{
- //'constructor' kita
- initialize: function(petName, age)
- {
- this.name = petName;
- this.age = age;
- },
-
- communicate: function()
- {
- alert('I do not know what I should say, but my name is ' + this.name);
- }
-};
-</com:TTextHighlighter>
-
-<h2 id="6507">Fungsi sebagai argumen, pola yang menarik</h2>
-<p id="820714" class="block-content">
- Jika Anda tidak pernah bekerja dengan bahasa yang mendukung klosur Anda akan mendapatkan idion berikut terlalu busuk.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820246">
-var myArray = ['first', 'second', 'third'];
-myArray.each( function(item, index)
-{
- alert('The item in the position #' + index + ' is:' + item);
-});
-</com:TTextHighlighter>
-<p id="820715" class="block-content">
-
- Wah! Mari kita jelaskan apa yang terjadi di sini sebelum Anda memutuskan saya telah pergi terlalu jauh dan beralih ke artikel yang lebih baik dari yang ini.
-</p>
-<p id="820716" class="block-content">
- Pertama, dalam contoh di atas kita menggunakan librari prototype.js, yang menambahkan setiap fungsi ke kelas array. Setiap fungsi menerima satu argumen yang adalah obyek fungsi. Fungsi ini, silah berganti akan dipanggil sekali untuk setiap item dalam array, mengirimkan dua argumen saat dipanggil, item dan indeks untuk item saat ini. Mari kita panggil fungsi ini sebagai fungsi pengulang kita.
- Kita juga dapat menulis kode seperti ini.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820247">
-function myIterator(item, index)
-{
- alert('The item in the position #' + index + ' is:' + item);
-}
-
-var myArray = ['first', 'second', 'third'];
-myArray.each( myIterator );
-</com:TTextHighlighter>
-<p id="820717" class="block-content">
- Tapi ketika kita tidak ingin melakukan seperti semua anak sekolah, bukan?
- Lebih serius, bagaimanapun juga, format terakhir ini lebih sederhana untuk dimengerti karena kita memasuki kode mencari fungsi myIterator. Adalah baik untuk memiliki logaika fungsi iterator di sana dalam tempat yang sama ia dipanggil. Juga, dalam hal ini, kitak tidak memerlukan fungsi iterator di manapun juga dalam kode kita, maka kita dapat mengubahnya ke dalam fungsi anonim tanpa hukuman.
-</p>
-
-<h2 id="6508"><tt>this</tt> ini tapi kadang-kadang juga <tt>this</tt> itu</h2>
-<p id="820718" class="block-content">
-
- Salah satu masalah yang paling umum yang kita miliki dengan JS adalah saat kita mulai menulis kode kita, itulah kegunaan dari kata kunci <tt>this</tt>. Ini benar-benar menjadi tripwire.
-</p>
-<p id="820719" class="block-content">
- Seperti disebutkan sebelumnya, sebuah fungsi juga adalah sebuah obyek dalam JS, dan adakalanya kita tidak memperhatikan bahwa kita mengirimkan sebuah fungsi.
-</p>
-<p id="820720" class="block-content">
- Ambil potongan kode ini sebagai contoh.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820248">
-function buttonClicked()
-{
- alert('button ' + this.id + ' was clicked');
-}
-
-var myButton = document.getElementById('someButtonID');
-var myButton2 = document.getElementById('someOtherButtonID');
-myButton.onclick = buttonClicked;
-myButton2.onclick = buttonClicked;
-</com:TTextHighlighter>
-<p id="820721" class="block-content">
- Karena fungsi buttonClicked didefinisikan di luar obyek manapun kita cenderung berpikir kata kunci <tt>this</tt> akan berisi referensi ke
- obyek <tt>window</tt> atau <tt>document</tt> (menganggap kode ini ada di tengah halaman HTML yang dilihat dalam browser.)
-</p>
-
-<p id="820722" class="block-content">
- Tapi saat kita menjalankan kode ini kita melihat ia bekerja seperti yang dimaksudkan dan menampilkan <tt>id</tt> dari tombol yang diklik. Apa yang terjadi di sini adalah bahwa kita membuat metode onclick dari setiap tombol yang berisi referensi obyek <tt>buttonClicked</tt>, mengganti apapun yang ada di sana sebelumnya. Sekarang kapan saja tombol diklik, browser akan menjalankan sesuatu mirip dengan baris berikut.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820249">
-myButton.onclick();
-</com:TTextHighlighter>
-<p id="820723" class="block-content">
-
- Itu tidak membingungkan sama sekali bukan? Tapi lihat apa yang terjadi, Anda mulai memiliki obyek lain yang berhadapan dengannya dan Anda ingin betindak pada obyek ini terhadap event seperti klik tombol.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820250">
-var myHelper =
-{
- formFields: [ ],
- emptyAllFields: function()
- {
- for(i=0; i < this.formFields.length; i++)
- {
- var elementID = this.formFields[i];
- var field = document.getElementById(elementID);
- field.value = '';
- }
- }
-};
-
-//beritahu kita ingin bekerja dengan field formulir yang mana
-myHelper.formFields.push('txtName');
-myHelper.formFields.push('txtEmail');
-myHelper.formFields.push('txtAddress');
-
-//membersihkan kotak teks:
-myHelper.emptyAllFields();
-
-var clearButton = document.getElementById('btnClear');
-clearButton.onclick = myHelper.emptyAllFields;
-</com:TTextHighlighter>
-<p id="820724" class="block-content">
- Anda pikir bagus, sekarang saya dapat mengklik tombol Clear pada halaman saya dan tiga kotak teks itu akan dikosongkan. Kemudian Anda mencoba mengklik tombol hanya untuk mendapatkan kesalahan runtime. Kesalahan akan terkait dengan
- (tebak apa?) kata kunci <tt>this</tt>.
- Masalahnya adalah bahwa <tt>this.formFields</tt> tidak didefinisikan jika
- <tt>this</tt> berisi sebuah referensi ke tombol, tepatnya itulah apa yang terjadi. Satu solusi cepat adalah menulis ulang baris kode terakhir.
-</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820251">
-clearButton.onclick = function()
-{
- myHelper.emptyAllFields();
-};
-</com:TTextHighlighter>
-<p id="820725" class="block-content">
- Cara itu kita membuat fungsi baru yang memanggil metode penolong di dalam konteks obyek penolong.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Scripts1.page b/demos/quickstart/protected/pages/Advanced/id/Scripts1.page deleted file mode 100755 index 51535de1..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Scripts1.page +++ /dev/null @@ -1,86 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6601">Catatan Pengembang untuk prototype.js</h1>
-Bimbingan ini didasarkan pada <a href="http://www.sergiopereira.com/articles/prototype.js.html">
-Catatan Pengembang untuk prototype.js</a> oleh Sergio Pereira.
-
-<h2 id="6603">Apa itu?</h2>
-<p id="830726" class="block-content">
-Dalam hal Anda tidak pernah menggunakannya, <a href="http://prototype.conio.net">prototype.js</a> adalah librari
- JavaScript yang ditulis oleh <a href="http://www.conio.net">Sam Stephenson</a>.
- Pemikiran yang hebat ini dan kode <b>sesuai-standar</b> yang ditulis dengan baik mengambil banyak beban terkait dengan pembuatan halaman web sangat interaktif dan kaya yang mengkarakterkan Web 2.0 di belakang Anda.
-</p>
-
-<p id="830727" class="block-content">
- Jika Anda baru saja mencoba menggunakan librari ini, Anda mungkin mencatat bahwa dokumentasi bukanlah salah satu titik yang terkuat. Seperti banyak pengembang lain sebelum saya, saya mempelajari prototype.js dengan membaca kode sumber dan melakukan percobaan denganya. Saya pikir akan baik jika mengambil catatan selama saya mempelajari dan berbagi dengan orang lain.
-</p>
-<p id="830728" class="block-content">
- Setelah Anda membaca contoh dan referensi, para pengembang yang terbiasa dengan bahasa pemrograman Ruby akan mencatat kesamaan maksud antara kelas built-in Ruby dan banyak ekstensi diimplementasikan oleh librari ini.
-</p>
-
-
-<h2 id="6604">Menggunakan fungsi <tt>$()</tt></h2>
-<p id="830729" class="block-content">
- Fungsi <tt>$()</tt> adalah jalan pintas yang siap digunakan untuk fungsi yang semua-terlalu-sering <tt>document.getElementById()</tt> terhadap DOM. Seperti fungsi DOM, fungsi ini mengembalikan elemen yang id-nya dikirimkan sebagai sebuah argumen.
-</p>
-
-<p id="830730" class="block-content">
- Tidak seperti fungsi DOM, bagaimanapun juga, yang satu ini melampauinya. Anda dapat mengirimkan lebih dari satu id dan
- <tt>$()</tt> akan mengembalikan obyek <tt>Array</tt> dengan semua elemen yang diminta. Contoh di bawah seharunya menggambarkan ini.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830252">
-<com:TClientScript UsingClientScripts="prado" />
-<div id="myDiv">
- <p id="830731" class="block-content">This is a paragraph</p>
-</div>
-
-<div id="myOtherDiv">
- <p id="830732" class="block-content">This is another paragraph</p>
-</div>
-
-<input type="button" value=Test1 onclick="test1();" />
-<input type="button" value=Test2 onclick="test2();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test1()
-{
- var d = $('myDiv');
- alert(d.innerHTML);
-}
-
-function test2()
-{
- var divs = $('myDiv','myOtherDiv');
- for(i=0; i<divs.length; i++)
- {
- alert(divs[i].innerHTML);
- }
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-<p id="830733" class="block-content">
- Hal baik lainnya dari fungsi ini adalah bahwa Anda bisa mengirimkan baik string <tt>id</tt> ataupun elemen obyek itu sendiri, yang menjadikan fungsi ini sangat berguna ketika membuat fungsi lain yang juga mengambil bentuk argumen.
-</p>
-
-<h2 id="6605">Menggunakan fungsi <tt>$F()</tt></h2>
-
-<p id="830734" class="block-content">
- Fungsi <tt>$F()</tt> adalah jalan pintas penyambutan lainnya. Ia mengembalikan nilai dari setiap kontrol input field, seperti kotak teks atau daftar drop-down. Fungsi bisa diambil sebagai argumen baik elemen <tt>id</tt> ataupun elemen obyek itu sendiri.
-</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_830253">
-<input type="text" id="userName" value="Joe Doe" />
-<input type="button" value=Test3 onclick="test3();" />
-
-<script type="text/javascript">
-/*<![CDATA[*/
-function test3()
-{
- alert($F('userName'));
-}
-/*]]>*/
-</script>
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Scripts2.page b/demos/quickstart/protected/pages/Advanced/id/Scripts2.page deleted file mode 100755 index 80277628..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Scripts2.page +++ /dev/null @@ -1,214 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6701">Event DOM dan Javascript</h1>
-
-<h2 id="6702">Penanganan event dasar</h2>
-
-<p id="840735" class="block-content">Sintaks untuk bekerja dengan event terlihat seperti kode di bawah.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840254">
-Event.observe(element, name, observer, [useCapture]);
-</com:TTextHighlighter>
-
-<p id="840736" class="block-content">Menganggap untuk saat ini kita ingin mengamati sebuah link yang diklik, kita dapat melakukan yang berikut:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840255">
-// <a id="clicker" href="http://foo.com">Click me</a>
-Event.observe('clicker', 'click', function(event)
-{
- alert('clicked!');
-});
-</com:TTextHighlighter>
-
-<p id="840737" class="block-content">Jika kita menginginkan untuk mendapatkan elemen yang memicu event, kita melakukan ini:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840256">
-Event.observe('clicker', 'click', function(event)
-{
- alert(Event.element(event));
-});
-</com:TTextHighlighter>
-
-<h2 id="6703">Mengamati tekanan tombol</h2>
-
-<p id="840738" class="block-content">Jika kita ingin mengamati tekanan tombol untuk seluruh dokumen, kita dapat melakukan yang berikut:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840257">
-Event.observe(document, 'keypress', function(event)
-{
- if(Event.keyCode(event) == Event.KEY_TAB)
- alert('Tab Pressed');
-});
-</com:TTextHighlighter>
-
-<p id="840739" class="block-content">Dan katakanlah kita ingin melacak apa yang telak diketikan:</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840258">
-Event.observe('search', 'keypress', function(event)
-{
- Element.update('search-results', $F(Event.element(event)));
-});
-</com:TTextHighlighter>
-
-<p id="840740" class="block-content">Prototipe mendefinisikan properti di dalam obyek event untuk beberapa dari tombol yang lebih umum, maka jangan ragu-ragu untuk mencari di sekitar Prototype guna melihat yang mana saja itu.</p>
-
-<p id="840741" class="block-content">Catatan terakhir pada event tekanan tombol; Jika Anda ingin mendeteksi klik kiri, Anda bisa menggunakan <tt>Event.isLeftClick(event)</tt>.</p>
-
-<h2 id="6704">Mendapatkan koordinat dari penunjuk mouse</h2>
-
-<p id="840742" class="block-content">Tarik dan jatuhkan, pengukuran ulang elemen dinamis, permainan, dan lebih banyak lagi, semuanya memerlukan kemampuan untuk melacak lokasi X dan Y dari mouse. Prototipe menjadikan hal ini cukup sederhana. Kode di bawah melacak posisi X dan Y dari mouse dan memindahkan nilainya ke dalam kotak input bernama mouse.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840259">
-Event.observe(document, 'mousemove', function(event)
-{
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
-});
-</com:TTextHighlighter>
-
-<p id="840743" class="block-content">Jika kita ingin mengamati lokasi mouse saat ia melewati elemen tertentu, cukup ubah argumen dokumen ke id atau elemen yang relevan.</p>
-
-<h2 id="6705">Menghentikan Propagasi</h2>
-
-<p id="840744" class="block-content"><tt>Event.stop(event)</tt> akan menghentikan propagasi sebuah event .</p>
-
-<h2 id="6706">Event, Penyatuan, dan Obyek</h2>
-
-<p id="840745" class="block-content">Sejauh ini semuanya sudah jelas, tapi sesuatu mulai menjadi sedikit lebih rumit ketika Anda perlu bekerja dengan event dalam lingkungan obyek-terorientasi. Anda harus berhadapan dengan penyatuan dan sintaks yang terlihat aneh yang memerlukan beberapa waktu bagi Anda untuk mengetahuinya.</p>
-
-<p id="840746" class="block-content">Mari kita lihat pada beberapa kode agar Anda bisa mendapatkan pengertian yang lebih baik atas apa yang sedang saya bicarakan.</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840260">
-EventDispenser = Class.create();
-EventDispenser.prototype =
-{
- initialize: function(list)
- {
- this.list = list;
-
- // Amati klik pada item list kita
- $$(this.list + " li").each(function(item)
- {
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
- }.bind(this));
-
- // Amati saat tombol pada keyboard ditekan.
- // Dalam pengamat, kita memeriksa
- // tombol tab dan memunculkan pesan jika ditekan.
- Event.observe(document, 'keypress', this.onKeyPress.bindEvent(this));
-
- // Amati kotak pencarian kita yang palsu. Ketika pengguna mengetik
- // sesuatu ke dalam kotak, pengamat akan mengambil nilai (-1) itu
- // dan memutakhirkan hasil pencarian div dengannya.
- Event.observe('search', 'keypress', this.onSearch.bindEvent(this));
-
- Event.observe(document, 'mousemove', this.onMouseMove.bindEvent(this));
- },
-
- // Fungsi bebas untuk merespon event
- showTagName: function(event)
- {
- alert(Event.element(event).tagName);
- },
-
- onKeyPress: function(event)
- {
- var code = event.keyCode;
- if(code == Event.KEY_TAB)
- alert('Tab key was pressed');
- },
-
- onSearch: function(event)
- {
- Element.update('search-results', $F(Event.element(event)));
- },
-
- onMouseMove: function(event)
- {
- $('mouse').value = "X: " + Event.pointerX(event) +
- "px Y: " + Event.pointerY(event) + "px";
- }
-}
-</com:TTextHighlighter>
-<p id="840747" class="block-content">Wah! Apa yang terjadi di sini? Kita telah mendefinisikan kelas kustom kita <tt>EventDispenser</tt>. Kita akan menggunakan kelas ini untuk menyiapkan event untuk dokumenkita. Banyak dari kode ini ditulis ulang yang kita lihat di awal kecuali kali ini, kita bekerja dari dalam sebuah obyek.</p>
-
-<p id="840748" class="block-content">Melihat metode <tt>initialize</tt>, sebenarnya kita dapat melihat bagaimana sesuatu menjadi berbeda sekarang. Lihat kode di bawah ini:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840261">
-// Observe clicks on our list items
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagName.bindEvent(this));
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840749" class="block-content">Kita mendapatkan iterator, penyatuan dan semua hal lainnya. Mari kita rinci apa yang dikerjakan kode ini.</p>
-
-<p id="840750" class="block-content">Pertama kita memburu koleksi elemen berdasarkan selektor CSS. Ini menggunakan fungsi selektor Prototipe <tt>$$()</tt>.
-Setelah kita menemukan daftar item kita berhadapan dengan apa yang kita kirim ke dalam setiap iterasi di mana kita akan menambahkan pengamat kita.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840262">
-Event.observe(item, 'click', this.showTagName.bindEvent(this));
-</com:TTextHighlighter>
-
-<p id="840751" class="block-content">Sekarang, melihat kode di atas, Anda akan mencatat fungsi <tt>bindEvent</tt>. Ini mengambil metode sebelumnya <tt>showTagName</tt> dan memperlakukannya sebagai metode yang akan dipicu ketika seseorang mengklik salah satu dari item daftar kita.</p>
-
-<p id="840752" class="block-content">Anda juga akan mencatat bahwa kita mengirimkan ini sebagai argumen ke fungsi <tt>bindEvent</tt>.
-Ini membolehkan kita untuk mereferensi obyek dalam konteks <tt>EventDispenser</tt>
-di dalam fungsi <tt>showTagName(event)</tt> kita. Jika fungsi <tt>showTagName</tt> memerlukan parameter tambahan, Anda melampirkannya ke parameter terakhir dari <tt>bindEvent</tt>. Sebagai contoh</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840263">
-this.showTagName.bindEvent(this, param1, param2);
-
-//di mana fungsi showTagName didefinisikan seperti
-showTime : function (event, param1, param2) { ... }
-</com:TTextHighlighter>
-
-<p id="840753" class="block-content">Selanjutnya, Anda akan melihat <tt>bind(this)</tt> yang dilampirkan ke fungsi iterator.
-Ini sama sekali tidak berkaitan dengan event, ia berada di sini untuk membolehkan saya menggunakan <tt>this</tt> di dalam iterator. Jika kita tidak menggunakan <tt>bind(this)</tt>, saya tidak bisa mereferensi metode <tt>showTagName</tt> di dalam iterator.</p>
-
-<p id="840754" class="block-content">Ok, kita berlanjut untuk melihat metode kita yang sebenarnya dipanggil saat terjadi event. Karena kita sudah berhadapan dengan <tt>showTagName</tt>, mari kita lihat itu.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840264">
-showTagName: function(event)
-{
- alert(Event.element(event).tagName);
-}
-</com:TTextHighlighter>
-
-<p id="840755" class="block-content">Seperti yang Anda lihat, fungsi ini menerima satu argumen--event.
-Agar kita mendapatkan elemen yang memicu event kita perlu mengirimkan argumen ke <tt>Event.element</tt>. Sekarang kita dapat memanipulasinya kapan saja.</p>
-
-<p id="840756" class="block-content">Ini mencakup bagian yang paling membingungkan dari kode kita. Teks di atas juga relevan untuk bagian sisa dari kode kita. Jika ada sesuatu mengenai ini yang tidak Anda mengerti, jangan ragu-ragu untuk mengajukan pertanyaan dalam forum.</p>
-
-<h2 id="6707">Menghapus Pendengar Event</h2>
-
-<p id="840757" class="block-content">Yang satu ini melontarkan saya dari lingkaran untuk pertama kali saya mencoba menggunakannya.
-Saya mencoba sesuatu yang mirip dengan apa yang saya lakukan dalam pemanggilan <tt>Event.observe</tt> dengan kekecualian penggunaan <tt>stopObserving</tt>, tapi tidak ada yang berubah. Dengan kata lain, kode di bawah ini <b>TIDAK</b> bekerja.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840265">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagName);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840758" class="block-content">Apa yang terjadi di sini? Alasan ini tidak bekerja karena tidak ada penunjuk ke pengamat. Ini berarti bahwa ketika kita mengirimkan <tt>this.showTagName</tt> dalam metode <tt>Event.observe</tt> sebelumnya, kita mengirimkannya sebagai fungsi anonim. Kita tidak bisa mereferensi fungsi anonim karena ia tidak mempunyai penunjuk.</p>
-
-<p id="840759" class="block-content">Lalu bagaimana kita yakin pekerjaan diselesaikan? Semua yang kita perlukan adalah memberikan fungsi mengamati penunjuk, atau kelompok versi bebas: Setel variabel yang mengarah ke <tt>this.showTagName</tt>. Ok, mari kita ubah kode kita sedikit.</p>
-
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840266">
-this.showTagObserver = this.showTagName.bindEvent(this);
-
-// Amati klik pada item list kita
-$$(this.list + " li").each(function(item)
-{
- Event.observe(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-<p id="840760" class="block-content">Sekarang kita bisa menghapus pendengar event dari daftar kita seperti ini:</p>
-<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840267">
-$$(this.list + " li").each(function(item)
-{
- Event.stopObserving(item, 'click', this.showTagObserver);
-}.bind(this));
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Scripts3.page b/demos/quickstart/protected/pages/Advanced/id/Scripts3.page deleted file mode 100755 index b313e7fc..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Scripts3.page +++ /dev/null @@ -1,35 +0,0 @@ -<com:TContent ID="body" >
-<h1 id="6801">Javascript dalam PRADO, Pertanyaan dan Jawaban</h1>
-<h2 id="6802">Bagaimana saya menyertakan librari Javascript yang didistribusikan dengan Prado?</h2>
-<p id="880060" class="block-content">Librari javascript yang didistribusikan dengan Prado dapat ditemukan dalam direktori
-<tt>framework/Web/Javascripts/source</tt>. File <tt>packages.php</tt>
-dalam direktori itu mendefinisikan daftar nama paket yang tersedia yang diambil. Itu bisa diambil seperti berikut.
-</p>
-<ul id="u1" class="block-content"><li>Menambahkan librari dalam template
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_850268">
-<com:TClientScript PradoScripts="effects" />
-</com:TTextHighlighter>
- </li>
- <li>Menambahkan librari dalam kode PHP
- <com:TTextHighlighter Language="php" CssClass="source block-content" id="code_850269">
-$this->getPage()->getClientScript()->registerPradoScript("effects");
- </com:TTextHighlighter>
- </li>
-</ul>
-Paket librari yang tersedia disertakan dalam Prado adalah
-<ul id="u2" class="block-content">
- <li><tt>prado</tt> : javascript dasar kerangka kerja PRADO berdasarkan Prototype</li>
- <li><tt>effects</tt> : efek visual dari script.aculo.us</li>
- <li><tt>ajax</tt> : terkait ajax dan callback bedasarkan Prototype</li>
- <li><tt>validator</tt> : validasi</li>
- <li><tt>logger</tt> : pencatat javascript dan browser obyek</li>
- <li><tt>datepicker</tt> : datepicker</li>
- <li><tt>colorpicker</tt> : colorpicker</li>
-</ul>
-
-<p id="850761" class="block-content">Ketergantungan masing-masing librari secara otomatis dipecahkan. Komponen yang memerlukan libari tertentu juga akan secara otomatis mengambil librari yang diperlukan.
-Sebagai contoh, jika Anda menambah komponen <tt>TDatePicker</tt> pada halaman, <tt>datepicker</tt> dan dependensinya akan secara otomatis disertakan pada halaman.</p>
-
-<p id="850762" class="block-content">Lihat <a href="?page=Controls.ClientScript">TClientScript</a> untuk opsi penambahan kode Javascript kustom Anda ke halaman.</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Security.page b/demos/quickstart/protected/pages/Advanced/id/Security.page deleted file mode 100755 index 5e6a8602..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Security.page +++ /dev/null @@ -1,79 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5601">Keamanan</h1>
-
-<h2 id="5602">Perlindungan Kondisi Tampilan</h2>
-<p id="730563" class="block-content">
-Kondisi tampilan berada di jantung PRADO. Kondisi tampilan menggambarkan data yang bisa dipakai untuk menyimpan kembali halaman ke kondisi terakhir kali dilihat oleh pengguna akhir sebelum membuat permintaan saat ini. Standarnya, PRADO menggunakan field tersembunyi untuk menyimpan informasi kondisi tampilan.
-</p>
-<p id="730564" class="block-content">
-Sangat penting untuk memastikan bahwa kondisi tampilan tidak dirusak oleh pengguna akhir. Tanpa perlindungan, pengguna yang jahat bisa menginjeksi kode berbahaya ke dalam kondisi tampilan dan instruksi yang tidak diinginkan yang mungkin dilakukan ketika kondisi halaman sedang dikembalikan pada sisi server.
-</p>
-<p id="730565" class="block-content">
-Untuk mencegah kondisi tampilan dari perusakan, PRADO memaksa kondisi tampilan memeriksa HMAC (Keyed-Hashing for Message Authentication) sebelum menyimpan kembali kondisi tampilan. Pemeriksaan itu bisa mendeteksi apakah kondisi tampilan sudah dirusak atau tidak oleh pengguna akhir. Seandainya kondisi tampilan dimodifikasi, PRADO akan berhenti mengembalikan kondisi tampilan dan mengembalikan pesan kesalahan.
-</p>
-<p id="730566" class="block-content">
-Pemeriksaan HMAC memerlukan kunci pribadi yang harus menjadi rahasia bagi pengguna akhir. Para pengembang dapat menetapkan kunci ataupun membiarkan PRADO membuat kunci secara otomatis. Menetapkan kunci secara manual berguna saat aplikasi berjalan pada taman server. Untuk melakukannya, konfigurasi <tt>TSecurityManager</tt> dalam konfigurasi aplikasi,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_730186">
-<modules>
- <module id="security"
- class="TSecurityManager"
- ValidationKey="my private key" />
-</modules>
-</com:TTextHighlighter>
-<p id="730567" class="block-content">
-Pemeriksaan HMAC tidak mencegah pengguna akhir dari pembacaan konten kondisi tampilan. Ukuran keamanan yang ditambahkanadalah untuk mengenkripsi informasi kondisi tampilan agar pengguna akhir tidak bisa mengurainya. Untuk menghidupkan enkripsi kondisi tampilan, setel <tt>EnableStateEncryption</tt> dari halaman menjadi true. Ini dapat dilakukan dalam <a href="?page=Configurations.PageConfig">konfigurasi halaman</a> atau dalam kode halaman. Catatan, mengenkripsi kondisi tampilan dapat menurunkan performansi aplikasi. Strategi yang lebih baik adalah dengan menyimpan kondisi tampilan pada sisi server daripada field tersembunyi.
-</p>
-
-<h2 id="5603">Pencegahan Penaskahan Situs Silang</h2>
-<p id="730568" class="block-content">
-Penaskahan situs silang (juga dikenal sebagai XSS) terjadi saat aplikasi web mengumpulkan data dari pengguna. Penyerang akan sering menyuntikan JavaScript, VBScript, ActiveX, HTML, atau Flash menjadi aplikasi yang mudah diserang guna mengelabui pengguna aplikasi lain dan mengumpulkan data darinya. Sebagai contoh, Sistem forum yang didesain dengan buruk dapat menampilkan input pengguna dalam tulisan forum tanpa pemeriksaan apapun. Kemudian penyerang bisa menyuntikan beberapa kode jahat JavaScript ke dalam sebuah tulisan agar pengguna lain membaca tulisan ini, JavaScript berjalan tidak seperti yang diharapkan pada komputernya.
-</p>
-<p id="730569" class="block-content">
-Salah satu ukuran paling penting guna mencegah penyerangan XSS adalah memeriksa input pengguna sebelum menampilkannya. Seseorang dapat melakukan pengkodean-HTML dengan input pengguna untuk mencapai tujuan ini. Akan tetapi, dalam beberapa situasi, pengkodean-HTML mungkin tidak disukai karena ia mematikan seluruh tag HTML.
-</p>
-<p id="730570" class="block-content">
-PRADO menyertakan pekerjaan <a href="http://pixel-apes.com/safehtml/">SafeHTML</a> dan menyediakan bagi para pengembang komponen berguna yang disebut <tt>TSafeHtml</tt>. Dengan mengurung konten di dalam tag komponen <tt>TSafeHtml</tt>, konten yang dikurung dipastikan amab bagi pengguna akhir. Sebagai tambahan, <tt>TTextBox</tt> yang umum dipakai memiliki properti <tt>SafeText</tt> yang berisi input pengguna yang dipastikan aman bila ditampilkan secara langsung ke pengguna akhir.
-</p>
-
-<h2 id="5604">Pencegahan Serangan Cookie</h2>
-<p id="730571" class="block-content">
-Melindungi cookie dari serangan adalah sangat penting, karena ID sesi umumnya disimpan dalam cookie. Jika seseorang memegang ID sesi, intinya ia mempunyai semua informasi sesi relevan.
-</p>
-<p id="730572" class="block-content">
-Ada beberapa pengukur guna mencegah cookie dari serangan.
-</p>
-<ul id="u1" class="block-content">
- <li>Aplikasi dapat menggunakan SSL untuk membuat kanal komunikasi aman dan hanya mengirimkan cookie otentikasi melalui sambungan HTTPS. Para penyerang selanjutnya melakukan decipher isi dalam cookie yang dikirimkan.</li>
- <li>Sesi berakhir secara tidak benar, termasuk semua token cookie dan sesi, untuk mengurangi kemungkinan penyerangan.</li>
- <li>Mencegah penaskahan situs-silang (XSS) yang menyebabkan kode sesukanya berjalan dalam browser pengguna dan memunculkan cookie-nya.</li>
- <li>Memvalidasi data cookie dan mendeteksi apakah cookie diubah atau tidak.</li>
-</ul>
-<p id="730573" class="block-content">
-PRADO menertapkan skema validasi cookie yang mencegah cookie dimodifikasi. Dalam keadaan tertentu, ia melakukan pemeriksaan HMAC untuk nilai cookie jika validasi cookie dihidupkan.
-</p>
-<p id="730574" class="block-content">
-Validasi cookie standarnya dimatikan. Untuk menghidupkannya, konfigurasi modul <tt>THttpRequest</tt> seperti berikut,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_730187">
-<modules>
- <module id="request" class="THttpRequest" EnableCookieValidation="true" />
-</modules>
-</com:TTextHighlighter>
-<p id="730575" class="block-content">
-Untuk menggunakan skema validasi cookie yang disediakan oleh PRADO, Anda juga perlu mengambil cookie melalui koleksi <tt>Cookies</tt> dari <tt>THttpRequest</tt> dengan menggunakan pernyataan PHP berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_730188">
-foreach($this->Request->Cookies as $cookie)
- // $cookie adalah tipe THttpCookie
-</com:TTextHighlighter>
-<p id="730576" class="block-content">
-Untuk mengirimkan data cookie yang dikode dengan informasi validasi, buat obyek <tt>THttpCookie</tt> baru dan menambahkannya ke koleksi <tt>Cookies</tt> dari <tt>THttpResponse</tt>,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_730189">
-$cookie=new THttpCookie($name,$value);
-$this->Response->Cookies[]=$cookie;
-</com:TTextHighlighter>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/State.page b/demos/quickstart/protected/pages/Advanced/id/State.page deleted file mode 100755 index 42c5a0c4..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/State.page +++ /dev/null @@ -1,54 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="6001">Kondisi Persisten</h1>
-<p id="770606" class="block-content">
-Aplikasi Web sering memerlukan untuk mengingat apa yang pengguna akhir kerjakan dalam permintaan halaman sebelumnya agar permintaan halaman baru bisa dilayani sesuai dengan itu. Persisten kondisi untuk menangani masalah ini. Secara tradisional, jika halaman perlu memelihara interaksi pengguna, ia akan mengurut ulang sesi, cookie, atau field tersembunyi. PRADO menyediakan baris baru skema kondisi persisten, termasuk kondisi tampilan, kondisi kontrol, dan kondisi aplikasi.
-</p>
-
-<h2 id="6002">Kondisi Tampilan</h2>
-<p id="770607" class="block-content">
-Kondisi tampilan berada di jantung PRADO. Dengan kondisi tampilan, halaman Web menjadi tangguh dan mampu menyimpan kembali halaman ke kondisi terakhir kali pengguna akhir berinteraksi sebelum permintaan halaman saat ini. Pemrograman Web mirip dengan pemrograman GUI Windows, dan para pengembang dapat berpikir secara kontinyu tanpa mencemaskan mengenai perjalanan pulang pergi antara pengguna akhir dan server web. Sebagai contoh, dengan kondisi tampilan, sebuah kontrol kotak centang dapat mendeteksi apakah input pengguna mengubah konten dalam kotak centang atau tidak.
-</p>
-<p id="770608" class="block-content">
-Kondisi tampilan hanya tersedia untuk kontrol. Kondisi tampilan dari kontrol bisa dimatikan dengan menyetel properti <tt>EnableViewState</tt> menjadi false. Untuk menyimpan variabel dalam kondisi tampilan, panggil yang berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770197">
-$this->setViewState('Caption',$caption);
-</com:TTextHighlighter>
-<p id="770609" class="block-content">
-di mana <tt>$this</tt> merujuk ke obyek kontrol, <tt>Caption</tt> adalah kunci unik yang mengidentifikasi variabel <tt>$caption</tt> yang disimpan dalam kondisi tampilan. Untuk mengambil variabel kembali dari kondisi tampilan, panggil yang berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770198">
-$caption = $this->getViewState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6003">Kondisi Kontrol</h2>
-<p id="770610" class="block-content">
-Kondisi kontrol mirip dengan kondisi tampilan dalam setiap aspek kecuali bahwa kondisi kontrol tidak bisa dimatikan. Kondisi kontrol bertujuan dipakai untuk menyimpan informasi kondisi krusial halaman atau kontrol mana yang tidak bekerja dengan baik.
-</p>
-<p id="770611" class="block-content">
-Untuk menyimpan dan mengambil variabel dalam kondisi kontrol, gunakan perintah berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770199">
-$this->setControlState('Caption',$caption);
-$caption = $this->getControlState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6004">Kondisi Aplikasi</h2>
-<p id="770612" class="block-content">
-Kondisi aplikasi merujuk ke data yang persisten melalui sesi pengguna dan permintaan halaman. Contoh umum dari kondisi aplikasi adalah penghitung kunjungan pengguna. Nilai penghitung adalah persisten meskipun sesi pengguna saat ini berakhir. Catatan, kondisi tampilan dan kondisi kontrol hilang jika permintaan pengguna untuk halaman yang berbeda, karena kondisi sesi hilang jika sesi pengguna berakhir.
-</p>
-<p id="770613" class="block-content">
-Untuk menyimpan dan mengambil variabel dalam kondisi aplikasi, gunakan perintah berikut,
-</p>
-<com:TTextHighlighter CssClass="source block-content" id="code_770200">
-$application->setGlobalState('Caption',$caption);
-$caption = $application->getGlobalState('Caption');
-</com:TTextHighlighter>
-
-<h2 id="6005">Kondisi Sesi</h2>
-<p id="770614" class="block-content">
-PRADO melapisi manajemen sesi tradisional dalam modul <tt>THttpSession</tt>. Modul dapat diakses dari dalam setiap komponen dengan menggunakan <tt>$this->Session</tt>, di mana <tt>$this</tt> merujuk ke obyek komponen.
-</p>
-
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/Themes.page b/demos/quickstart/protected/pages/Advanced/id/Themes.page deleted file mode 100755 index 5a917484..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/Themes.page +++ /dev/null @@ -1,60 +0,0 @@ -<com:TContent ID="body" >
-
-<h1 id="5901">Tema dan Skin</h1>
-
-<h2 id="5902">Pengenalan</h2>
-<p id="760596" class="block-content">
-Tema dalam PRADO menyediakan cara bagi para pengembang untuk menyediakan tampilan konsisten melintasi seluruh aplikasi web. Tema berisi daftar nilai awal untuk properti dari berbagai tipe kontrol. Ketika menerapkan tema ke sebuah halaman, semua kontrol dalam halaman tersebut akan menerima nilai properti awal terkait dari tema. Ini membolehkan tema untuk berinteraksi dengan seti properti yang banyak dari berbagai kontrol PRADO, berarti bahwa tema bisa dipakai untuk menetapkan jangkauan besar dari properti penyajian yang tidak bisa dilakukan metode tema lain (misaslnya CSS). Sebagai contoh, tema bisa dipakai untuk menetapkan ukuran standar halaman dari semua grid data melintasi aplikasi dengan menetapkan nilai standar untuk properti <tt>PageSize</tt> dari kontrol <tt>TDataGrid</tt>.
-</p>
-
-<h2 id="5903">Memahami Tema</h2>
-<p id="760597" class="block-content">
-Tema adalah sebuah direktori yang terdiri dari file skin, file javascript dan file CSS. Setiap file javascript atau CSS yang berada dalam tema akan diregistrasi dengan halaman yang menerapkan tema. Skin adalah set nilai properti awal untuk tipe kontrol tertentu. Tipe kontrol dapat memiliki satu atau beberapa skin, masing-masing diidentifikasi dengan <tt>SkinID</tt> unik. Ketika menerapkan tema ke sebuah halaman, skin diterapkan ke kontrol jika tipe kontrol dan nilai <tt>SkinID</tt> keduanya sama dengan ada dalam skin. Catatan, jika skin memiliki nilai <tt>SkinID</tt> kosong, ia akan menerapkannya ke semua kontrol dari tipe tertentu yang <tt>SkinID</tt>-nya tidak disetel atau kosong. File skin terdiri dari satu atau beberapa skin, untuk satu atau beberapa tipe kontrol. Tema adalah gabungan dari skin yang didefinisikan dalam semua file skin.
-</p>
-
-<h2 id="5904">Menggunakan Tema</h2>
-<p id="760598" class="block-content">
-Untuk menggunakan sebuah tema, Anda perlu menyetel properti <tt>Theme</tt> dari halaman dengan nama tema, yaitu nama direktori tema. Anda dapat menyetelnya dalam <a href="?page=Configurations.PageConfig">konfigurasi halaman</a> atau dalam konstruktor atau metode <tt>onPreInit()</tt> dari halaman. Anda tidak bisa menyetel properti setelah <tt>onPreInit()</tt> karena saat itu, kontrol anak dari halaman sudah dibuat (skin harus diterapkan ke kontrol setelah kontrol tersebut dibuat.)
-</p>
-<p id="760599" class="block-content">
-Untuk menggunakan skin tertentu dalam tema untuk sebuah kontrol, setel properti <tt>SkinID</tt> dari kontrol dalam template seperti berikut,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_760194">
-<com:TButton SkinID="Blue" ... />
-</com:TTextHighlighter>
-<p id="760600" class="block-content">
-Ini akan menerapkan skin 'Blue' ke tombol. Catatan, nilai properti awal yang ditetapkan oleh skin 'Blue' akan mengganti setiap nilai properti tombol. Gunakan tema stylesheet jika Anda tidak ingi diganti. Untuk menggunakan tema stylesheet, setel properti <tt>StyleSheetTheme</tt> dari halaman daripada <tt>Theme</tt> (Anda bisa memiliki keduanya <tt>StyleSheetTheme</tt> dan <tt>Theme</tt>).
-</p>
-<p id="760601" class="block-content">
-Untuk menggunakan file Javascript dan file CSS yang berada dalam sebuah tema, kontrol <tt>THead</tt> harus ditempatkan pada template halaman. Ini dikarenakan tema akan meregistrasi file itu dengan halaman dan <tt>THead</tt> adalah tempat yang tepat untuk menempatkan mengambil file tersebut.
-</p>
-<p id="760602" class="block-content">
-Dimungkinkan untuk menetapkan tipe media dari file CSS yang berisikan sebuah tema. Standarnya, file CSS berlaku untuk semua tipe media. Jika file CSS bernama seperti <tt>mystyle.print.css</tt>, ia akan diterapkan hanya pada tipe media <tt>print</tt>. Sebagai contoh lain, <tt>mystyle.screen.css</tt> hanya berlaku untuk media <tt>screen</tt>, dan <tt>mystyle.css</tt> berlaku bagi semua tipe media.
-</p>
-
-<h2 id="5905">Penyimpanan Tema</h2>
-<p id="760603" class="block-content">
-Semua tema standarnya harus ditempatkan di bawah direktori <tt>[AppEntryPath]/themes</tt>, di mana <tt>AppEntryPath</tt> merujuk ke direktori yang berisi naskah entri aplikasi. Jika Anda ingin menggunakan direktori berbeda, konfigurasi properti <tt>BasePath</tt> dan <tt>BaseUrl</tt> dari modul <tt>System.Web.UI.TThemeManager</tt> dalam konfigurasi aplikasi,
-</p>
-<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_760195">
-<service id="page" class="TPageService">
- <modules>
- <module id="theme"
- class="System.Web.UI.TThemeManager"
- BasePath="mythemes"
- BaseUrl="mythemes" />
- </modules>
-</service>
-</com:TTextHighlighter>
-
-<h2 id="5906">Membuat Tema</h2>
-<p id="760604" class="block-content">
-Membuat sebuah tema melibatkan pembuatan direktori tema dan penulisan file skin (dan kemungkinan file Javascript serta CSS). Nama file skin harus diakhiri dengan <tt>.skin</tt>. Format file skin adalah sama seperti file template kontrol. Karena file skin tidak mendefinisikan penyajian hubungan leluhur-aak diantara kontrolnya, Anda tidak bisa menempatkan tag komponen di dalam yang lainnya. Dan setiap teks statis antara tag komponen diabaikan. Untuk mendefinisikan skin 'Blue' seperti telah disebutkan di atas untuk <tt>TButton</tt>, tulis yang berikut dalam file skin,
-</p>
-<com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_760196">
-<com:TButton SkinID="Blue" BackColor="blue" />
-</com:TTextHighlighter>
-<p id="760605" class="block-content">
-Seperti sudah disebutan di atas, Anda dapat menyimpan beberapa skin dalam satu file skin, atau memisahkannya ke dalam beberapa file. Strategi yang umum digunakan adalah bahwa setiap file skin hanya berisi skin untuk satu tipe kontrol. Sebagai contoh, <tt>Button.skin</tt> akan berisi skin hanya untuk tipe kontrol <tt>TButton</tt>.
-</p>
-</com:TContent>
diff --git a/demos/quickstart/protected/pages/Advanced/id/exception.gif b/demos/quickstart/protected/pages/Advanced/id/exception.gif Binary files differdeleted file mode 100755 index 93b1a07f..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/exception.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/id/exception2.gif b/demos/quickstart/protected/pages/Advanced/id/exception2.gif Binary files differdeleted file mode 100755 index 5fe0e625..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/exception2.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/id/logrouter.gif b/demos/quickstart/protected/pages/Advanced/id/logrouter.gif Binary files differdeleted file mode 100755 index 5a74dfe1..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/logrouter.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/id/mastercontent.gif b/demos/quickstart/protected/pages/Advanced/id/mastercontent.gif Binary files differdeleted file mode 100755 index 9354d65c..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/mastercontent.gif +++ /dev/null diff --git a/demos/quickstart/protected/pages/Advanced/id/pcrelation.gif b/demos/quickstart/protected/pages/Advanced/id/pcrelation.gif Binary files differdeleted file mode 100755 index c1960d74..00000000 --- a/demos/quickstart/protected/pages/Advanced/id/pcrelation.gif +++ /dev/null |