<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Clickframes</title>
	<atom:link href="http://www.clickframes.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.clickframes.org</link>
	<description>Agile Web Application Framework</description>
	<lastBuildDate>Mon, 07 Feb 2011 18:53:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CodeIgniter 2 support on radar screen</title>
		<link>http://www.clickframes.org/blog/2011/02/codeigniter-2-support-on-radar-screen/</link>
		<comments>http://www.clickframes.org/blog/2011/02/codeigniter-2-support-on-radar-screen/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 18:53:19 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=244</guid>
		<description><![CDATA[After reading the CodeIgniter 2.0.0 upgrade instructions, I&#8217;m feeling pretty confident that Clickframes-PHP will migrate easily. I&#8217;ll probably tackle the migration with my next new PHP project &#8212; check back here for updates.]]></description>
			<content:encoded><![CDATA[<p>After reading the <a href="http://codeigniter.com/user_guide/installation/upgrade_200.html">CodeIgniter 2.0.0 upgrade instructions</a>, I&#8217;m feeling pretty confident that Clickframes-PHP will migrate easily.</p>
<p>I&#8217;ll probably tackle the migration with my next new PHP project &#8212; check back here for updates.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2011/02/codeigniter-2-support-on-radar-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Defining e-mails with Clickframes-PHP</title>
		<link>http://www.clickframes.org/blog/2010/10/defining-e-mails-with-clickframes-php/</link>
		<comments>http://www.clickframes.org/blog/2010/10/defining-e-mails-with-clickframes-php/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 18:38:00 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=240</guid>
		<description><![CDATA[Clickframes allows you to specify the e-mails that should be sent when particular outcomes arise. Clickframes-PHP makes it easy to integrate dynamic content into your e-mails.]]></description>
			<content:encoded><![CDATA[<p>Clickframes allows you to specify the e-mails that should be sent when particular outcomes arise. At the moment, I&#8217;m writing password reset functionality for an app that I&#8217;m developing. When the user provides his e-mail address, the system will send a a unique URL by e-mail allowing him to reset his password &#8211; pretty routine stuff.</p>
<p>Clickframes-PHP makes it easy to integrate dynamic content into your e-mails, which keeps code customization to a minimum. I think it&#8217;s easiest to lead by example, so here&#8217;s a genuine appspec snippet:</p>
<pre name="code" class="xml">
&lt;email id="passwordReset"&gt;
	&lt;title&gt;Password Reset Message&lt;/title&gt;
	&lt;description&gt;
		Sent to user when he requests a password reset.
	&lt;/description&gt;
	&lt;emailSubject&gt;CookItLater Password Reset Request&lt;/emailSubject&gt;
	&lt;emailText&gt;
&lt;![CDATA[
Hi!

You're only moments away from getting back into to your recipe collection.

To reset your password, click this URL, or paste into your browser:

http://cookitlater.com/passwordReset/#{user.passwordResetCode}

The unique code in the URL will expire in 24 hours to prevent unauthorized access.

We've sent this e-mail to #{user.email} - if this request was sent in error, please accept our apologies for the inconvenience.

Thanks!
CookItLater
]]&gt;
	&lt;/emailText&gt;
	&lt;outputs&gt;
		&lt;output id="user" entity="user"&gt;
			&lt;title&gt;User&lt;/title&gt;
			&lt;description&gt;
				User who requested password reset.
			&lt;/description&gt;
		&lt;/output&gt;
	&lt;/outputs&gt;
&lt;/email&gt;
</pre>
<p>When define an output within your e-mail, its properties become available to your e-mail text using Apache Velocity syntax, e.g. <code>#{outputId.propertyId}</code></p>
<p>You can also define other substitution variables as you please, e.g. <code>#{myAwesomeVariable}</code>.</p>
<p>Clickframes-PHP generates a library class, <code>[appspecName]Email.class.php</code>, that manages all your e-mails. The class contains a send method for each e-mail; a method entitled <code>sendPasswordReset()</code> would be generated for the example above. The generated method accepts a &#8220;from&#8221; address, a &#8220;to&#8221; address, your substitution variables, and any outputs as parameters. Review the generated code for precise details.</p>
<p>The generated outcome code will automatically create your e-mail and send it. If you&#8217;re using Windows, I highly recommend <a href="http://smtp4dev.codeplex.com/">smtp4dev</a> to test e-mail locally.</p>
<p>If you&#8217;ve thought ahead a bit, you generally won&#8217;t need to customize the generated e-mail code. Please leave comments or contact the mailing list if you have questions or suggestions for improvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/10/defining-e-mails-with-clickframes-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configuring your Clickframes-PHP application</title>
		<link>http://www.clickframes.org/blog/2010/09/configuring-your-clickframes-php-application/</link>
		<comments>http://www.clickframes.org/blog/2010/09/configuring-your-clickframes-php-application/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 17:42:27 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=213</guid>
		<description><![CDATA[Clickframes-PHP is most powerful when you integrate your local development webserver directly with your Clickframes project files. I’ve tried to be thorough for first-time users, but once you’ve done this once, it only takes a few minutes to setup each subsequent project.]]></description>
			<content:encoded><![CDATA[<p>Clickframes-PHP is most powerful when you integrate your local development webserver directly with your Clickframes project files. I&#8217;ve tried to be thorough for first-time users, but after you&#8217;ve done this once, it only takes a few minutes to setup each subsequent project.</p>
<h4>Create your project</h4>
<p>See <a href="http://www.clickframes.org/blog/2010/08/starting-a-new-clickframes-php-project/">Starting a new Clickframes-PHP project</a> for how to create a basic Clickframes-PHP project, then continue below.</p>
<h4>Install Apache, PHP, and a database</h4>
<p>If you&#8217;re here, you probably know how to do this already. For ease, I like to use <a href="http://www.wampserver.com/en/">Wampserver</a> on Windows. If you&#8217;re going to use an <a href="http://www.sqlite.org/">SQLite</a> database, no installation is necessary.</p>
<h4>Enable required PHP libraries</h4>
<p>To use SQLite 3 with your Clickframes-PHP project, make sure the required <a href="http://www.php.net/manual/en/pdo.installation.php">extensions for PDO and SQLite are installed and enabled</a> in <code>php.ini</code></p>
<h4>Point Apache to your project&#8217;s webapp directory</h4>
<p>There are a few approaches to this, but here&#8217;s the quick and dirty way to get Apache to serve files directly from your development directory.</p>
<p>Open up Apache&#8217;s <a href="http://httpd.apache.org/docs/2.2/configuring.html"><code>httpd.conf</code></a> and set your document root to the <code>src\main\php\webapp</code> directory of your project.</p>
<pre name="code" class="php">
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "d:/workspace/php-quickstart/src/main/php/webapp"
</pre>
<p>Further along in <code>httpd.conf</code>, configure the <Directory> settings for your DocumentRoot defined above. Your preferences may be different from below; these rules are pretty secure.</p>
<pre name="code" class="xml">
&lt;Directory "d:/workspace/php-quickstart/src/main/php/webapp"&gt;
    Options Indexes FollowSymLinks
    AllowOverride all
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
&lt;/Directory&gt;
</pre>
<h4>Create your database tables</h4>
<p>After you&#8217;ve run <code>mvn clickframes:gen</code>, the entities in your appspec will be translated into database schemas. Look in <code>\src\main\sql</code> for the SQL scripts that match your database (MySQL or SQLite 3).</p>
<p>If you&#8217;re using SQLite, it helps to have a graphical management tool; I&#8217;ve been using the free, open-source <a href="http://sqliteman.com/">Sqliteman</a>.</p>
<h4>Copy CodeIgniter system files</h4>
<p>Download CodeIgniter 1.7.2 and copy the <code>system</code> directory somewhere convenient. I keep mine in <code>d:\CodeIgniter_1.7.2\system</code>.</p>
<p><strong>To use SQLite 3, you must install a newer database driver.</strong> Download <a href="http://code.google.com/p/clickframes-php/downloads/detail?name=codeigniter_pdo_sqlite.zip&#038;can=2&#038;q=#makechanges">codeigniter_pdo_sqlite.zip</a> and unzip into the <code>system/database/drivers</code> directory.</p>
<h4>Customize index.php</h4>
<p>CodeIgniter&#8217;s main <code>index.php</code> file lives in your project at <code>src/main/php/webapp/</code>. Change the <code>$system_folder</code> variable to point to the location of your <code>system</code> folder as copied above.</p>
<h4>Customize project config files</h4>
<p>Your application&#8217;s configuration files are found in <code>src/main/php/webapp/application/config</code>. To get started, you only need to change these:</p>
<ul>
<li>
    <strong><code>config.php</code></strong><br />
    Customize <code>$config['base_url']</code>
  </li>
<li>
    <strong><code>database.php</code></strong><br />
    If you aren&#8217;t using SQLite, customize settings for your database.
  </li>
<li>
    <strong><code>email.php</code></strong><br />
    Customize <code>$config['smtp_host']</code> to use an SMTP server somewhere other than <code>localhost</code>.
  </li>
</ul>
<h4>Go!</h4>
<p>Open a browser and visit <a href="http://localhost/">http://localhost/</a>. If all went well, you&#8217;ll be looking at the default page you defined in your appspec.</p>
<p>Try customizing your appspec and regenerating with <code>mvn clickframes:gen</code> &mdash; your changes will be immediately visible in your browser.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/09/configuring-your-clickframes-php-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring Clickframes-PHP Maven settings</title>
		<link>http://www.clickframes.org/blog/2010/08/configuring-clickframes-php-maven-settings/</link>
		<comments>http://www.clickframes.org/blog/2010/08/configuring-clickframes-php-maven-settings/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 03:51:26 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=198</guid>
		<description><![CDATA[A brief review of the user-serviceable elements of your project's pom.xml file, like name, version, groupId, and artifactId.]]></description>
			<content:encoded><![CDATA[<p>If you have no interest in using Maven for project management, then you probably don&#8217;t need to touch your Maven project settings, which are stored in a file called <code>pom.xml</code> (Maven&#8217;s <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html">Project Object Model</a>).</p>
<p>Most of the defaults are fine, but there are few key elements some folks may want to update.</p>
<p>Starting at the fifth line of <code>pom.xml</code>, you&#8217;ll see:</p>
<pre name="code" class="xml">
&lt;groupId&gt;php-quickstart&lt;/groupId&gt;
&lt;artifactId&gt;php-quickstart&lt;/artifactId&gt;
&lt;packaging&gt;pom&lt;/packaging&gt;
&lt;name&gt;PHP Quickstart&lt;/name&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
</pre>
<p>The <strong>groupId</strong> is an identifier that&#8217;s typically unique within your organization, and usually follows a Java package structure. All official Clickframes components use the groupId <code>org.clickframes</code>. If your company has its website at mycompany.com, your groupId could be <code>com.mycompany</code>.</p>
<p>The <strong>artifactId</strong> is the unique identifier for your project, within the context of the above groupId. It has no spaces, and words are usually separated by hyphens. An issue tracker application might have an artifactId of <code>issue-tracker</code>.</p>
<p>The <strong>packaging</strong> element specifies what Maven should generate when you build your project. For our purposes, <code>pom</code> is just right.</p>
<p>The <strong>name</strong> element is a descriptive, properly spaced and capitalized name for your project, e.g. <code>Crazy Al's Discount Issue Tracker</code>.</p>
<p>Finally, the <strong>version</strong> element indicates the current version of your project. Maven traditionally uses the <code>SNAPSHOT</code> designation to indicate versions that are under development. For example, you might start your project as <code>1.0-SNAPSHOT</code> When you&#8217;re ready to release, you&#8217;d change it to 1.0 and check it in to your source control with a special &#8220;version 1.0&#8243; tag. Then, you&#8217;d change the version to 1.1-SNAPSHOT to work on the next minor release, or to 2.0-SNAPSHOT if for a more major release. Maven can automate this process for you using the <a href="http://maven.apache.org/plugins/maven-release-plugin/">release plugin</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/08/configuring-clickframes-php-maven-settings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Starting a new Clickframes-PHP project</title>
		<link>http://www.clickframes.org/blog/2010/08/starting-a-new-clickframes-php-project/</link>
		<comments>http://www.clickframes.org/blog/2010/08/starting-a-new-clickframes-php-project/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 16:04:33 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=181</guid>
		<description><![CDATA[Here's everything you need to know to get started with Clickframes-PHP, from generating your project to configuring your database and web server.]]></description>
			<content:encoded><![CDATA[<h4>Install Java &amp; Maven</h4>
<p>Java 1.6 is required for using Clickframes. Check the version of Java installed on your computer:</p>
<p><code>java -version</code></p>
<p>If you don&#8217;t have Java installed, you can get Java 1.6 from <a href="http://www.java.com/en/download">http://www.java.com/en/download</a>.</p>
<p>Clickframes uses Maven to build projects. If you don&#8217;t have Maven installed, you can download it from <a href="http://maven.apache.org/download.html">http://maven.apache.org/download.html</a> and follow the installation instructions toward the bottom of that page&mdash;it&#8217;s usually as simple as unzipping the download into a directory and adding Maven&#8217;s <code>bin</code> directory to your <code>PATH</code> environment variable.</p>
<p>After installing Maven, you should be able to run the following command:</p>
<p><code><strong>$ mvn -version</strong><br />
Maven version: 2.0.9<br />
Java version: 1.6.0_10<br />
OS name: "linux" version: "2.6.23.15-137.fc8" arch: "i386" Family: "unix"<br />
</code></p>
<h4>Download Quickstart Package</h4>
<p>The PHP Quickstart download contains a fully operational Maven project, ready to customize and run. The provided appspec describe an &#8220;Issue Tracker&#8221; application. This demo app is a good way to kick the tires, and a good template for creating your own appspecs.</p>
<ol>
<li>Download the latest Quickstart ZIP package from the <a href="http://code.google.com/p/clickframes-php/downloads/list?can=2&#038;q=quickstart">Google Code downloads page</a>.</li>
<li>Unzip it somewhere. By default, the contents appear in a subdirectory called <code>php-quickstart</code>.</li>
<li>Open your command line, go to the <code>php-quickstart</code> directory, and run <code>mvn clickframes:gen</code></li>
</ol>
<h4>Next steps</h4>
<ul>
<li>Get your newly generated app set up and running in Apache: see <a href="http://www.clickframes.org/blog/2010/09/configuring-your-clickframes-php-application/">Configuring your Clickframes-PHP application</a>.</li>
<li>To understand the file structure of your generated Clickframes-PHP project, read <strong>Clickframes-PHP Project Structure</strong></li>
<li>Customize your Maven project settings: see <a href="http://www.clickframes.org/blog/2010/08/configuring-clickframes-php-maven-settings/">Configuring Clickframes-PHP Maven settings</a>.</li>
<li>To learn about packaging your Clickframes-PHP project for deployment, read <strong>Deploying your Clickframes-PHP project</strong>.</li>
<li>For help with your appspec and Clickframes XML, see the <a href="http://www.clickframes.org/docs/main/latest/book/#d0e122">Core documentation</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/08/starting-a-new-clickframes-php-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP plugin in the final stretch</title>
		<link>http://www.clickframes.org/blog/2010/08/php-plugin-in-the-final-stretch/</link>
		<comments>http://www.clickframes.org/blog/2010/08/php-plugin-in-the-final-stretch/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 21:00:52 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=178</guid>
		<description><![CDATA[Just a few more features before we reach minimum-viable-plugin. The last big item before I kick the tires, fix bugs, and release is file upload/download support.]]></description>
			<content:encoded><![CDATA[<p>Just a few more features before we reach minimum-viable-plugin. The last big item before I kick the tires, fix bugs, and release is <strong>file upload/download support</strong>.  This feature touches every part of an app (database, models, controllers, views) and many parts of the Clickframes infrastructure (entities, outputs, outputLists, forms, inputs).  It&#8217;s a bit tricky to implement, but it really showcases the value of Clickframes &#8212; I only need to write this code once, in a plugin, and then I get it for free with every webapp I design.</p>
<p>Thank you, Clickframes!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/08/php-plugin-in-the-final-stretch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up SQLite3 in CodeIgniter</title>
		<link>http://www.clickframes.org/blog/2010/08/setting-up-sqlite3-in-codeigniter/</link>
		<comments>http://www.clickframes.org/blog/2010/08/setting-up-sqlite3-in-codeigniter/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 20:19:21 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=165</guid>
		<description><![CDATA[SQLite&#8217;s file-based database is an ideal match for Clickframes-PHP, so I took some time to figure out how to SQLite3 in CodeIgniter. I quickly found this PDO SQLite3 driver on the CodeIgniter wiki, and then found these fixes in the forum. I&#8217;ve combined the two, cleaned up the code a little, improved the log messages, [...]]]></description>
			<content:encoded><![CDATA[<p>SQLite&#8217;s file-based database is an ideal match for Clickframes-PHP, so I took some time to figure out how to SQLite3 in CodeIgniter.</p>
<p>I quickly found this <a href="http://codeigniter.com/wiki/PDO_SQLite3/">PDO SQLite3 driver</a> on the CodeIgniter wiki, and then found <a href="http://codeigniter.com/forums/viewthread/161737/">these fixes</a> in the forum.</p>
<p>I&#8217;ve combined the two, cleaned up the code a little, improved the log messages, and <a href="http://code.google.com/p/clickframes-php/downloads/detail?name=codeigniter_pdo_sqlite.zip">posted it</a> on the Clickframes-PHP Google Code site.</p>
<p>Here&#8217;s how to set up CodeIgniter to use SQLite3 with Clickframes-PHP, assuming your core CodeIgniter files are installed at BASEPATH (your &#8220;system&#8221; folder), and your application is installed at APPPATH.</p>
<ol>
<li><a href="http://code.google.com/p/clickframes-php/downloads/detail?name=codeigniter_pdo_sqlite.zip">Download the driver ZIP</a> and expand it into <code>BASEPATH/database/drivers</code>. This will create a subdirectory called <code>pdo_sqlite</code>.</li>
<li>Make sure PHP has SQLite3 PDO support enabled. Open <code>php.ini</code> and uncomment the line with <code>extension=php_pdo_sqlite.dll</code> and restart your web server.</li>
<li>The database configuration file generated by Clickframes-PHP at <code>APPPATH/config/database.php</code> enables the <code>pdo_sqlite</code> database driver by default, and expects your database file to live at <code>APPPATH/db/database.sqlite</code>. Change the file path if you prefer your database file elsewhere.</li>
</ol>
<p>Use the database creation script generated by Clickframes-PHP in <code>src/main/sql/sqlite</code> to create/recreate your database. <a href="http://sqliteman.com/">Sqliteman</a> is a decent (and free) database management GUI tool for running the scripts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/08/setting-up-sqlite3-in-codeigniter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Plugin Status &#8211; August 10</title>
		<link>http://www.clickframes.org/blog/2010/08/php-plugin-status-august-10/</link>
		<comments>http://www.clickframes.org/blog/2010/08/php-plugin-status-august-10/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 14:39:25 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.clickframes.org/?p=162</guid>
		<description><![CDATA[I've spent much of the last week refactoring and extending the Clickframes-PHP code generation plugin, so I thought I'd report on the current state of the project.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spent much of the last week refactoring and extending the Clickframes-PHP code generation plugin, so I thought I&#8217;d report on the current state of the project.</p>
<p>The major accomplishment has been upgrading the plugin&#8217;s auto-generated model to fully support entities, just like our Java plugins. An app built with Clickframes-PHP will now perform CRUD out of the box, with real databases (MySQL or SQLite). It will also generate &#8220;create&#8221; and &#8220;drop&#8221; scripts for both database platforms, and a foreign-key creation script for MySQL.</p>
<p>With that hurdle overcome, the plugin is quite useful, but considerable work remains.  Here are the known tasks:</p>
<ul>
<li><strong>output</strong><br />
	<del datetime="2010-08-20T02:59:59+00:00">Needs file display support</del></li>
<li><strong>outputList</strong><br />
	<del datetime="2010-08-18T20:42:46+00:00">Needs action support</del><br />
	<del datetime="2010-08-20T02:59:59+00:00">Needs file display support</del></li>
<li><strong>form/input</strong><br />
	Needs basic multiple-property support<br />
	<del datetime="2010-08-18T15:33:10+00:00">Needs client side validation</del><br />
	Needs full test of all input types<br />
	<del datetime="2010-08-17T18:01:26+00:00">Needs action type=&#8221;update&#8221; support</del><br />
	<del datetime="2010-08-20T02:59:59+00:00">Needs file upload support</del></li>
<li><strong>content</strong><br />
	<del datetime="2010-08-19T15:53:38+00:00">Needs to be migrated to language file with non-verbatim support</del></li>
<li><strong>entity</strong><br />
	<del datetime="2010-08-17T18:01:26+00:00">Needs default update support in model</del></li>
<li><strong>email</strong><br />
	<del datetime="2010-08-11T03:41:05+00:00">Not yet refactored</del></li>
<li><strong>fact</strong><br />
	Need to display in comments throughout code</li>
<li><strong>authentication</strong><br />
	<del datetime="2010-08-19T20:15:33+00:00">Not yet refactored.</del></li>
</ul>
<p>If you&#8217;d like to follow in detail, check out the <a href="http://code.google.com/p/clickframes-php/updates/list">updates</a> section on our Google Code project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/08/php-plugin-status-august-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Generation for Web Applications with Clickframes</title>
		<link>http://www.clickframes.org/blog/2010/02/code-generation-for-web-applications-with-clickframes/</link>
		<comments>http://www.clickframes.org/blog/2010/02/code-generation-for-web-applications-with-clickframes/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 22:02:49 +0000</pubDate>
		<dc:creator>Vineet Manohar</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://new.clickframes.org/?p=86</guid>
		<description><![CDATA[Clickframes is a Code Generation framework written in Java designed specifically to generate (Java) web applications. Clickframes lets you jump start your new project with working generated code at minute zero. Keep what you've learnt in one project and reuse in another project using Clickframes Code Generation templates, or simply use the templates that come with Clickframes. The key to the Clickframes approach is separating what an application does and how it does it. What an application does is specific to the project, but how it does it can be generalized and reused across multiple project using code generation.]]></description>
			<content:encoded><![CDATA[<h3>What is Clickframes?</h3>
<p><a href="http://www.clickframes.org" target="_blank">Clickframes</a> is a Code Generation framework written in Java designed specifically to generate (Java) web applications.</p>
<h3>Philosophy behind Clickframes</h3>
<p>There are 2 aspects to a web application:</p>
<ol>
<li><em>What</em> the application does.</li>
<li><em>How</em> it does it.</li>
</ol>
<p>The key idea behind Clickframes is <strong>separation of these two concerns</strong>.</p>
<p><em>What</em> the application can be defined by focusing on end user experience &#8211; <strong>what</strong> the end user sees, <strong>what</strong> the user clicks and so on. When users open a webapp in a browser they see a page, links,  forms, inputs, content. They don&#8217;t see how the page was produced, which technology, framework or database was used on the back end. Defining what an application does boils does to defining a web page, after all a web application is most part is a collection of web pages linked to each other via links and form actions.</p>
<p>On the other hand, <em>how</em> an application is implemented consists of every little detail that happens &#8220;behind the scenes&#8221;. Which technology, platform and database is used, all the choices which result in a working application &#8211; but are never directly seen by the end user directly.</p>
<p><strong>Clickframes separates these two aspects of the application by defining an application model</strong> called Appspec. <strong>Appspec is a rich data structure which represents the application behavior</strong>. The business analyst defines the application behavior using the Appspec model. The developer writes code generators to implement a generic Appspec and then runs them for the specific Appspec written by the business analyst. Appspec becomes a contract and a way of communication between the analyst and the developer. In the meantime QA takes the Appspec and writes tests against it. Appspec becomes a way of communication and the single source of truth for the various members of the team.</p>
<p>To give you a concrete sense of what I am talking about, let&#8217;s say that the Appspec has a page called &#8220;home&#8221;. The developer may choose to implement this using a simple jsp file &#8220;home.jsp&#8221;. The developer then generalizes this implementation and creates a code generator to produce a file called [page id].jsp for every page in the Appspec. Again, the philosophy being &#8220;if I can figure out how to implement one page, I can apply the same approach for all pages&#8221;. This approach implemented via a set of code generators applied against the application definition (or Appspec) is the key idea of the Clickframes approach. The result is an automatically generated application for a given target platform/technology (e.g. &#8220;jsp&#8221; in the previous example) which produces consistent code for the entire application. This code is produced using code generators at minute zero of your project, i.e. even before you start working on your project. You can then take the generated code and start customizing it. This is a great productivity boost as you can use the same code generators from one project to another as they are not specific to any particular application, but are written for the generic Appspec model for the given target technology/platform. Such code generators usually exists are code generation templates and are referred to as <strong>Clickframes Plugin</strong>.</p>
<h3>Terminology</h3>
<p>To recap the terminology:</p>
<p><strong>Appspec (Application Specification) &#8211; </strong>Appspec is <strong><em>what</em></strong> the web application does, from an end user&#8217;s perspective. It essentially captures the behavior of the application. How many pages does the application have, how many forms does each page have. How many input fields on each page. What type of input fields (e.g. text, textarea, radio, dropdown). Are there any validation rules on the input fields (e.g. must be 8-12 characters, or must be a zipcode, must be a valid email format). What is the next page when the user submits a form on a page. How many links on the page, do the links point to another page in the application or an external link. The list goes on,  but you get the idea.</p>
<p><strong>Clickframes Plugin &#8211; </strong>Clickframes Plugin is a code generator, usually implemented by creating a set of templates, which inputs an Appspec and generates code. A plugin is usually a zip file consisting of dozens of templates written in plain text or velocity. Plugins can also be written or extended in Java using the Clickframes Plugin API.</p>
<p><strong>Clickframes Plugin Authors &#8211; </strong>(Usually) Senior or Experienced developers who have a good understanding of the target technology create a plugin to implement the Appspec. Note that this activity needs to be done only once per technology. For example, once I have created a Seam2 plugin, you can generate any number of applications by simply writing an Appspec for your application and generate Seam code by using the plugin.</p>
<p><strong>Target language/platform</strong> &#8211; Clickframes is a Code Generation framework that you use before you even start your project. It generates code that you then compile and run. Target platform refers to the platform on which the generate code runs. Example target platforms are Java/Tomcat, Java/Seam/JBoss, JSF/Tomcat, PHP. If you are willing to write your own code generation templates, you can generate code for any language/target platform.</p>
<h3>Why Clickframes?</h3>
<p>One advantage of Clickframes is that it acts as a medium of communication between the various members of the team.</p>
<p>However, the most powerful feature of Clickframes is the Clickframes Code Generation Plugins. Once you write a plugin for a technology or platform, you can instantly generate a full working application by simply writing the Appspec for that application and running the Clickframes Plugin on this Appspec . Writing an Appspec should be much easier than implementing the application itself.</p>
<h3>Hello, World example</h3>
<p>Let say an application has one page which has the text &#8220;Hello, World&#8221;. You can create the Appspec by either using the Java API or XML format.</p>
<h4>Creating appspec via XML</h4>
<pre name="code" class="xml">&lt;appspec&gt;
  &lt;pages&gt;
    &lt;page id="home"&gt;
     &lt;contents&gt;
      &lt;content id="message1"&gt;Hello, world&lt;/content&gt;
     &lt;/contents&gt;
    &lt;/page&gt;
  &lt;/pages&gt;
&lt;/appspec&gt;</pre>
<h4>Creating appspec via Java</h4>
<pre name="code" class="java">Appspec appspec = new Appspec();
Page home = new Page();
Content message1 = new Content();
message1.setId("message1");
message1.setText("Hello, World");
home.getContents().add(message1);
appspec.getPages().addPage(home);</pre>
<h4>Clickframes sample JSP Plugin</h4>
<p>Now lets build a simple JSP code generator. <em>This code generator is just for the purpose of illustration and is not intended to be a real production quality plugin.</em></p>
<p>Create a file called <strong>${page.id}.jsp.</strong> Since the file name consists of the variable ${page} this file will automatically be applied to all pages in the application.</p>
<p>Contents of <strong>${page.id}.jsp</strong> below. All templates are written in <a href="http://velocity.apache.org/engine/releases/velocity-1.6.2/user-guide.html" target="_blank">Apache Velocity</a>.</p>
<p>The ${page} variable passed to the template represents the Java object defined above.</p>
<pre name="code" class="xml">&lt;html&gt;
 &lt;body&gt;
#foreach ($content in $page.contents)
  &lt;div id="${content.id}"&gt;${content.text}&lt;/div&gt;
#end
 &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Running this plugin against the above model will produce one file called &#8220;<strong>home.jsp</strong>&#8221; with the following content.</p>
<pre name="code" class="xml">&lt;html&gt;
 &lt;body&gt;
  &lt;div id="message1"&gt;Hello, World&lt;/div&gt;
 &lt;/body&gt;
&lt;/html&gt;</pre>
<p>You can now add a dozen pages to your application and reuse the same code generation template.</p>
<h3>A more comprehensive demo</h3>
<p>The above example is good to give you a quick sense of how the code generation works. However, real applications contains forms, links, inputs, actions, entities, databases and so on. The following example uses a JSF Seam2 plugin which is used to generate a simple Issue Tracker Application.</p>
<p>The best way to jump in and get your feet wet is by seeing and running the code. I have created a JSF Seam2 plugin which generates JSF2 and Seam based web applications.</p>
<p>Here&#8217;s the <a href="http://code.google.com/p/clickframes-seam-issuetracker-demo/source/browse/trunk/src/main/clickframes/appspec.xml" target="_blank">Appspec</a> for the application and you can browse the generated code <a href="http://code.google.com/p/clickframes-seam-issuetracker-demo/source/browse/trunk/" target="_blank">here</a>. There is a hosted version of running demo at <a href="http://demo.clickframes.org/tracker/">http://demo.clickframes.org/tracker/</a></p>
<p><strong>Checkout the project code:</strong></p>
<pre name="code" class="css">svn checkout http://clickframes-seam-issuetracker-demo.googlecode.com/svn/trunk/ clickframes-seam-issuetracker-demo</pre>
<p><strong>Run it:</strong></p>
<pre name="code" class="css">cd clickframes-seam-issuetracker-demo
mvn glassfish:run</pre>
<p>See the application run at <a href="http://localhost:8080/issuetracker/" target="_blank">http://localhost:8080/issuetracker/</a><br />
You can type any login/password to login. The login module implemented by default does passes any input. In the future I plan modify the plugin to properly implement login.</p>
<p><strong>Key demo features:</strong></p>
<ul>
<li><strong>Security</strong>: pages with login-required=&#8221;true&#8221; will automatically prompt you for login.</li>
<li><strong>AJAX</strong> input validation: inputs with validation will prompt you with an error as you type if the validation fails</li>
<li><strong>Built-in CRUD implementation</strong> using in-memory database: actions marked with &#8220;update&#8221; or &#8220;create&#8221; will actually create an entity and store it in an in memory database</li>
</ul>
<p>Note that this application is 100% generated directly from the <a href="http://code.google.com/p/clickframes-seam-issuetracker-demo/source/browse/trunk/src/main/clickframes/appspec.xml" target="_blank">Appspec</a>. What is means is that you can modify the application behavior by modifying the Appspec and regenerate the application.</p>
<p><strong>Regenerate:</strong></p>
<pre name="code" class="css">mvn clickframes:generate</pre>
<h4>Can you really model every single thing about a web application?</h4>
<p>No. Clickframes focuses on things which <em>can</em> be easily modeled. Even if you are able to capture 50% of the application features in the Appspec, you can generate a working application which implements 50% of requirement without writing a single line of code. That&#8217;s quite a jump in productivity. You can then hand code the remaining application the usual way.</p>
<h3>Case for Clickframes</h3>
<p>Clickframes is not for all web applications. If the Clickframes model fits your application model then I urge you to give Clickframes a try. With Clickframes you can produce consistent code for your entire application. You can bake the best practices right into the code generation templates. Moreover, you can use these templates from one project to another.</p>
<h3>References and Links</h3>
<ul>
<li>Clickframes official website: <a href="http://www.clickframes.org" target="_blank">www.clickframes.org</a></li>
<li>Follow Clickframes on Twitter: <a href="http://twitter.com/clickframes" target="_blank">http://twitter.com/clickframes</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2010/02/code-generation-for-web-applications-with-clickframes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ignite Boston Video</title>
		<link>http://www.clickframes.org/blog/2009/11/ignite-boston-video/</link>
		<comments>http://www.clickframes.org/blog/2009/11/ignite-boston-video/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:14:20 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://new.clickframes.org/?p=107</guid>
		<description><![CDATA[The video from the Clickframes talk at Ignite Boston 6 is now online. The Quicktime Video is here. Warning, big!]]></description>
			<content:encoded><![CDATA[<p>The video from the Clickframes talk at Ignite Boston 6 is now online. The <a href="http://cdn.oreilly.com/ignite/boston/6/Ignite_19_William_Crawford.mov">Quicktime Video</a> is here. Warning, big!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickframes.org/blog/2009/11/ignite-boston-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://cdn.oreilly.com/ignite/boston/6/Ignite_19_William_Crawford.mov" length="24326466" type="video/quicktime" />
		</item>
	</channel>
</rss>

