<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://gwiki3.thatlinuxbox.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tony</id>
		<title>GeeklogWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://gwiki3.thatlinuxbox.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tony"/>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/Special:Contributions/Tony"/>
		<updated>2026-04-06T06:44:59Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.5</generator>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_media_plugin&amp;diff=4914</id>
		<title>Soc geeklog2 media plugin</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_media_plugin&amp;diff=4914"/>
				<updated>2009-03-31T12:12:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Rich content must include video, photos as well as integration with existing services.  The goal of this plugin is:&lt;br /&gt;
&lt;br /&gt;
# Allow the upload and categorization of video and photos (really any files ala the Geeklog 1.x File Management Plugin)&lt;br /&gt;
# Encoding of video content to shrink size and save bandwidth&lt;br /&gt;
# Integrate the plugin with sites like [http://www.flickr.com Flickr], [http://www.youtube.com YouTube] and the like.&lt;br /&gt;
# The upload capabilities must allow the secure, arbitrary upload of any files&lt;br /&gt;
# Highly configurable.  Having the ability to limit file size, mime types and specific plugin features will be paramount.&lt;br /&gt;
&lt;br /&gt;
The goals is that the resulting plugin allows the embedding of this kind of content in articles seamlessly while providing a YouTube or Flickr like interface for browsing content.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
For ideas please refer to other OSS tools like WordPress that has similar modules.&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
Hard&lt;br /&gt;
&lt;br /&gt;
Being able to handle file uploads securely, special processing of video (Transcoding, possibly on another server), and handling the merriad of file types in a UI that is intuitive will be a huge challenge.&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
Hard&lt;br /&gt;
&lt;br /&gt;
Dealing securely with file uploads, handling video yet providing a UI that can handle any kind of file will be the challenge.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
Develop a core for the plugin that would contain all hooks needed for the iAPI.&lt;br /&gt;
Develop the iAPI and keep it as small as possible trying to keep it in line with the core GL2 APIs.&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Midrange to Hard''&lt;br /&gt;
&lt;br /&gt;
The hard part will be figuring out how to implement the iAPI without making it huge. It needs to stay small and easy to use. But at the same time provide everything needed to implement the multiple types of media.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_media_plugin&amp;diff=4913</id>
		<title>Soc geeklog2 media plugin</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_media_plugin&amp;diff=4913"/>
				<updated>2009-03-31T12:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Incentive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Rich content must include video, photos as well as integration with existing services.  The goal of this plugin is:&lt;br /&gt;
&lt;br /&gt;
1) Allow the upload and categorization of video and photos (really any files ala the Geeklog 1.x File Management Plugin)&lt;br /&gt;
2) Encoding of video content to shrink size and save bandwidth&lt;br /&gt;
3) Integrate the plugin with sites like &amp;lt;a href=&amp;quot;http://www.flickr.com&amp;quot;&amp;gt;Flickr&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;http://www.youtube.com&amp;quot;&amp;gt;YouTube&amp;lt;/a&amp;gt; and the like.&lt;br /&gt;
4) The upload capabilities must allow the secure, arbitrary upload of any files&lt;br /&gt;
5) Highly configurable.  Having the ability to limit file size, mime types and specific plugin features will be paramount.&lt;br /&gt;
&lt;br /&gt;
The goals is that the resulting plugin allows the embedding of this kind of content in articles seamlessly while providing a YouTube or Flickr like interface for browsing content.&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
Hard&lt;br /&gt;
&lt;br /&gt;
Dealing securely with file uploads, handling video yet providing a UI that can handle any kind of file will be the challenge.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
Develop a core for the plugin that would contain all hooks needed for the iAPI.&lt;br /&gt;
Develop the iAPI and keep it as small as possible trying to keep it in line with the core GL2 APIs.&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Midrange to Hard''&lt;br /&gt;
&lt;br /&gt;
The hard part will be figuring out how to implement the iAPI without making it huge. It needs to stay small and easy to use. But at the same time provide everything needed to implement the multiple types of media.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4906</id>
		<title>SoC geeklog2 syndication api</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4906"/>
				<updated>2009-03-26T16:19:30Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
It should be reasonably clear to any web savvy user or developer that Syndication is an essential aspect of any web software these days. The AptitudeCMS engine needs a powerful, flexible syndication engine that can be used by all other plugins to provide inbound and outbound syndication feeds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Develop a fully object oriented PHP5 implementation of the Geeklog 1.x syndication classes for reading/writing arbitrary feeds. Use of Zend_Feed or similar library strongly encouraged.&lt;br /&gt;
* Develop a AptitudeCMS Plugin which provides a full API wrapper to the Syndication classes for creation and maintenance of outbound and inbound feeds&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Easy''&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x's syndication framework is quite nice (even if I do say so myself!) and provides a good basic PHP4 OO implementation of the basic feed handling code. This needs turning into fully object oriented PHP5 (there are some refinements PHP5 allows that the current code misses. This is the easy part.&lt;br /&gt;
&lt;br /&gt;
The harder part is defining what the interface from AptitudeCMS is and how it works, and working with the AptitudeCMS framework, which only a couple of engineers are really up to speed with. Figuring this out from scratch will be the challenge to get something &amp;quot;right first time&amp;quot; to avoid the need to radically over-haul and replace the syndication framework at a later stage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4905</id>
		<title>SoC geeklog2 syndication api</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4905"/>
				<updated>2009-03-26T16:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Objective */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
