diff options
Diffstat (limited to 'demos/quickstart/protected')
13 files changed, 290 insertions, 6 deletions
| diff --git a/demos/quickstart/protected/controls/TopicList.tpl b/demos/quickstart/protected/controls/TopicList.tpl index 35c062d2..d23359bc 100644 --- a/demos/quickstart/protected/controls/TopicList.tpl +++ b/demos/quickstart/protected/controls/TopicList.tpl @@ -16,6 +16,8 @@  <a href="?page=Fundamentals.Modules">Modules</a><br/>
  <a href="?page=Fundamentals.Services">Services</a><br/>
  <a href="?page=Fundamentals.Applications">Applications</a><br/>
 +<a href="?page=Fundamentals.HelloWorld">Sample: Hello World</a><br/>
 +<a href="?page=Fundamentals.Hangman">Sample: Hangman Game</a><br/>
  </div>
  <div class="topic">
 @@ -29,12 +31,6 @@  </div>
  <div class="topic">
 -<span>Samples</span><br/>
 -<a href="?page=Samples.HelloWorld">Hello World</a><br/>
 -<a href="?page=Samples.Hangman">Hangman Game</a><br/>
 -</div>
 -
 -<div class="topic">
  <span>Controls</span><br/>
  <a href="?page=Controls.Overview">Overview</a><br/>
  <a href="?page=Controls.Simple">Simple HTML Controls</a><br/>
 diff --git a/demos/quickstart/protected/pages/Fundamentals/Hangman.page b/demos/quickstart/protected/pages/Fundamentals/Hangman.page new file mode 100644 index 00000000..d73868a0 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Hangman.page @@ -0,0 +1,15 @@ +<com:TContent ID="body" >
 +
 +<h1>Sample: Hangman Game</h1>
 +<p>
 +Having seen the simple "Hello World" application, we now build a more complex application called "Hangman Game". In this game, the player is asked to guess a word, a letter at a time. If he guesses a letter right, the letter will be shown in the word. The player can continue to guess as long as the number of his misses is within a prespecified bound. The player wins the game if he finds out the word within the miss bound, or he loses.
 +</p>
 +<p>
 +To facilitate the building of this game, we show the state transition diagram of the gaming process in the following,
 +</p>
 +<p>
 +To be continued...
 +</p>
 +<com:RunBar PagePath="Fundamentals.Samples.Hangman.Home" />
 +
 +</com:TContent>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/HelloWorld.page b/demos/quickstart/protected/pages/Fundamentals/HelloWorld.page new file mode 100644 index 00000000..b543afb7 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/HelloWorld.page @@ -0,0 +1,25 @@ +<com:TContent ID="body" >
 +<h1>Sample: Hello World</h1>
 +<p>
 +"Hello World" perhaps is the simplest <i>interactive</i> PRADO application that you can build. It displays to end-users a page with a submit button whose caption is <i>Click Me</i>. When the user clicks on the button, the button changes the caption to <i>Hello World</i>.
 +</p>
 +<p>
 +There are many approaches that can achieve the above goal. One can submit the page to the server, examine the POST variable, and generate a new page with the button caption updated. Or one can simply use JavaScript to update the button caption upon its <i>onclick</i> event.
 +</p>
 +<p>
 +PRADO promotes component-based and event-driven Web programming. The button is represented by a <i>TButton</i> object. It encapsulates the button caption as the <i>Text</i> property and associates the user button click action with a server-side <i>Click</i> event. Therefore, the "Hello World" task can be handled intuitively and easily. One simply needs to attach a function to the button's <i>Click</i> event. Within the function, the button's <i>Text</i> property is modified as "Hello World". The following diagram shows the above sequence,
 +</p>
 +<img src="<%~Samples/HelloWorld/sequence.gif%>" />
 +<p>
 +The code that a developer needs to write is merely the following event handler function, where <tt>$sender</tt> refers to the button object.
 +</p>
 +<pre class="source">
 +public function buttonClicked($sender,$param)
 +{
 +	$sender->Text="Hello World";
 +}
 +</pre>
 +
 +<com:RunBar PagePath="Fundamentals.Samples.HelloWorld.Home" />
 +
 +</com:TContent>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.page b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.page new file mode 100644 index 00000000..31058fa5 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.page @@ -0,0 +1,64 @@ +<%@ Title="Hangman Game" %>
 +<com:TContent ID="body">
 +
 +<h1>Hangman Game</h1>
 +
 +<com:TPanel ID="IntroPanel">
 +<p>This is the game of Hangman. You must guess a word, a letter at a time.
 +If you make too many mistakes, you lose the game!</p>
 +<com:TRadioButton ID="EasyLevel" GroupName="level" Text="Easy game; you are allowed 10 misses." /><br/>
 +<com:TRadioButton ID="MediumLevel" GroupName="level" Text="Medium game; you are allowed 5 misses." /><br/>
 +<com:TRadioButton ID="HardLevel" GroupName="level" Text="Hard game; you are only allowed 3 misses." /><br/>
 +<com:TButton Text="Play!" Click="selectLevel" />
 +<com:TLabel ID="LevelError" Text="You must choose a difficulty level!" ForeColor="red" Visible="false" />
 +</com:TPanel>
 +
 +<com:TPanel ID="GuessPanel" Visible="false">
 +<h2>Please make a guess</h2>
 +<h3 style="letter-spacing: 4px;"><%= $this->Page->GuessWord %></h3>
 +<p>You have made <%=$this->Page->Misses %> bad guesses
 +out of a maximum of <%= $this->Page->Level %>.</p>
 +<p>Guess:
 +<com:TLinkButton ID="GuessA" Text="A" Click="guessWord" />
 +<com:TLinkButton ID="GuessB" Text="B" Click="guessWord" />
 +<com:TLinkButton ID="GuessC" Text="C" Click="guessWord" />
 +<com:TLinkButton ID="GuessD" Text="D" Click="guessWord" />
 +<com:TLinkButton ID="GuessE" Text="E" Click="guessWord" />
 +<com:TLinkButton ID="GuessF" Text="F" Click="guessWord" />
 +<com:TLinkButton ID="GuessG" Text="G" Click="guessWord" />
 +<com:TLinkButton ID="GuessH" Text="H" Click="guessWord" />
 +<com:TLinkButton ID="GuessI" Text="I" Click="guessWord" />
 +<com:TLinkButton ID="GuessJ" Text="J" Click="guessWord" />
 +<com:TLinkButton ID="GuessK" Text="K" Click="guessWord" />
 +<com:TLinkButton ID="GuessL" Text="L" Click="guessWord" />
 +<com:TLinkButton ID="GuessM" Text="M" Click="guessWord" />
 +<com:TLinkButton ID="GuessN" Text="N" Click="guessWord" />
 +<com:TLinkButton ID="GuessO" Text="O" Click="guessWord" />
 +<com:TLinkButton ID="GuessP" Text="P" Click="guessWord" />
 +<com:TLinkButton ID="GuessQ" Text="Q" Click="guessWord" />
 +<com:TLinkButton ID="GuessR" Text="R" Click="guessWord" />
 +<com:TLinkButton ID="GuessS" Text="S" Click="guessWord" />
 +<com:TLinkButton ID="GuessT" Text="T" Click="guessWord" />
 +<com:TLinkButton ID="GuessU" Text="U" Click="guessWord" />
 +<com:TLinkButton ID="GuessV" Text="V" Click="guessWord" />
 +<com:TLinkButton ID="GuessW" Text="W" Click="guessWord" />
 +<com:TLinkButton ID="GuessX" Text="X" Click="guessWord" />
 +<com:TLinkButton ID="GuessY" Text="Y" Click="guessWord" />
 +<com:TLinkButton ID="GuessZ" Text="Z" Click="guessWord" />
 +</p>
 +<p><com:TLinkButton Text="Give up?" Click="giveUp" /></p>
 +</com:TPanel>
 +
 +<com:TPanel ID="WinPanel" Visible="false">
 +<h2>You Win!</h2>
 +<p>The word was: <%= $this->Page->Word %>.</p>
 +<p><com:TLinkButton Text="Start Again" Click="startAgain" /></p>
 +</com:TPanel>
 +
 +<com:TPanel ID="LosePanel" Visible="false">
 +<h2>You Lose!</h2>
 +<p>The word was: <%= $this->Page->Word %>.</p>
 +<p><com:TLinkButton Text="Start Again" Click="startAgain" /></p>
 +</com:TPanel>
 +
 +</com:TContent>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.php b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.php new file mode 100644 index 00000000..93028573 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/Home.php @@ -0,0 +1,135 @@ +<?php
 +
 +class Home extends TPage
 +{
 +	const EASY_LEVEL=10;
 +	const MEDIUM_LEVEL=5;
 +	const HARD_LEVEL=3;
 +
 +	public function selectLevel($sender,$param)
 +	{
 +		if($this->EasyLevel->Checked)
 +			$this->Level=self::EASY_LEVEL;
 +		else if($this->MediumLevel->Checked)
 +			$this->Level=self::MEDIUM_LEVEL;
 +		else if($this->HardLevel->Checked)
 +			$this->Level=self::HARD_LEVEL;
 +		else
 +		{
 +			$this->LevelError->Visible=true;
 +			return;
 +		}
 +
 +		$this->Word=$this->generateWord();
 +		$this->GuessWord=str_repeat('_',strlen($this->Word));
 +		$this->Misses=0;
 +		$this->showPanel('GuessPanel');
 +	}
 +
 +	public function guessWord($sender,$param)
 +	{
 +		$sender->Enabled=false;
 +		$letter=$sender->Text;
 +		$word=$this->Word;
 +		$guessWord=$this->GuessWord;
 +		$pos=0;
 +		$success=false;
 +		while(($pos=strpos($word,$letter,$pos))!==false)
 +		{
 +			$guessWord[$pos]=$letter;
 +			$success=true;
 +			$pos++;
 +		}
 +		if($success)
 +		{
 +			$this->GuessWord=$guessWord;
 +			if($guessWord===$word)
 +				$this->showPanel('WinPanel');
 +		}
 +		else
 +		{
 +			$this->Misses++;
 +			if($this->Misses>=$this->Level)
 +				$this->giveUp(null,null);
 +		}
 +	}
 +
 +	public function giveUp($sender,$param)
 +	{
 +		$this->showPanel('LosePanel');
 +	}
 +
 +	public function startAgain($sender,$param)
 +	{
 +		$this->showPanel('IntroPanel');
 +		$this->LevelError->Visible=false;
 +		for($letter=65;$letter<=90;++$letter)
 +		{
 +			$guessLetter='Guess'.chr($letter);
 +			$this->$guessLetter->Enabled=true;
 +		}
 +	}
 +
 +	protected function generateWord()
 +	{
 +		$wordFile=dirname(__FILE__).'/words.txt';
 +		$words=preg_split("/[\s,]+/",file_get_contents($wordFile));
 +		do
 +		{
 +			$i=rand(0,count($words)-1);
 +			$word=$words[$i];
 +		} while(strlen($word)<5 || !preg_match('/^[a-z]*$/i',$word));
 +		return strtoupper($word);
 +	}
 +
 +	protected function showPanel($panelID)
 +	{
 +		$this->IntroPanel->Visible=false;
 +		$this->GuessPanel->Visible=false;
 +		$this->WinPanel->Visible=false;
 +		$this->LosePanel->Visible=false;
 +		$this->$panelID->Visible=true;
 +	}
 +
 +	public function setLevel($value)
 +	{
 +		$this->setViewState('Level',$value,0);
 +	}
 +
 +	public function getLevel()
 +	{
 +		return $this->getViewState('Level',0);
 +	}
 +
 +	public function setWord($value)
 +	{
 +		$this->setViewState('Word',$value,'');
 +	}
 +
 +	public function getWord()
 +	{
 +		return $this->getViewState('Word','');
 +	}
 +
 +	public function getGuessWord()
 +	{
 +		return $this->getViewState('GuessWord','');
 +	}
 +
 +	public function setGuessWord($value)
 +	{
 +		$this->setViewState('GuessWord',$value,'');
 +	}
 +
 +	public function setMisses($value)
 +	{
 +		$this->setViewState('Misses',$value,0);
 +	}
 +
 +	public function getMisses()
 +	{
 +		return $this->getViewState('Misses',0);
 +	}
 +}
 +
 +?>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/sequence.vsd b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/sequence.vsdBinary files differ new file mode 100644 index 00000000..4a55d8b7 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/sequence.vsd diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/words.txt b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/words.txt new file mode 100644 index 00000000..80814580 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/Hangman/words.txt @@ -0,0 +1,27 @@ +This program is free software; you can redistribute it and/or
 +modify it under the terms of the GNU General Public License
 +as published by the Free Software Foundation.
 +
 +This program is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +PRADO is an event-driven and component-based framework
 +for Web application development in PHP 5.
 +
 +Components following the PRADO protocol are highly
 +configurable and reusable. Properties defining
 +the basic features of a component can be configured 
 +in specifications, templates or code. 
 +New components can be developed by either inheriting
 +an existing component class or composing several
 +components together. The work of using a component 
 +amounts to placing the component tag on the page template, 
 +configuring component properties, and writing handler 
 +functions to respond to component events.
 +
 +PRADO shares many similarities with ASP.NET and other
 +RAD tools for Windows GUI development, such as Borland Delphi.
 +In particular, it supports event-driven programming,
 +viewstate maintenance, javascript, template, form validations, etc.
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.page b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.page new file mode 100644 index 00000000..8931dad6 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.page @@ -0,0 +1,6 @@ +<%@ Title="Hello World" %>
 +<com:TContent ID="body">
 +
 +<com:TButton Text="Click Me" Click="buttonClicked" />
 +
 +</com:TContent>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.php b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.php new file mode 100644 index 00000000..b1a7f991 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/Home.php @@ -0,0 +1,11 @@ +<?php
 +
 +class Home extends TPage
 +{
 +	public function buttonClicked($sender,$param)
 +	{
 +		$sender->Text="Hello World";
 +	}
 +}
 +
 +?>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.gif b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.gifBinary files differ new file mode 100644 index 00000000..a1e51200 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.gif diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.vsd b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.vsdBinary files differ new file mode 100644 index 00000000..e8c2f5a7 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/HelloWorld/sequence.vsd diff --git a/demos/quickstart/protected/pages/Fundamentals/Samples/config.xml b/demos/quickstart/protected/pages/Fundamentals/Samples/config.xml new file mode 100644 index 00000000..ecd29bd4 --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/Samples/config.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?>
 +
 +<configuration>
 +  <pages MasterClass="Controls.SampleLayout" />
 +</configuration>
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/Fundamentals/directory.gif b/demos/quickstart/protected/pages/Fundamentals/directory.gifBinary files differ new file mode 100644 index 00000000..c7d5086d --- /dev/null +++ b/demos/quickstart/protected/pages/Fundamentals/directory.gif | 