It should be reasonably clear to any web savvy user or developer that Syndication is an essential aspect of any web software these days. The Geeklog2 engine needs a powerful, flexible syndication engine that can be used by all other plugins to provide inbound and outbound syndication feeds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Develop a fully object oriented PHP5 implementation of the Geeklog 1.x syndication classes for reading/writing arbitrary feeds. Use of Zend_Feed or similar library strongly encouraged.&lt;br /&gt;
* Develop a AptitudeCMS Plugin which provides a full API wrapper to the Syndication classes for creation and maintenance of outbound and inbound feeds&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Easy''&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x's syndication framework is quite nice (even if I do say so myself!) and provides a good basic PHP4 OO implementation of the basic feed handling code. This needs turning into fully object oriented PHP5 (there are some refinements PHP5 allows that the current code misses. This is the easy part.&lt;br /&gt;
&lt;br /&gt;
The harder part is defining what the interface from Geeklog 2 is and how it works, and working with the Geeklog2 framework, which only a couple of engineers are really up to speed with. Figuring this out from scratch will be the challenge to get something &amp;quot;right first time&amp;quot; to avoid the need to radically over-haul and replace the syndication framework at a later stage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4904</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4904"/>
				<updated>2009-03-26T16:16:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For AptitudeCMS (formerly Geeklog 2) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_FBConnect&amp;diff=4903</id>
		<title>Soc geeklog2 FBConnect</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Soc_geeklog2_FBConnect&amp;diff=4903"/>
				<updated>2009-03-26T16:16:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: New page: Start here [http://developers.facebook.com/connect.php Facebook Connect].  Idea would be to integrate Facebook connect into Geeklog *and* adhere to the terms of service.  I'm not convinced...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Start here [http://developers.facebook.com/connect.php Facebook Connect].&lt;br /&gt;
&lt;br /&gt;
Idea would be to integrate Facebook connect into Geeklog *and* adhere to the terms of service.  I'm not convinced this would require an entire summer so additional things to toss in would be:&lt;br /&gt;
&lt;br /&gt;
# Twitter integration&lt;br /&gt;
# Article syndication using things like digg, Facebook, delicous, etc.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4902</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4902"/>
				<updated>2009-03-26T16:12:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For AptitudeCMS (formerly Geeklog 2) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4848</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4848"/>
				<updated>2009-02-16T18:46:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For AptitudeCMS (formerly Geeklog 2) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4506</id>
		<title>SoC geeklog2 syndication api</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4506"/>
				<updated>2008-03-06T03:25:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
It should be reasonably clear to any web savvy user or developer that Syndication is an essential aspect of any web software these days. The Geeklog2 engine needs a powerful, flexible syndication engine that can be used by all other plugins to provide inbound and outbound syndication feeds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Develop a fully object oriented PHP5 implementation of the Geeklog 1.x syndication classes for reading/writing arbitrary feeds.&lt;br /&gt;
* Develop a Geeklog2 Plugin which provides a full API wrapper to the Syndication classes for creation and maintenance of outbound and inbound feeds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Easy''&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x's syndication framework is quite nice (even if I do say so myself!) and provides a good basic PHP4 OO implementation of the basic feed handling code. This needs turning into fully object oriented PHP5 (there are some refinements PHP5 allows that the current code misses. This is the easy part.&lt;br /&gt;
&lt;br /&gt;
The harder part is defining what the interface from Geeklog 2 is and how it works, and working with the Geeklog2 framework, which only a couple of engineers are really up to speed with. Figuring this out from scratch will be the challenge to get something &amp;quot;right first time&amp;quot; to avoid the need to radically over-haul and replace the syndication framework at a later stage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_mapping_plugin&amp;diff=4505</id>
		<title>SoC geeklog2 mapping plugin</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_mapping_plugin&amp;diff=4505"/>
				<updated>2008-03-06T03:24:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
Today with sites like Google Maps, Yahoo! Maps and Mapquest there is often a desire to integrate with those sites.  While such sites already provide an API for integration, they can take unfamiliar developers a long to learn and the API's differ between sites.  This project would create a single mapping API provide a small number of very powerful features that would make integration into such services easier for the PHP developer just wanting to get things done.&lt;br /&gt;
&lt;br /&gt;
The goal here is simplicity.  Make common mapping features easy to implement in a PHP application while preventing the developer to become an expert with the mapping API's themselves.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Identify a set of mapping features of most use to PHP developers who would want to integrate with a mapping service yet not have to learn an entire API.&lt;br /&gt;
* Research the existing mapping API's provided by Google, Yahoo!, et. al and develop a PHP interface to support the above goal.&lt;br /&gt;
* Implement the interface using both Yahoo! and Googles API.&lt;br /&gt;
* Implement a web service that exposes this API.&lt;br /&gt;
* What else (Justin)&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
This project doesn't involve a lot of User Inteface and CSS work so for those who have a solid PHP background but struggle to make things &amp;quot;pretty&amp;quot; this is right up your ally.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/apis/maps/ Google Maps API]&lt;br /&gt;
* [http://developer.yahoo.com/maps/ Yahoo! Maps API]&lt;br /&gt;
* [http://www.mapquest.com/features/main.adp?page=developer_tools_oapi Mapquest API]&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4504</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4504"/>
				<updated>2008-03-06T03:11:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For Geeklog 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_taxonomy_tagging_plugin| Taxonomy and Tagging Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_continuous_builds| Continuous Builds]]&lt;br /&gt;
* [[SoC_geeklog2_workflow_plugin| Workflow Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_mapping_plugin| Mapping Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_taxonomy_tagging_plugin&amp;diff=4503</id>
		<title>SoC geeklog2 taxonomy tagging plugin</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_taxonomy_tagging_plugin&amp;diff=4503"/>
				<updated>2008-03-06T03:09:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
Almost all content needs a way to organize content.  There are a number of ways to do this but the two most basic forms are:&lt;br /&gt;
&lt;br /&gt;
* Taxonomies - a simple example of a taxonomy are the &amp;quot;topics&amp;quot; implemented in the 1.x branch of Geeklog.  Taxonomies are a managed set of terms commonly used for searching and navigation.  These terms are often hierarchical (think tree structures).&lt;br /&gt;
* Tagging - allows for descriptive words or short phrases to be assigned to content.  Unlike taxonomies, tags aren't hierarchical and they are often more flexible than taxonomies.  &lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog 2 plugin that provides both a taxonomy and a tagging implementation.&lt;br /&gt;
* Create the SOAP API for interacting with the plugin.  Geeklog 2 already has basic support for implementing web services so this should be quite easy.&lt;br /&gt;
* Allow tags to be added to tag libraries.  The idea is that not all plugins in Geeklog may want to mix their tags in with other plugins.  &lt;br /&gt;
* Build a comprehensive and flexible search tree that will allow the traversal of related tags.  For example if I looked for a tag related to &amp;quot;rifles&amp;quot; it may give me the tags &amp;quot;Remington 700&amp;quot;, &amp;quot;Weatherby', etc.&lt;br /&gt;
* Build the UI widgets that will allow plugins to integrate both taxonomies and tagging into them.  This would include simple AJAX support using the Yahoo! User Interface (YUI) Library).&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
Much of the heaving lifting here is non-visual so if you love coding but maybe aren't that great with User Interfaces, CSS, etc then this would be a great alternative.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Tag_%28metadata%29 Tagging Overview on Wikipedia]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Hierarchy Taxonomies on Wikipedia]&lt;br /&gt;
* [http://tesugen.com/archives/05/07/implementing-tagging Thoughts on Tagging]&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4502</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4502"/>
				<updated>2008-03-06T02:52:18Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For Geeklog 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_taxonomy_tagging_plugin| Taxonomy and Tagging Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_continuous_builds| Continuous Builds]]&lt;br /&gt;
* [[SoC_geeklog2_workflow_plugin| Workflow Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4501</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4501"/>
				<updated>2008-03-06T02:51:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For Geeklog 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_taxonomy_tagging_plugin| Taxonomy and Tagging Plugin&lt;br /&gt;
* [[SoC_geeklog2_continuous_builds| Continuous Builds]]&lt;br /&gt;
* [[SoC_geeklog2_workflow_plugin| Workflow Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_workflow_plugin&amp;diff=4500</id>
		<title>SoC geeklog2 workflow plugin</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_workflow_plugin&amp;diff=4500"/>
				<updated>2008-03-06T02:50:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
Geeklog 2 is meant to play squarely in the CMS arena but is also meant to serve more generally as a system for delivering enterprise PHP application.  With the content plugin nearly complete and the first ever beta of Geeklog 2 on the horizon there is a need to establish a basic work flow plugin.  The PHP community is hungry for good, open source workflow alternatives and to truly play outside the needs of basic blogs and corporate websites (which we must do) we must have workflow.  It should be noted we have the added benefit of having Blaine Lang, a 1.x developer with a lot of workflow experience, as part of the team.  &lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Research PHP-based workflow engines&lt;br /&gt;
* Build a phased approach for delivering a workflow implementation.  This will involve heavy collaboration with the GL2 developers.&lt;br /&gt;
* Begin implement a basic workflow plugin inside of Geeklog 2&lt;br /&gt;
* Implement workflow examples by implementing real-world uses inside of the existing content plugin.&lt;br /&gt;
* Design a API that allows third party systems to integrate into the worflow process.  The API should be exposed via SOAP.&lt;br /&gt;
* Ideally make BPEL the configuration language for the workflow&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Hard''&lt;br /&gt;
&lt;br /&gt;
This is way too much work for one Summer of Code program but I think it we could frame this a the first of a number of phases with clear, concise deliverables for each phase.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [http://ezcomponents.org/docs/api/latest/introduction_Workflow.html/ ezComponents' Workflow Implementation]&lt;br /&gt;
* [http://sebastian-bergmann.de/archives/699-Workflow-Engine-for-PHP-5.html ezComponent Presentation]&lt;br /&gt;
* [http://workflow.tikiwiki.org/tiki-index.php/ Galaxia Workflow Engine]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/BPEL BPEL on Wikipedia&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4499</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4499"/>
				<updated>2008-03-06T02:27:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For Geeklog 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_continuous_builds| Continuous Builds]]&lt;br /&gt;
* [[SoC_geeklog2_workflow_plugin| Workflow Plugin]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Main_Page&amp;diff=4498</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Main_Page&amp;diff=4498"/>
				<updated>2008-03-06T02:26:05Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Logo.gif]]&lt;br /&gt;
&lt;br /&gt;
== Geeklog Documentation ==&lt;br /&gt;
&lt;br /&gt;
This is the main entry for Documentation for the [http://www.geeklog.net Geeklog Portal System].  The current version is 1.4x.  The next generation portal is also under development and documentation for it will be posted here as it becomes available.&lt;br /&gt;
&lt;br /&gt;
This documentation is a result of community action.  Everyone is invited to sign up and participate.  If you see an omission you can fill it in.  If you see a mistake, correct it.  If you see where things could be better organized, change it.  If you have a note about a particular configuration, add it.  In other words we need your help to make it better.&lt;br /&gt;
&lt;br /&gt;
Authors note that you can refer to yourself or sign your work by linking to User:Youruserid, the shorthand for this is three tildes.  This points initially to nothing but a blank page on which you can enter whatever info you want about yourself.  You can also reach this page by clicking on your userid at the top of the page when you are logged in.&lt;br /&gt;
&lt;br /&gt;
#[[Geeklog_1.3x_Documentation]]&lt;br /&gt;
#[[Geeklog_1.4x_Documentation]]&lt;br /&gt;
#[[Geeklog 2x Documentation]]&lt;br /&gt;
#[[Google_Summer_of_Code]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_continuous_builds&amp;diff=4497</id>
		<title>SoC geeklog2 continuous builds</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=SoC_geeklog2_continuous_builds&amp;diff=4497"/>
				<updated>2008-03-06T02:22:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;(Return to the main idea page for the [[Google Summer of Code]])&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Incentive ==&lt;br /&gt;
&lt;br /&gt;
Geeklog 2 is a sophisticated system.  A balance between rich features and ease of use must be struck which places a high emphasis on quality.  A big part of establishing quality is to implement testing as a core part of the project.  Additionally, there are key parts to the Geeklog 2 that require special processing such as building the models (the &amp;quot;M&amp;quot; part of MVC).  Geeklog 2 makes heavy use of Propel, an object relational mapper, to limit the amount of SQL a developer has to write and enhancements to Propel make it possible to isolate all SQL from the rest of the system.  &lt;br /&gt;
&lt;br /&gt;
Because of these and a number of other complexities having a system in place that polls SVN for changes, checks out the code, runs unit tests and produces builds (i.e. PEAR-installable packages) would take some of the time and complexity with getting a new version out and it forces testing to be an integral part of the system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Research Open Source build tools such as Phing, Xinc and Cruise Control to provide continuous builds&lt;br /&gt;
* Establish the actual build process including&lt;br /&gt;
** Checking out code from SVN&lt;br /&gt;
** Running Unit tests&lt;br /&gt;
** Running regression tests&lt;br /&gt;
** Upon test failures notification of the development team&lt;br /&gt;
** Upon successful testing tagging the code and doing full builds&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Hard''&lt;br /&gt;
&lt;br /&gt;
Continuous builds in PHP is a relatively new concept.  A good candidate must be willing to push forward and trudge new ground in a developing area within the PHP community.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [http://phing.info/ Phing]&lt;br /&gt;
* [http://code.google.com/p/xinc/ Xinc]&lt;br /&gt;
* [http://http://cruisecontrol.sourceforge.net/ CruiseControl]&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4496</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Google_Summer_of_Code&amp;diff=4496"/>
				<updated>2008-03-06T02:10:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* For Geeklog 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_continuous_builds| Continuous Builds]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Geeklog_GeneratorG2&amp;diff=4255</id>
		<title>Geeklog GeneratorG2</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Geeklog_GeneratorG2&amp;diff=4255"/>
				<updated>2007-06-11T18:38:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Geeklog_Generator Introduction ==&lt;br /&gt;
#[[PropelG2|A Brief overview of Propel]]&lt;br /&gt;
##[[Propel Runtime Overview]]&lt;br /&gt;
##[[Propel Generator Overview]]&lt;br /&gt;
#[[What|What is it?]]&lt;br /&gt;
##[[Why Developers Need itG2|Why we, as developers, need it]]&lt;br /&gt;
##[[How can it speed developmentG2|How can it speed development?]]&lt;br /&gt;
#[[Installation]]&lt;br /&gt;
#[[Usage]]&lt;br /&gt;
##[[Generating Objects]]&lt;br /&gt;
##[[Using Generated Objects]]&lt;br /&gt;
###[[Geeklog_DAO Overview]]&lt;br /&gt;
###[[Sample Code]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4144</id>
		<title>Building a View</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4144"/>
				<updated>2006-09-25T13:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Your First View */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Building a View ==&lt;br /&gt;
&lt;br /&gt;
Views are the visual components shown to your users.  They often display information from one or more models.  It is important to note that your views are to contain no business logic.  It just displays a page to a user.  The Geeklog 2 Framework has consciously chose to use [http://pear.php.net/package/HTML_Template_Flexy Flexy] for a variety of reasons but know now that you can very quickly retrofit any of what you see to use any other templating engine (such as [http://smarty.php.net/ Smarty]).&lt;br /&gt;
&lt;br /&gt;
== Why Flexy? ==&lt;br /&gt;
&lt;br /&gt;
One of the more annoying questions I get from PHP developers is why Flexy?  Why Flexy?  Why Flexy?  First, keep in mind the Geeklog 2 Framework has been around in various forms since 2003 and back then one of the more annoying things about other template engines out there is their blatant desire to allow rendering of HTML and JavaScript by default.  Flexy, rightfully so, hates these things and will always escape them unless you explicitly tell it to allow them.  After that, Flexy is full of the sorts of features you'd like to see from a modern PHP template eninge.  Things like compiling of templates, support for control structures (IF's, FOR loops, etc), object-oriented design and out-of-the-box multi-language support via [http://pear.php.net/package/Translation2 PEAR::Translation2].&lt;br /&gt;
&lt;br /&gt;
Are there other good alternatives out there?  Absolutely, and let me remind you that just because the Geeklog 2 Framework uses Flexy that doesn't mean you couldn't retrofit your projects to use another engine.  That's the beauty of object-oriented code.&lt;br /&gt;
&lt;br /&gt;
== Your First View ==&lt;br /&gt;
&lt;br /&gt;
OK, enough talk...let's see an MVCnPHP view first hand.  Every view is comprised of two parts.  The first part is the MVCnPHP view which is responsible for pulling all data needed to be displayed on the page.  The second part is the Flexy template.  Let's first build the Flexy template by creating a page called Home.thtml.  Note that Geeklog 2 Coding Standards require that all HTML templates use the .thtml extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you would expect from a PHP template engine, the template file itself is mostly HTML.  The template above excercises a couple tasks such as showing data in a variable and calling a method.  Those familir with other template engines might notice the variable and method call noted by {} above. In the TITLE tag, there is the pageTitle variable and in the body there is a method call to getDateTime().  Where does that variable and method exist?  On the MVCnPHP view!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * MVCnPHP Abstract BaseView object&lt;br /&gt;
 */&lt;br /&gt;
require 'Geeklog/MVCnPHP/BaseView.php';&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * PEAR::HTML_Template_Flexy&lt;br /&gt;
 */&lt;br /&gt;
require 'Flexy.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_HomeView extend MVCnPHP_BaseView  {   &lt;br /&gt;
    /**&lt;br /&gt;
     * Handle to instance of a flexy object&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     * @var object&lt;br /&gt;
     */&lt;br /&gt;
     protected $flexyHandle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Page title&lt;br /&gt;
     * @var string&lt;br /&gt;
     * @access protected&lt;br /&gt;
     */&lt;br /&gt;
    protected $pageTitle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;pageTitle = 'Your first MVCnPHP View';&lt;br /&gt;
        $this-&amp;gt;initializeFlexy();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Instantiates Flexy&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    protected function initializeFlexy()&lt;br /&gt;
    {&lt;br /&gt;
        $options = array(&lt;br /&gt;
            'templateDir'   =&amp;gt; '/path/to/templates',&lt;br /&gt;
            'compileDir'    =&amp;gt; '/path/to/templates/compiled_templates',&lt;br /&gt;
            'forceCompile'  =&amp;gt; 0,&lt;br /&gt;
            'debug'         =&amp;gt; 0,&lt;br /&gt;
            'locale'        =&amp;gt; 'en'       &lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;flexyHandle = new FARMS_HTML_Template_Flexy($options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets current date and time&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     * @return string Current date and time&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function getDateTime()&lt;br /&gt;
    {&lt;br /&gt;
        return strftime('%D %T');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Shows the page.&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function getView() {&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;setPageTitle('Your first MVCnPHP View');&lt;br /&gt;
    	$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
        $this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So how does all the above work?  Let's run down the notable bits of code.  First of all, if you go back and look at the Flexy template we created, we had a variable called pageTitle.  It is no mistake that on our MVCnPHP view we have a public class member called pageTitle.  Similarly, the Flexy template had a call to a method getDateTime() which can be seen above as a public method on our MVCnPHP view.  The magic to all this is in the getView() method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line above compiles our Flexy template Home.thtml into executable PHP code.  It's worth noting that Flexy is smart enough to only compile the template if the template hasn't be compiled yet or if the template itself has changed since the last compile.  This works exactly like JSP's in the Java world.&lt;br /&gt;
&lt;br /&gt;
The outputObject() call tell Flexy to now run the compiled template and that it should use our MVCnPHP view ($this) as the class that holds all the data and methods needed to render the page.&lt;br /&gt;
&lt;br /&gt;
Now you may be wondering how the getView() method even gets called.  That is done by the MVCnPHP Controller and it knows how to call our view based on it's [[MVCnPHPConfig|configuration file]].&lt;br /&gt;
&lt;br /&gt;
== Note on Namespacing ==&lt;br /&gt;
&lt;br /&gt;
PHP5 has no notion of namespaces.  Thus if you have a class called User and you are trying to integrate your code with third party code that also has a class called User then you will be in trouble because of the name conflict.  Your only option is ensure the class names are entirely different.  The Geeklog 2 Framework, uses the [http://pear.php.net PEAR] approach to solving this by qualifying each class name with a prefix.  That prefix is typically the package name you'd like to give the class had you had namespace support.  If you agree this is all messy, feel free to follow the history of attempts made at getting namespace support in PHP5 [http://phpnamespaces.org/wiki/ here].  In the meantime, if you notice class names with prefixs like SAMPLE_ or GEEKLOG_ or MVCnPHP_ you know why.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4143</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4143"/>
				<updated>2006-09-21T16:33:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Updating the Controller's Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
== Setting up our View ==&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    {if:sum}&lt;br /&gt;
    The sum of your two numbers is {sum}.  Use the form below to add up two more numbers.&lt;br /&gt;
    {end:}&lt;br /&gt;
    &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;index.php?cmd=addNumbers&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;First Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Second Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;secondNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Add 'em Up&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most notable thing is that in our form's action we have index.php?cmd=addNumbers.  If you recall, that cmd GET string value tells our controller what it needs to do when we post the data.  Note that if you prefer, you could have easily have added a hidden form field called cmd with a value of addNumbers and made the form action post to just index.php.  That's because the MVCnPHP Controller listens for the cmd value on both the GET and POST superglobals.  Also notice that we have introduced the use of a IF statement in our Flexy template.  The template now checks to see if the view has a sum of two numbers, if so it will display the sum.  Now that we have a form, let's build the command!&lt;br /&gt;
&lt;br /&gt;
== Building the Command ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP Commands work very much the same way as views minus the need for Flexy.  Let us start by creating a file called SAMPLE_addNumbersCommand.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract base command&lt;br /&gt;
 */&lt;br /&gt;
require_once 'Geeklog/MVCnPHP/BaseCommand.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_addNumbersCommand extends MVCnPHP_BaseCommand {&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds up the numbers we get&lt;br /&gt;
     * &lt;br /&gt;
     * @access public &lt;br /&gt;
     * @return string Name of forward (if any)&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function execute()&lt;br /&gt;
    {    	        &lt;br /&gt;
        if (!is_numeric($_POST['firstNumber']) OR !is_numerice($_POST['secondNumber']) {&lt;br /&gt;
            return 'validationFailure';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $_REQUEST['sumOfNumbers'] = $_POST['firstNumber'] + $_POST['secondNumber'];&lt;br /&gt;
&lt;br /&gt;
        return 'success';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you recall, the command pattern represents an action and the above is a very simple action that first checks to ensure we got two numbers to add up and, if so, it adds them up.  You'll see that the execute() method returns a string which can be either validationFailure or success.  Each of those strings is the name of a forward.&lt;br /&gt;
&lt;br /&gt;
Forwards tell the controller where to send processing next.  Both MVCnPHP views and commands can have forwards.  How does the controller use these forward to figure out what to do next?  Yep, you got it, from it's configuration file.&lt;br /&gt;
&lt;br /&gt;
== Updating the Controller's Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Before any of this will work, we need to let our controller know about the new command and configure the command's forwards:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;command id=&amp;quot;addNumbers&amp;quot; name=&amp;quot;SAMPLE_addNumbersCommand&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;success&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;validationFailure&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;        &lt;br /&gt;
    &amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4142</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4142"/>
				<updated>2006-09-21T16:32:47Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Updating the Controller's Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
== Setting up our View ==&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    {if:sum}&lt;br /&gt;
    The sum of your two numbers is {sum}.  Use the form below to add up two more numbers.&lt;br /&gt;
    {end:}&lt;br /&gt;
    &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;index.php?cmd=addNumbers&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;First Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Second Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;secondNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Add 'em Up&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most notable thing is that in our form's action we have index.php?cmd=addNumbers.  If you recall, that cmd GET string value tells our controller what it needs to do when we post the data.  Note that if you prefer, you could have easily have added a hidden form field called cmd with a value of addNumbers and made the form action post to just index.php.  That's because the MVCnPHP Controller listens for the cmd value on both the GET and POST superglobals.  Also notice that we have introduced the use of a IF statement in our Flexy template.  The template now checks to see if the view has a sum of two numbers, if so it will display the sum.  Now that we have a form, let's build the command!&lt;br /&gt;
&lt;br /&gt;
== Building the Command ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP Commands work very much the same way as views minus the need for Flexy.  Let us start by creating a file called SAMPLE_addNumbersCommand.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract base command&lt;br /&gt;
 */&lt;br /&gt;
require_once 'Geeklog/MVCnPHP/BaseCommand.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_addNumbersCommand extends MVCnPHP_BaseCommand {&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds up the numbers we get&lt;br /&gt;
     * &lt;br /&gt;
     * @access public &lt;br /&gt;
     * @return string Name of forward (if any)&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function execute()&lt;br /&gt;
    {    	        &lt;br /&gt;
        if (!is_numeric($_POST['firstNumber']) OR !is_numerice($_POST['secondNumber']) {&lt;br /&gt;
            return 'validationFailure';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $_REQUEST['sumOfNumbers'] = $_POST['firstNumber'] + $_POST['secondNumber'];&lt;br /&gt;
&lt;br /&gt;
        return 'success';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you recall, the command pattern represents an action and the above is a very simple action that first checks to ensure we got two numbers to add up and, if so, it adds them up.  You'll see that the execute() method returns a string which can be either validationFailure or success.  Each of those strings is the name of a forward.&lt;br /&gt;
&lt;br /&gt;
Forwards tell the controller where to send processing next.  Both MVCnPHP views and commands can have forwards.  How does the controller use these forward to figure out what to do next?  Yep, you got it, from it's configuration file.&lt;br /&gt;
&lt;br /&gt;
== Updating the Controller's Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Before any of this will work, we need to let our controller know about the new command and configure the command's forwards:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;command id=&amp;quot;addNumbers&amp;quot; name=&amp;quot;SAMPLE_addNumbersCommand&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;success&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;validationFailure&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;        &lt;br /&gt;
    &amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4141</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4141"/>
				<updated>2006-09-21T16:31:06Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Building the Command */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
== Setting up our View ==&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    {if:sum}&lt;br /&gt;
    The sum of your two numbers is {sum}.  Use the form below to add up two more numbers.&lt;br /&gt;
    {end:}&lt;br /&gt;
    &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;index.php?cmd=addNumbers&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;First Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Second Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;secondNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Add 'em Up&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most notable thing is that in our form's action we have index.php?cmd=addNumbers.  If you recall, that cmd GET string value tells our controller what it needs to do when we post the data.  Note that if you prefer, you could have easily have added a hidden form field called cmd with a value of addNumbers and made the form action post to just index.php.  That's because the MVCnPHP Controller listens for the cmd value on both the GET and POST superglobals.  Also notice that we have introduced the use of a IF statement in our Flexy template.  The template now checks to see if the view has a sum of two numbers, if so it will display the sum.  Now that we have a form, let's build the command!&lt;br /&gt;
&lt;br /&gt;
== Building the Command ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP Commands work very much the same way as views minus the need for Flexy.  Let us start by creating a file called SAMPLE_addNumbersCommand.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract base command&lt;br /&gt;
 */&lt;br /&gt;
require_once 'Geeklog/MVCnPHP/BaseCommand.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_addNumbersCommand extends MVCnPHP_BaseCommand {&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds up the numbers we get&lt;br /&gt;
     * &lt;br /&gt;
     * @access public &lt;br /&gt;
     * @return string Name of forward (if any)&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function execute()&lt;br /&gt;
    {    	        &lt;br /&gt;
        if (!is_numeric($_POST['firstNumber']) OR !is_numerice($_POST['secondNumber']) {&lt;br /&gt;
            return 'validationFailure';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $_REQUEST['sumOfNumbers'] = $_POST['firstNumber'] + $_POST['secondNumber'];&lt;br /&gt;
&lt;br /&gt;
        return 'success';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you recall, the command pattern represents an action and the above is a very simple action that first checks to ensure we got two numbers to add up and, if so, it adds them up.  You'll see that the execute() method returns a string which can be either validationFailure or success.  Each of those strings is the name of a forward.&lt;br /&gt;
&lt;br /&gt;
Forwards tell the controller where to send processing next.  Both MVCnPHP views and commands can have forwards.  How does the controller use these forward to figure out what to do next?  Yep, you got it, from it's configuration file.&lt;br /&gt;
&lt;br /&gt;
== Updating the Controller's Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Before any of this will work, we need to let our controller know about the new command and configure the command's forwards:&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;command id=&amp;quot;addNumbers&amp;quot; name=&amp;quot;SAMPLE_addNumbersCommand&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;success&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;validationFailure&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;        &lt;br /&gt;
    &amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4140</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4140"/>
				<updated>2006-09-21T16:30:28Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Updating the Controller's Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
== Setting up our View ==&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    {if:sum}&lt;br /&gt;
    The sum of your two numbers is {sum}.  Use the form below to add up two more numbers.&lt;br /&gt;
    {end:}&lt;br /&gt;
    &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;index.php?cmd=addNumbers&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;First Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Second Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;secondNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Add 'em Up&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most notable thing is that in our form's action we have index.php?cmd=addNumbers.  If you recall, that cmd GET string value tells our controller what it needs to do when we post the data.  Note that if you prefer, you could have easily have added a hidden form field called cmd with a value of addNumbers and made the form action post to just index.php.  That's because the MVCnPHP Controller listens for the cmd value on both the GET and POST superglobals.  Also notice that we have introduced the use of a IF statement in our Flexy template.  The template now checks to see if the view has a sum of two numbers, if so it will display the sum.  Now that we have a form, let's build the command!&lt;br /&gt;
&lt;br /&gt;
== Building the Command ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP Commands work very much the same way as views minus the need for Flexy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract base command&lt;br /&gt;
 */&lt;br /&gt;
require_once 'Geeklog/MVCnPHP/BaseCommand.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_addNumbersCommand extends MVCnPHP_BaseCommand {&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds up the numbers we get&lt;br /&gt;
     * &lt;br /&gt;
     * @access public &lt;br /&gt;
     * @return string Name of forward (if any)&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function execute()&lt;br /&gt;
    {    	        &lt;br /&gt;
        if (!is_numeric($_POST['firstNumber']) OR !is_numerice($_POST['secondNumber']) {&lt;br /&gt;
            return 'validationFailure';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $_REQUEST['sumOfNumbers'] = $_POST['firstNumber'] + $_POST['secondNumber'];&lt;br /&gt;
&lt;br /&gt;
        return 'success';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you recall, the command pattern represents an action and the above is a very simple action that first checks to ensure we got two numbers to add up and, if so, it adds them up.  You'll see that the execute() method returns a string which can be either validationFailure or success.  Each of those strings is the name of a forward.&lt;br /&gt;
&lt;br /&gt;
Forwards tell the controller where to send processing next.  Both MVCnPHP views and commands can have forwards.  How does the controller use these forward to figure out what to do next?  Yep, you got it, from it's configuration file.&lt;br /&gt;
&lt;br /&gt;
== Updating the Controller's Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Before any of this will work, we need to let our controller know about the new command and configure the command's forwards:&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;command id=&amp;quot;addNumbers&amp;quot; name=&amp;quot;SAMPLE_addNumbersCommand&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;success&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;&lt;br /&gt;
        &amp;lt;forward id=&amp;quot;validationFailure&amp;quot; type=&amp;quot;view&amp;quot;&amp;gt;home&amp;lt;/forward&amp;gt;        &lt;br /&gt;
    &amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4139</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4139"/>
				<updated>2006-09-21T16:26:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Your First Command */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
== Setting up our View ==&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    {if:sum}&lt;br /&gt;
    The sum of your two numbers is {sum}.  Use the form below to add up two more numbers.&lt;br /&gt;
    {end:}&lt;br /&gt;
    &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;index.php?cmd=addNumbers&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;First Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Second Number:&amp;lt;/b&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;secondNumber&amp;quot; /&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Add 'em Up&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most notable thing is that in our form's action we have index.php?cmd=addNumbers.  If you recall, that cmd GET string value tells our controller what it needs to do when we post the data.  Note that if you prefer, you could have easily have added a hidden form field called cmd with a value of addNumbers and made the form action post to just index.php.  That's because the MVCnPHP Controller listens for the cmd value on both the GET and POST superglobals.  Also notice that we have introduced the use of a IF statement in our Flexy template.  The template now checks to see if the view has a sum of two numbers, if so it will display the sum.  Now that we have a form, let's build the command!&lt;br /&gt;
&lt;br /&gt;
== Building the Command ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP Commands work very much the same way as views minus the need for Flexy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract base command&lt;br /&gt;
 */&lt;br /&gt;
require_once 'Geeklog/MVCnPHP/BaseCommand.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_addNumbersCommand extends MVCnPHP_BaseCommand {&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds up the numbers we get&lt;br /&gt;
     * &lt;br /&gt;
     * @access public &lt;br /&gt;
     * @return string Name of forward (if any)&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function execute()&lt;br /&gt;
    {    	        &lt;br /&gt;
        if (!is_numeric($_POST['firstNumber']) OR !is_numerice($_POST['secondNumber']) {&lt;br /&gt;
            return 'validationFailure';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $_REQUEST['sumOfNumbers'] = $_POST['firstNumber'] + $_POST['secondNumber'];&lt;br /&gt;
&lt;br /&gt;
        return 'success';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you recall, the command pattern represents an action and the above is a very simple action that first checks to ensure we got two numbers to add up and, if so, it adds them up.  You'll see that the execute() method returns a string which can be either validationFailure or success.  Each of those strings is the name of a forward.&lt;br /&gt;
&lt;br /&gt;
Forwards tell the controller where to send processing next.  Both MVCnPHP views and commands can have forwards.  How does the controller use these forward to figure out what to do next?  Yep, you got it, from it's configuration file.&lt;br /&gt;
&lt;br /&gt;
== Updating the Controller's Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Before any of this will work, we need to let our controller know about the new command and configure the command's forwards:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Code goes here.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4138</id>
		<title>MVCnPHPCommand</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPCommand&amp;diff=4138"/>
				<updated>2006-09-21T16:04:07Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Your First Command ==&lt;br /&gt;
&lt;br /&gt;
Before we can really do anything useful with the command we will create we will first modify our view's Flexy template to have a form that will submit data to our command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Code here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4137</id>
		<title>MVCnPHPConfig</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4137"/>
				<updated>2006-09-21T15:59:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Ok, so you've built your first view using MVCnPHP but now you need to configure the controller to call your view when requested.  This is done by managing a very simple XML file.  Back when we created our index.php page that instantiated the controller we gave it a file called mvcconfig.xml as the configuration it should use. You should now create that XML file and add the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above configuration file is about as bare bones as it gets.  The first tag, MVC_CONFIGURATION, has a compile attribute that will tell MVCnPHP it should compile the XML to a PHP array for faster processing.  It's generally a good idea to do this.  The VIEW tag defines a view for the controller with a logical ID of home and a class name of SAMPLE_HomeView.  The default attribute tells the controller that if it isn't given the ID of a view that it should use that view as the default.  So how do you tell the controller what view to use? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php?cmd=home&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above shows you that you can call a specific view by giving it a cmd GET string variable.  Note that because our configuration file has the home view as the default view the above URL is the same as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some of you are probably grumbling about the use of the ugly GET string and noting how URL rewriting would be better.  You are in luck as MVCnPHP will treat the following URL the same as the above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php/home/&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No, MVCnPHP doesn't use Apache's URL rewriting...instead it chooses to use a hosting provider friendly implementation that parses the GET string and it assumes the first argument is the cmd value.&lt;br /&gt;
&lt;br /&gt;
For reference, this what the compiled configuration file would look like.  Don't worry if it looks a bit foreign as that array is built for direct use by the Contoller.  Note that if you set the compile attribute to false on the MVC_CONFIGURATION tag that the controller would have to build that array on every request...not a good thing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php $this-&amp;gt;arrayData = array (&lt;br /&gt;
  'views' =&amp;gt; &lt;br /&gt;
  array (    &lt;br /&gt;
    'home' =&amp;gt; &lt;br /&gt;
    array (&lt;br /&gt;
      'name' =&amp;gt; 'SAMPLE_HomeView',&lt;br /&gt;
      'default' =&amp;gt; 1,&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ok, so now we've created our first view, its associated Flexy template and wired it into the controller's configuration file.  Now let's [[MVCnPHPCommand|build a command]]!&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4136</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4136"/>
				<updated>2006-09-21T15:58:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Models, Views, Controllers Defined */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Java programmer and a Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  I wrote MVCnPHP back in 2003 because, in my opinion, there wasn't a bare bones, intuitive MVC implementation in PHP.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[[MVCnPHPController|Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[MVCnPHPConfig|Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[MVCnPHPCommand|Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4135</id>
		<title>MVCnPHPConfig</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4135"/>
				<updated>2006-09-21T15:57:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Ok, so you've built your first view using MVCnPHP but now you need to configure the controller to call your view when requested.  This is done by managing a very simple XML file.  Back when we created our index.php page that instantiated the controller we gave it a file called mvcconfig.xml as the configuration it should use. You should now create that XML file and add the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above configuration file is about as bare bones as it gets.  The first tag, MVC_CONFIGURATION, has a compile attribute that will tell MVCnPHP it should compile the XML to a PHP array for faster processing.  It's generally a good idea to do this.  The VIEW tag defines a view for the controller with a logical ID of home and a class name of SAMPLE_HomeView.  The default attribute tells the controller that if it isn't given the ID of a view that it should use that view as the default.  So how do you tell the controller what view to use? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php?cmd=home&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above shows you that you can call a specific view by giving it a cmd GET string variable.  Note that because our configuration file has the home view as the default view the above URL is the same as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some of you are probably grumbling about the use of the ugly GET string and noting how URL rewriting would be better.  You are in luck as MVCnPHP will treat the following URL the same as the above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php/home/&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No, MVCnPHP doesn't use Apache's URL rewriting...instead it chooses to use a hosting provider friendly implementation that parses the GET string and it assumes the first argument is the cmd value.&lt;br /&gt;
&lt;br /&gt;
For reference, this what the compiled configuration file would look like.  Don't worry if it looks a bit foreign as that array is built for direct use by the Contoller.  Note that if you set the compile attribute to false on the MVC_CONFIGURATION tag that the controller would have to build that array on every request...not a good thing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php $this-&amp;gt;arrayData = array (&lt;br /&gt;
  'views' =&amp;gt; &lt;br /&gt;
  array (    &lt;br /&gt;
    'home' =&amp;gt; &lt;br /&gt;
    array (&lt;br /&gt;
      'name' =&amp;gt; 'SAMPLE_HomeView',&lt;br /&gt;
      'default' =&amp;gt; 1,&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ok, so now we've created our first view, its associated Flexy template and wired it into the controller's configuration file.  Now let's build a command!&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4134</id>
		<title>MVCnPHPConfig</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPConfig&amp;diff=4134"/>
				<updated>2006-09-21T15:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Configuration File ==&lt;br /&gt;
&lt;br /&gt;
Ok, so you've built your first view using MVCnPHP but now you need to configure the controller to call your view when requested.  This is done by managing a very simple XML file.  Back when we created our index.php page that instantiated the controller we gave it a file called mvcconfig.xml as the configuration it should use. You should now create that XML file and add the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mvc_configuration compile=&amp;quot;true&amp;quot;&amp;gt;	&lt;br /&gt;
    &amp;lt;view id=&amp;quot;home&amp;quot; name=&amp;quot;SAMPLE_HomeView&amp;quot; default=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;
&amp;lt;/mvc_configuration&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above configuration file is about as bare bones as it gets.  The first tag, MVC_CONFIGURATION, has a compile attribute that will tell MVCnPHP it should compile the XML to a PHP array for faster processing.  It's generally a good idea to do this.  The VIEW tag defines a view for the controller with a logical ID of home and a class name of SAMPLE_HomeView.  The default attribute tells the controller that if it isn't given the ID of a view that it should use that view as the default.  So how do you tell the controller what view to use? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php?cmd=home&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above shows you that you can call a specific view by giving it a cmd GET string variable.  Note that because our configuration file has the home view as the default view the above URL is the same as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some of you are probably grumbling about the use of the ugly GET string and noting how URL rewriting would be better.  You are in luck as MVCnPHP will treat the following URL the same as the above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://www.example.com/index.php/home/&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No, MVCnPHP doesn't use Apache's URL rewriting...instead it chooses to use a hosting provider friendly implementation that parses the GET string and it assumes the first argument is the cmd value.&lt;br /&gt;
&lt;br /&gt;
For reference, this what the compiled configuration file would look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php $this-&amp;gt;arrayData = array (&lt;br /&gt;
  'views' =&amp;gt; &lt;br /&gt;
  array (    &lt;br /&gt;
    'home' =&amp;gt; &lt;br /&gt;
    array (&lt;br /&gt;
      'name' =&amp;gt; 'SAMPLE_HomeView',&lt;br /&gt;
      'default' =&amp;gt; 1,&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4133</id>
		<title>Building a View</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4133"/>
				<updated>2006-09-21T15:08:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Your First View */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Building a View ==&lt;br /&gt;
&lt;br /&gt;
Views are the visual components shown to your users.  They often display information from one or more models.  It is important to note that your views are to contain no business logic.  It just displays a page to a user.  The Geeklog 2 Framework has consciously chose to use [http://pear.php.net/package/HTML_Template_Flexy Flexy] for a variety of reasons but know now that you can very quickly retrofit any of what you see to use any other templating engine (such as [http://smarty.php.net/ Smarty]).&lt;br /&gt;
&lt;br /&gt;
== Why Flexy? ==&lt;br /&gt;
&lt;br /&gt;
One of the more annoying questions I get from PHP developers is why Flexy?  Why Flexy?  Why Flexy?  First, keep in mind the Geeklog 2 Framework has been around in various forms since 2003 and back then one of the more annoying things about other template engines out there is their blatant desire to allow rendering of HTML and JavaScript by default.  Flexy, rightfully so, hates these things and will always escape them unless you explicitly tell it to allow them.  After that, Flexy is full of the sorts of features you'd like to see from a modern PHP template eninge.  Things like compiling of templates, support for control structures (IF's, FOR loops, etc), object-oriented design and out-of-the-box multi-language support via [http://pear.php.net/package/Translation2 PEAR::Translation2].&lt;br /&gt;
&lt;br /&gt;
Are there other good alternatives out there?  Absolutely, and let me remind you that just because the Geeklog 2 Framework uses Flexy that doesn't mean you couldn't retrofit your projects to use another engine.  That's the beauty of object-oriented code.&lt;br /&gt;
&lt;br /&gt;
== Your First View ==&lt;br /&gt;
&lt;br /&gt;
OK, enough talk...let's see an MVCnPHP view first hand.  Every view is comprised of two parts.  The first part is the MVCnPHP view which is responsible for pulling all data needed to be displayed on the page.  The second part is the Flexy template.  Let's first build the Flexy template by creating a page called Home.thtml.  Note that Geeklog 2 Coding Standards require that all HTML templates use the .thtml extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you would expect from a PHP template engine, the template file itself is mostly HTML.  The template above excercises a couple tasks such as showing data in a variable and calling a method.  Those familir with other template engines might notice the variable and method call noted by {} above. In the TITLE tag, there is the pageTitle variable and in the body there is a method call to getDateTime().  Where does that variable and method exist?  On the MVCnPHP view!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * MVCnPHP Abstract BaseView object&lt;br /&gt;
 */&lt;br /&gt;
require 'Geeklog/MVCnPHP/BaseView.php';&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * PEAR::HTML_Template_Flexy&lt;br /&gt;
 */&lt;br /&gt;
require 'Flexy.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_HomeView extend MVCnPHP_BaseView  {   &lt;br /&gt;
    /**&lt;br /&gt;
     * Handle to instance of a flexy object&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     * @var object&lt;br /&gt;
     */&lt;br /&gt;
     protected $flexyHandle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Page title&lt;br /&gt;
     * @var string&lt;br /&gt;
     * @access protected&lt;br /&gt;
     */&lt;br /&gt;
    protected $pageTitle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;pageTitle = 'Your first MVCnPHP View';&lt;br /&gt;
        $this-&amp;gt;initializeFlexy();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Instantiates Flexy&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    protected function initializeFlexy()&lt;br /&gt;
    {&lt;br /&gt;
        $options = array(&lt;br /&gt;
            'templateDir'   =&amp;gt; '/path/to/templates',&lt;br /&gt;
            'compileDir'    =&amp;gt; '/path/to/templates/compiled_templates',&lt;br /&gt;
            'forceCompile'  =&amp;gt; 0,&lt;br /&gt;
            'debug'         =&amp;gt; 0,&lt;br /&gt;
            'locale'        =&amp;gt; 'en'       &lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;flexyHandle = new FARMS_HTML_Template_Flexy($options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets current date and time&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     * @return string Current date and time&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function getDateTime()&lt;br /&gt;
    {&lt;br /&gt;
        return strftime('%D %T');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Shows the page.&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function getView() {&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;setPageTitle('Your first MVCnPHP View');&lt;br /&gt;
    	$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
        $this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So how does all the above work?  Let's run down the notable bits of code.  First of all, if you go back and look at the Flexy template we created, we had a variable called pageTitle.  It is no mistake that on our MVCnPHP view we have a public class member called pageTitle.  Similarly, the Flexy template had a call to a method getDateTime() which can be seen above as a public method on our MVCnPHP view.  The magic to all this is in the getView() method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line above compiles our Flexy template Home.thtml into executable PHP code.  It's worth noting that Flexy is smart enough to only compile the template if the template hasn't be compiled yet or if the template itself has changed since the last compile.  This works exactly like JSP's in the Java world.&lt;br /&gt;
&lt;br /&gt;
The outputObject() call tell Flexy to now run the compiled template and that it should use our MVCnPHP view ($this) as the class that holds all the data and methods needed to render the page.&lt;br /&gt;
&lt;br /&gt;
Now you may be wondering how the getView() method even gets called.  That is done by the MVCnPHP Controller and it knows how to call our view based on it's [[MVCnPHPConfig|configuration file]].&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4132</id>
		<title>Building a View</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4132"/>
				<updated>2006-09-21T15:08:45Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Your First View */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Building a View ==&lt;br /&gt;
&lt;br /&gt;
Views are the visual components shown to your users.  They often display information from one or more models.  It is important to note that your views are to contain no business logic.  It just displays a page to a user.  The Geeklog 2 Framework has consciously chose to use [http://pear.php.net/package/HTML_Template_Flexy Flexy] for a variety of reasons but know now that you can very quickly retrofit any of what you see to use any other templating engine (such as [http://smarty.php.net/ Smarty]).&lt;br /&gt;
&lt;br /&gt;
== Why Flexy? ==&lt;br /&gt;
&lt;br /&gt;
One of the more annoying questions I get from PHP developers is why Flexy?  Why Flexy?  Why Flexy?  First, keep in mind the Geeklog 2 Framework has been around in various forms since 2003 and back then one of the more annoying things about other template engines out there is their blatant desire to allow rendering of HTML and JavaScript by default.  Flexy, rightfully so, hates these things and will always escape them unless you explicitly tell it to allow them.  After that, Flexy is full of the sorts of features you'd like to see from a modern PHP template eninge.  Things like compiling of templates, support for control structures (IF's, FOR loops, etc), object-oriented design and out-of-the-box multi-language support via [http://pear.php.net/package/Translation2 PEAR::Translation2].&lt;br /&gt;
&lt;br /&gt;
Are there other good alternatives out there?  Absolutely, and let me remind you that just because the Geeklog 2 Framework uses Flexy that doesn't mean you couldn't retrofit your projects to use another engine.  That's the beauty of object-oriented code.&lt;br /&gt;
&lt;br /&gt;
== Your First View ==&lt;br /&gt;
&lt;br /&gt;
OK, enough talk...let's see an MVCnPHP view first hand.  Every view is comprised of two parts.  The first part is the MVCnPHP view which is responsible for pulling all data needed to be displayed on the page.  The second part is the Flexy template.  Let's first build the Flexy template by creating a page called Home.thtml.  Note that Geeklog 2 Coding Standards require that all HTML templates use the .thtml extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you would expect from a PHP template engine, the template file itself is mostly HTML.  The template above excercises a couple tasks such as showing data in a variable and calling a method.  Those familir with other template engines might notice the variable and method call noted by {} above. In the TITLE tag, there is the pageTitle variable and in the body there is a method call to getDateTime().  Where does that variable and method exist?  On the MVCnPHP view!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * MVCnPHP Abstract BaseView object&lt;br /&gt;
 */&lt;br /&gt;
require 'Geeklog/MVCnPHP/BaseView.php';&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * PEAR::HTML_Template_Flexy&lt;br /&gt;
 */&lt;br /&gt;
require 'Flexy.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_HomeView extend MVCnPHP_BaseView  {   &lt;br /&gt;
    /**&lt;br /&gt;
     * Handle to instance of a flexy object&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     * @var object&lt;br /&gt;
     */&lt;br /&gt;
     protected $flexyHandle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Page title&lt;br /&gt;
     * @var string&lt;br /&gt;
     * @access protected&lt;br /&gt;
     */&lt;br /&gt;
    protected $pageTitle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;pageTitle = 'Your first MVCnPHP View';&lt;br /&gt;
        $this-&amp;gt;initializeFlexy();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Instantiates Flexy&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    protected function initializeFlexy()&lt;br /&gt;
    {&lt;br /&gt;
        $options = array(&lt;br /&gt;
            'templateDir'   =&amp;gt; '/path/to/templates',&lt;br /&gt;
            'compileDir'    =&amp;gt; '/path/to/templates/compiled_templates',&lt;br /&gt;
            'forceCompile'  =&amp;gt; 0,&lt;br /&gt;
            'debug'         =&amp;gt; 0,&lt;br /&gt;
            'locale'        =&amp;gt; 'en'       &lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;flexyHandle = new FARMS_HTML_Template_Flexy($options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets current date and time&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     * @return string Current date and time&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function getDateTime()&lt;br /&gt;
    {&lt;br /&gt;
        return strftime('%D %T');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Shows the page.&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function getView() {&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;setPageTitle('Your first MVCnPHP View');&lt;br /&gt;
    	$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
        $this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So how does all the above work?  Let's run down the notable bits of code.  First of all, if you go back and look at the Flexy template we created, we had a variable called pageTitle.  It is no mistake that on our MVCnPHP view we have a public class member called pageTitle.  Similarly, the Flexy template had a call to a method getDateTime() which can be seen above as a public method on our MVCnPHP view.  The magic to all this is in the getView() method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line above compiles our Flexy template Home.thtml into executable PHP code.  It's worth noting that Flexy is smart enough to only compile the template if the template hasn't be compiled yet or if the template itself has changed since the last compile.  This works exactly like JSP's in the Java world.&lt;br /&gt;
&lt;br /&gt;
The outputObject() call tell Flexy to now run the compiled template and that it should use our MVCnPHP view ($this) as the class that holds all the data and methods needed to render the page.&lt;br /&gt;
&lt;br /&gt;
Now you may be wondering how the getView() method even gets called.  That is done by the MVCnPHP Controller and it knows how to call our view based on it's [MVCnPHPConfig|configuration file].&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4131</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4131"/>
				<updated>2006-09-21T15:08:00Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Models, Views, Controllers Defined */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Java programmer and a Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  I wrote MVCnPHP back in 2003 because, in my opinion, there wasn't a bare bones, intuitive MVC implementation in PHP.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[[MVCnPHPController|Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[MVCnPHPConfig|Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4130</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4130"/>
				<updated>2006-09-21T15:07:22Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Java programmer and a Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  I wrote MVCnPHP back in 2003 because, in my opinion, there wasn't a bare bones, intuitive MVC implementation in PHP.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[[MVCnPHPController|Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4129</id>
		<title>Building a View</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Building_a_View&amp;diff=4129"/>
				<updated>2006-09-21T15:04:41Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: MVCnPHP Overview&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Building a View ==&lt;br /&gt;
&lt;br /&gt;
Views are the visual components shown to your users.  They often display information from one or more models.  It is important to note that your views are to contain no business logic.  It just displays a page to a user.  The Geeklog 2 Framework has consciously chose to use [http://pear.php.net/package/HTML_Template_Flexy Flexy] for a variety of reasons but know now that you can very quickly retrofit any of what you see to use any other templating engine (such as [http://smarty.php.net/ Smarty]).&lt;br /&gt;
&lt;br /&gt;
== Why Flexy? ==&lt;br /&gt;
&lt;br /&gt;
One of the more annoying questions I get from PHP developers is why Flexy?  Why Flexy?  Why Flexy?  First, keep in mind the Geeklog 2 Framework has been around in various forms since 2003 and back then one of the more annoying things about other template engines out there is their blatant desire to allow rendering of HTML and JavaScript by default.  Flexy, rightfully so, hates these things and will always escape them unless you explicitly tell it to allow them.  After that, Flexy is full of the sorts of features you'd like to see from a modern PHP template eninge.  Things like compiling of templates, support for control structures (IF's, FOR loops, etc), object-oriented design and out-of-the-box multi-language support via [http://pear.php.net/package/Translation2 PEAR::Translation2].&lt;br /&gt;
&lt;br /&gt;
Are there other good alternatives out there?  Absolutely, and let me remind you that just because the Geeklog 2 Framework uses Flexy that doesn't mean you couldn't retrofit your projects to use another engine.  That's the beauty of object-oriented code.&lt;br /&gt;
&lt;br /&gt;
== Your First View ==&lt;br /&gt;
&lt;br /&gt;
OK, enough talk...let's see an MVCnPHP view first hand.  Every view is comprised of two parts.  The first part is the MVCnPHP view which is responsible for pulling all data needed to be displayed on the page.  The second part is the Flexy template.  Let's first build the Flexy template by creating a page called Home.thtml.  Note that Geeklog 2 Coding Standards require that all HTML templates use the .thtml extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    This is a page created using the Geeklog 2 Framework.  You are viewing this page on {getDateTime()}.&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you would expect from a PHP template engine, the template file itself is mostly HTML.  The template above excercises a couple tasks such as showing data in a variable and calling a method.  Those familir with other template engines might notice the variable and method call noted by {} above. In the TITLE tag, there is the pageTitle variable and in the body there is a method call to getDateTime().  Where does that variable and method exist?  On the MVCnPHP view!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * MVCnPHP Abstract BaseView object&lt;br /&gt;
 */&lt;br /&gt;
require 'Geeklog/MVCnPHP/BaseView.php';&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * PEAR::HTML_Template_Flexy&lt;br /&gt;
 */&lt;br /&gt;
require 'Flexy.php';&lt;br /&gt;
&lt;br /&gt;
class SAMPLE_HomeView extend MVCnPHP_BaseView  {   &lt;br /&gt;
    /**&lt;br /&gt;
     * Handle to instance of a flexy object&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     * @var object&lt;br /&gt;
     */&lt;br /&gt;
     protected $flexyHandle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Page title&lt;br /&gt;
     * @var string&lt;br /&gt;
     * @access protected&lt;br /&gt;
     */&lt;br /&gt;
    protected $pageTitle = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;pageTitle = 'Your first MVCnPHP View';&lt;br /&gt;
        $this-&amp;gt;initializeFlexy();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Instantiates Flexy&lt;br /&gt;
     *&lt;br /&gt;
     * @access protected&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    protected function initializeFlexy()&lt;br /&gt;
    {&lt;br /&gt;
        $options = array(&lt;br /&gt;
            'templateDir'   =&amp;gt; '/path/to/templates',&lt;br /&gt;
            'compileDir'    =&amp;gt; '/path/to/templates/compiled_templates',&lt;br /&gt;
            'forceCompile'  =&amp;gt; 0,&lt;br /&gt;
            'debug'         =&amp;gt; 0,&lt;br /&gt;
            'locale'        =&amp;gt; 'en'       &lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;flexyHandle = new FARMS_HTML_Template_Flexy($options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets current date and time&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     * @return string Current date and time&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public function getDateTime()&lt;br /&gt;
    {&lt;br /&gt;
        return strftime('%D %T');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Shows the page.&lt;br /&gt;
     *&lt;br /&gt;
     * @access public&lt;br /&gt;
     */&lt;br /&gt;
    public function getView() {&lt;br /&gt;
        &lt;br /&gt;
        $this-&amp;gt;setPageTitle('Your first MVCnPHP View');&lt;br /&gt;
    	$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
        $this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So how does all the above work?  Let's run down the notable bits of code.  First of all, if you go back and look at the Flexy template we created, we had a variable called pageTitle.  It is no mistake that on our MVCnPHP view we have a public class member called pageTitle.  Similarly, the Flexy template had a call to a method getDateTime() which can be seen above as a public method on our MVCnPHP view.  The magic to all this is in the getView() method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;compile('Home.thtml');&lt;br /&gt;
$this-&amp;gt;flexyHandle-&amp;gt;outputObject($this);       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line above compiles our Flexy template Home.thtml into executable PHP code.  It's worth noting that Flexy is smart enough to only compile the template if the template hasn't be compiled yet or if the template itself has changed since the last compile.  This works exactly like JSP's in the Java world.&lt;br /&gt;
&lt;br /&gt;
The outputObject() call tell Flexy to now run the compiled template and that it should use our MVCnPHP view ($this) as the class that holds all the data and methods needed to render the page.&lt;br /&gt;
&lt;br /&gt;
Now you may be wondering how the getView() method even gets called.  That is done by the MVCnPHP Controller and it knows how to call our view based on it's configuration file.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4128</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4128"/>
				<updated>2006-09-21T13:59:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!  Create a new page, say, index.php that will reside in your application's document root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's quickly run through what is going on here.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above simple brings in my config.php that would have amongst other things in it the following $config array:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$conf['site_url'] = 'http://www.example.com';&lt;br /&gt;
$conf['path'] = '/path/to/my/application/';&lt;br /&gt;
$conf['path_views'] = $conf['path'] . 'views/';&lt;br /&gt;
$conf['path_commands'] = $conf['path'] . 'commands/';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next require brings in the code for the MVCnPHP controller.  Note that we assume that year PEAR directory is in your php.ini's include_path:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;require 'Geeklog/MVCnPHP/Controller.php';&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we have to configure and instantiate the controller:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
mvcconfig.xml is the controller configuration file we are handing to the controller we about to instantiate.  For now you can safely ignore what that file is as we cover it in great detail later.  As you see, we pass the location of the configuration file to the controller's constructor.&lt;br /&gt;
&lt;br /&gt;
After that there are a few options you'll want to set:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
The above gives the base URL which is then handed down to the various commands and views that are called upon. The site url is then used to build any URL reference for things like anchor and image tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above wraps up the MVCnPHP controller setup by specifying where on the file system the controller can find the various commands and views it will need to call upon.  After that it is a matter of simply telling the contoller to process the incoming request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we catch any unhandled exceptions and simply echo the exception message to the screen.  You could very easily replace all that with code to do some custom logging and special handling.&lt;br /&gt;
&lt;br /&gt;
What we have now is a single file, index.php, that instantiates one controller and then processes the incoming request.  You have to be wondering how the controller knows what to do, right?  That part is completely handled by the MVCnPHP configuration file which we'll cover in detail shortly.  Before we do that, [[Building_a_View|let us create a view]].&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4127</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4127"/>
				<updated>2006-09-21T13:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!  Create a new page, say, index.php that will reside in your application's document root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's quickly run through what is going on here.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above simple brings in my config.php that would have amongst other things in it the following $config array:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$conf['site_url'] = 'http://www.example.com';&lt;br /&gt;
$conf['path'] = '/path/to/my/application/';&lt;br /&gt;
$conf['path_views'] = $conf['path'] . 'views/';&lt;br /&gt;
$conf['path_commands'] = $conf['path'] . 'commands/';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next require brings in the code for the MVCnPHP controller.  Note that we assume that year PEAR directory is in your php.ini's include_path:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;require 'Geeklog/MVCnPHP/Controller.php';&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we have to configure and instantiate the controller:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
mvcconfig.xml is the controller configuration file we are handing to the controller we about to instantiate.  For now you can safely ignore what that file is as we cover it in great detail later.  As you see, we pass the location of the configuration file to the controller's constructor.&lt;br /&gt;
&lt;br /&gt;
After that there are a few options you'll want to set:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
The above gives the base URL which is then handed down to the various commands and views that are called upon. The site url is then used to build any URL reference for things like anchor and image tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above wraps up the MVCnPHP controller setup by specifying where on the file system the controller can find the various commands and views it will need to call upon.  After that it is a matter of simply telling the contoller to process the incoming request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we catch any unhandled exceptions and simply echo the exception message to the screen.  You could very easily replace all that with code to do some custom logging and special handling.&lt;br /&gt;
&lt;br /&gt;
What we have now is a single file, index.php, that instantiates one controller and then processes the incoming request.  You have to be wondering how the controller knows what to do, right?  That part is completely handled by the MVCnPHP configuration file which we'll cover in detail shortly.  Before we do that, [Building_a_View|let us create a view].&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4126</id>
		<title>MVCnPHP Installation</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4126"/>
				<updated>2006-09-19T21:03:34Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Installing MVCnPHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
Installation of MVCnPHP is quite easy.  First you need to [http://project.geeklog.net/frs/?group_id=7 get the tarball].  It was built as a [http://pear.php.net PEAR] package so assuming you have [http://www.php.net PHP5] installed you can install MVCnPHP using the PEAR command line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#&amp;gt;pear install /path/to/mvcnphp_pear_package.tgz&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it!  Now see how to [[MVCnPHPController|build your first controller]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4125</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4125"/>
				<updated>2006-09-19T21:02:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!  Create a new page, say, index.php that will reside in your application's document root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's quickly run through what is going on here.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above simple brings in my config.php that would have amongst other things in it the following $config array:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$conf['site_url'] = 'http://www.example.com';&lt;br /&gt;
$conf['path'] = '/path/to/my/application/';&lt;br /&gt;
$conf['path_views'] = $conf['path'] . 'views/';&lt;br /&gt;
$conf['path_commands'] = $conf['path'] . 'commands/';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next require brings in the code for the MVCnPHP controller.  Note that we assume that year PEAR directory is in your php.ini's include_path:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;require 'Geeklog/MVCnPHP/Controller.php';&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we have to configure and instantiate the controller:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
mvcconfig.xml is the controller configuration file we are handing to the controller we about to instantiate.  For now you can safely ignore what that file is as we cover it in great detail later.  As you see, we pass the location of the configuration file to the controller's constructor.&lt;br /&gt;
&lt;br /&gt;
After that there are a few options you'll want to set:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
The above gives the base URL which is then handed down to the various commands and views that are called upon. The site url is then used to build any URL reference for things like anchor and image tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above wraps up the MVCnPHP controller setup by specifying where on the file system the controller can find the various commands and views it will need to call upon.  After that it is a matter of simply telling the contoller to process the incoming request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we catch any unhandled exceptions and simply echo the exception message to the screen.  You could very easily replace all that with code to do some custom logging and special handling.&lt;br /&gt;
&lt;br /&gt;
What we have now is a single file, index.php, that instantiates one controller and then processes the incoming request.  You have to be wondering how the controller knows what to do, right?  That part is completely handled by the MVCnPHP configuration file which we'll cover in detail shortly.  Before we do that, let us create a view.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4124</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4124"/>
				<updated>2006-09-19T21:02:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!  Create a new page, say, index.php that will reside in your application's document root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's quickly run through what is going on here.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above simple brings in my config.php that would have amongst other things in it the following $config array:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$conf['site_url'] = 'http://www.example.com';&lt;br /&gt;
$conf['path'] = '/path/to/my/application/';&lt;br /&gt;
$conf['path_views'] = $conf['path'] . 'views/';&lt;br /&gt;
$conf['path_commands'] = $conf['path'] . 'commands/';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next require brings in the code for the MVCnPHP controller.  Note that we assume that year PEAR directory is in your php.ini's include_path:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;require 'Geeklog/MVCnPHP/Controller.php';&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we have to configure and instantiate the controller:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
mvcconfig.xml is the controller configuration file we are handing to the controller we about to instantiate.  For now you can safely ignore what that file is as we cover it in great detail later.  As you see, we pass the location of the configuration file to the controller's constructor.&lt;br /&gt;
&lt;br /&gt;
After that there are a few options you'll want to set:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
The above gives the base URL which is then handed down to the various commands and views that are called upon. The site url is then used to build any URL reference for things like anchor and image tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above wraps up the MVCnPHP controller setup by specifying where on the file system the controller can find the various commands and views it will need to call upon.  After that it is a matter of simply telling the contoller to process the incoming request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we catch any unhandled exceptions and simply echo the exception message to the screen.  You could very easily replace all that with code to do some custom logging and special handling.&lt;br /&gt;
&lt;br /&gt;
What we have now is a single file, index.php, that instantiates one controller and then processes the incoming request.  You have to be wondering how the controller knows what to do, right?  That part is completely handled by the MVCnPHP configuration file which we'll cover in detail shortly.  Before we do that, let us create a view.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4123</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4123"/>
				<updated>2006-09-19T21:01:02Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!  Create a new page, say, index.php that will reside in your application's document root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's quickly run through what is going on here.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&amp;lt;/code&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above simple brings in my config.php that would have amongst other things in it the following $config array:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$conf['site_url'] = 'http://www.example.com';&lt;br /&gt;
$conf['path'] = '/path/to/my/application/';&lt;br /&gt;
$conf['path_views'] = $conf['path'] . 'views/';&lt;br /&gt;
$conf['path_commands'] = $conf['path'] . 'commands/';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next require brings in the code for the MVCnPHP controller.  Note that we assume that year PEAR directory is in your php.ini's include_path:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;require 'Geeklog/MVCnPHP/Controller.php';&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we have to configure and instantiate the controller:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
mvcconfig.xml is the controller configuration file we are handing to the controller we about to instantiate.  For now you can safely ignore what that file is as we cover it in great detail later.  As you see, we pass the location of the configuration file to the controller's constructor.&lt;br /&gt;
&lt;br /&gt;
After that there are a few options you'll want to set:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
The above gives the base URL which is then handed down to the various commands and views that are called upon. The site url is then used to build any URL reference for things like anchor and image tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above wraps up the MVCnPHP controller setup by specifying where on the file system the controller can find the various commands and views it will need to call upon.  After that it is a matter of simply telling the contoller to process the incoming request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we catch any unhandled exceptions and simply echo the exception message to the screen.  You could very easily replace all that with code to do some custom logging and special handling.&lt;br /&gt;
&lt;br /&gt;
What we have now is a single file, index.php, that instantiates one controller and then processes the incoming request.  You have to be wondering how the controller knows what to do, right?  That part is completely handled by the MVCnPHP configuration file which we'll cover in detail shortly.  Before we do that, let us create a view.&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4122</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4122"/>
				<updated>2006-09-19T20:47:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the configuration file&lt;br /&gt;
require '/path/to/my/config.php';&lt;br /&gt;
&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    // Start output buffering so that if an exception occurs during&lt;br /&gt;
    // the generation of the output, it is still possible to clean&lt;br /&gt;
    // the buffer and regenerate the error screen instead.&lt;br /&gt;
    ob_start();&lt;br /&gt;
    &lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
    &lt;br /&gt;
    // If all is successful, output the successful view.&lt;br /&gt;
    ob_end_flush();    &lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4121</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4121"/>
				<updated>2006-09-19T20:45:32Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* MVCnPHP Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
// Bring in the MVC controller &lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    // Start output buffering so that if an exception occurs during&lt;br /&gt;
    // the generation of the output, it is still possible to clean&lt;br /&gt;
    // the buffer and regenerate the error screen instead.&lt;br /&gt;
    ob_start();&lt;br /&gt;
    &lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
    &lt;br /&gt;
    // If all is successful, output the successful view.&lt;br /&gt;
    ob_end_flush();    &lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4120</id>
		<title>MVCnPHPController</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHPController&amp;diff=4120"/>
				<updated>2006-09-19T20:43:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: Sample Controller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MVCnPHP Controller ==&lt;br /&gt;
&lt;br /&gt;
The MVCnPHP Controller is the heart of MVCnPHP.  Every controller you create using MVCnPHP is responsible for controlling program execution to the views and commands it is configured for.  It is not uncommont to have multiple controllers in one application and, in fact, on larger applications it is recommended.  How you decide to partition out multiple controllers is complete up-to-you but there are some examples that might help:&lt;br /&gt;
&lt;br /&gt;
# Plugin-based Applications.  A plugin architecture is a prefect place to implement multiple controllers as it would allow each plugin to define their own set of of controllers outside of the host application.&lt;br /&gt;
# Security Conscious Applications.  If your application has a number of administrative screens, you may decide to have all administrative views and commands to be handled by a controller separate from the rest of the application.  In fact, if you do this you can even use network wizardy for enhanced security like using proxy servers to lock down access to, say mysite.com/admin to a subnet while allow access to mysite.com/ to the entire internet!&lt;br /&gt;
# Very Large Applications.  If you get a PHP application that has a large number of views and command you may find that using multiple controllers will help with basic organization.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk!  So let us create our first controller!&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Bring in the MVC controller &lt;br /&gt;
 */&lt;br /&gt;
require 'Geeklog/MVCnPHP/Controller.php';&lt;br /&gt;
&lt;br /&gt;
// Instantiate the controller&lt;br /&gt;
$configFile = $conf['path'] . 'mvcconfig.xml';&lt;br /&gt;
$controller = new MVCnPHP_Controller($configFile);&lt;br /&gt;
$controller-&amp;gt;setBaseURL($conf['site_url']);&lt;br /&gt;
$controller-&amp;gt;setViewDir($conf['path_views']);&lt;br /&gt;
$controller-&amp;gt;setCommandDir($conf['path_commands']);&lt;br /&gt;
&lt;br /&gt;
// Now have the controller do some work&lt;br /&gt;
try {&lt;br /&gt;
    // Start output buffering so that if an exception occurs during&lt;br /&gt;
    // the generation of the output, it is still possible to clean&lt;br /&gt;
    // the buffer and regenerate the error screen instead.&lt;br /&gt;
    ob_start();&lt;br /&gt;
    &lt;br /&gt;
    $controller-&amp;gt;processRequest($urlArgs);&lt;br /&gt;
    &lt;br /&gt;
    // If all is successful, output the successful view.&lt;br /&gt;
    ob_end_flush();    &lt;br /&gt;
} catch (Exception $e) {&lt;br /&gt;
    die('Exception: ' . $e-&amp;gt;message());&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4119</id>
		<title>MVCnPHP Installation</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4119"/>
				<updated>2006-09-19T20:28:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Installing MVCnPHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
Installation of MVCnPHP is quite easy.  First you need to [http://project.geeklog.net/frs/?group_id=7 get the tarball].  It was built as a [http://pear.php.net PEAR] package so assuming you have [http://www.php.net PHP5] installed you can install MVCnPHP using the PEAR command line:&lt;br /&gt;
&lt;br /&gt;
#&amp;gt;pear install /path/to/mvcnphp_pear_package.tgz&lt;br /&gt;
&lt;br /&gt;
That's it!  Now see how to [[MVCnPHPController|build your first controller]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4118</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4118"/>
				<updated>2006-09-19T20:27:22Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Models, Views, Controllers Defined */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[[MVCnPHPController|Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4117</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4117"/>
				<updated>2006-09-19T20:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Models, Views, Controllers Defined */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[[X Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4116</id>
		<title>Model-View-Controller</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=Model-View-Controller&amp;diff=4116"/>
				<updated>2006-09-19T20:26:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: /* Models, Views, Controllers Defined */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Model-View-Controller ==&lt;br /&gt;
&lt;br /&gt;
If you don't know what it is, you better ask somebody.  Separating the user interface from business logic from data access is a framework essential and is key to making your application easier to maintain.  Most MVC implementations break code into atomic units of work that encourage reuse and maintainability.  Geeklog 2 uses MVCnPHP to accomplish this.&lt;br /&gt;
&lt;br /&gt;
== MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
MVCnPHP, Model-View-Controller iN PHP, is a simplified MVC implementation based very loosely off of Phrame and Struts with all the garbage taken out.  If you are Struts fan, don't take too much offense as I believe it is a good tool but it aims at doing more than a simple MVC implementation.  Phrame similarly is a Struts-like MVC implementation that share many of the same problems in Struts.  Since it's release back in 2003 it has kept it's simplicity and has significantly improved performance.  From this point on I'm going to assume you know what MVC and are eager to learn how to implement MVCnPHP in your application.&lt;br /&gt;
&lt;br /&gt;
== Models, Views, Controllers Defined ==&lt;br /&gt;
&lt;br /&gt;
Models are the data structures your PHP application will use and they represent the core business components of your business.  So, for example, you may very well have models that represent users, accounts and transactions.  Models are ideally simple PHP classes that are made up of members and their accessors (i.e. getters/setters).  Views are mechanisms used to render one or more models to a users.  Views are the visual component and in most basic web development terms are represented by a single screen.  A controller manages program execution between models and views and commands.  What's this command thing?  Commands are implementation of the command design pattern.  Commands are simply used to represent actions. Thus it is quite typical in MVC implementations to have a view submit data to a command which in turn requests another view to be show all being dispatched by the controller.  Is all this fuzzy?  No worry, let's look at each piece of MVCnPHP in more detail.&lt;br /&gt;
&lt;br /&gt;
#[[MVCnPHP Installation]]&lt;br /&gt;
#[x[Using the Controller]]&lt;br /&gt;
#[[Building a View]]&lt;br /&gt;
#[[Understanding the MVCnPHP Configuration File]]&lt;br /&gt;
#[[Building a Command]]&lt;br /&gt;
#[[Using Forwards]]&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	<entry>
		<id>http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4115</id>
		<title>MVCnPHP Installation</title>
		<link rel="alternate" type="text/html" href="http://gwiki3.thatlinuxbox.com/index.php?title=MVCnPHP_Installation&amp;diff=4115"/>
				<updated>2006-09-19T20:25:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tony: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing MVCnPHP ==&lt;br /&gt;
&lt;br /&gt;
Installation of MVCnPHP is quite easy.  First you need to [http://project.geeklog.net/frs/?group_id=7 get the tarball].  It was built as a [http://pear.php.net PEAR] package so assuming you have [http://www.php.net PHP5] installed you can install MVCnPHP using the PEAR command line:&lt;br /&gt;
&lt;br /&gt;
#&amp;gt;pear install /path/to/mvcnphp_pear_package.tgz&lt;br /&gt;
&lt;br /&gt;
That's it!&lt;/div&gt;</summary>
		<author><name>Tony</name></author>	</entry>

	</feed>