<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5894084172436594728</id><updated>2012-02-16T09:06:44.006-05:00</updated><title type='text'>Wax PHP Framework</title><subtitle type='html'>Development Progress, Tutorials, and Resources for the Wax PHP Framework.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-713357880256046026</id><published>2010-05-05T16:50:00.004-04:00</published><updated>2010-05-06T15:49:49.358-04:00</updated><title type='text'>Zoho Creator</title><content type='html'>So I found a company that provides basically the exact same functionality that I hope to provide with Wax.  I knew there had to be someone out there with similar ideas, I just can't believe it took this long to find them.  The company is called Zoho and their product is called Zoho Creator.  It's basically designed to be an online database builder that lets you build custom applications around the database. 

So, if you want to see the long term aspirations for this project, check out &lt;a href='http://www.zoho.com/creator/platform-features.html'&gt;http://www.zoho.com/creator/platform-features.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-713357880256046026?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/713357880256046026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/05/zoho-creator.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/713357880256046026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/713357880256046026'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/05/zoho-creator.html' title='Zoho Creator'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-7371986687468629784</id><published>2010-05-05T00:35:00.008-04:00</published><updated>2010-05-05T15:21:35.424-04:00</updated><title type='text'>Wax 0.11 and a Tutorial</title><content type='html'>So I finally managed to get a release together in time for this poster session.  There are some things that I had hoped to have working that I just didn't have time for.  The greatest contributor to this is that I did a rewrite on most of the blocks used by Wax after changing the routing methods.

&lt;h2&gt;Features Supported, but are probably still pretty buggy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scaffolding (Create/Read/Update/Delete)&lt;/li&gt;
&lt;li&gt;Dynamic Model (Modify/Add Attribute/Remove Attribute/Remove Model)
&lt;ul&gt;&lt;li&gt;Fully implemented in DDS&lt;/li&gt;
&lt;li&gt;Partially Implemented by WaxPDO (implements the DDM directly in SQL using ALTER TABLE)-- &lt;b&gt;NOT RECOMMENDED&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Context wrappers (similar to controllers, but not really), and Role Methods&lt;/li&gt;
&lt;li&gt;Views&lt;/li&gt;
&lt;li&gt;Layouts&lt;/li&gt;
&lt;li&gt;Wax Querystring Routing (/Object/_id/method/arg/arg/...)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Things that kindof work, but aren't documented and are full of bugs&lt;/h2&gt;
See the previous post for more details about these.
&lt;ul&gt;
&lt;li&gt;Login System (Requires creation of extra views and custom session management code)&lt;/li&gt;
&lt;li&gt;ACL (Front-ends aren't done, Still very buggy)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Things that don't work / not implemented / TODO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ajax support&lt;/li&gt;
&lt;li&gt;Recursive Models (IE: auto-detect parents and children when fetching data)&lt;/li&gt;
&lt;li&gt;Advanced Attributes (facebook-style)&lt;/li&gt;
&lt;li&gt;Hidden Attributes (for the AntiSpam attribute, mostly)&lt;/li&gt;
&lt;li&gt;Custom Forms (more on this once it's implemented)&lt;/li&gt;
&lt;li&gt;Multiple layouts/output formats (ie: HTML, Ajax, RSS, etc.)&lt;/li&gt;
&lt;li&gt;CouchDB interactivity with the Dynamic Model *high priority*&lt;/li&gt;
&lt;/ul&gt;

Documentation is still pretty rough, but any feedback is welcome.  There's also quite a few security flaws that I haven't quite sorted out yet. 

You can check out the tutorial at &lt;a href='http://code.google.com/p/waxphp/wiki/GettingStarted'&gt;The Getting Started wiki page&lt;/a&gt; and grab the downloads from &lt;a href='http://code.google.com/p/waxphp'&gt;The Google Code Page&lt;/a&gt; or from the sidebar on the right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-7371986687468629784?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/7371986687468629784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/05/wax-011-and-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7371986687468629784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7371986687468629784'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/05/wax-011-and-tutorial.html' title='Wax 0.11 and a Tutorial'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-5262487709102396189</id><published>2010-05-03T10:26:00.000-04:00</published><updated>2010-05-03T10:32:59.132-04:00</updated><title type='text'>Users, Permissions, and the ACL</title><content type='html'>With frameworks inevitably comes the need to authenticate users and control permissions.  In Wax, this need must be very carefully planned out, since the dynamic nature of the system allows for (almost) any object to have permissions on almost any other object.  Let's consider a simple example:

We have a Users object and a Tickets object.  Regular users can view a list of tickets, while Administrators can CRUD the tickets.  We want to make sure that these are the permissions applied in the system.

&lt;h3&gt;Creating a Model that has Permissions&lt;/h3&gt;As much as I would love to say that there is no coding involved in the creation of a login system, there are a few things that need to be done to make the system work properly.

&lt;h2&gt;Creating an Object with rLoginIdentifier and rPermissionHolder&lt;/h2&gt;The Wax DDM (Dynamic Data Model) provides two roles, rLoginIdentifier and rPermissionHolder which give regular old dumb objects the ability to act as smarter, permission having objects.

First, an object must be created in the DDM.  The object must contain a 'Username' field and a 'Password' field.  Besides that you could store user information, last login information, etc., but 'Username' and 'Password' are all that are required.

Secondly, the object must implement rLoginIdentifier and rPermissionHolder:
&lt;pre&gt;class Users extends DDM implements rLoginIdentifier, rPermissionHolder {}&lt;/pre&gt;
&lt;h2&gt;That's pretty much it for the Login system&lt;/h2&gt;Implementing the rLoginIdentifier also gives the Users object the 'login' action, which actives the resource: /Users/login - which is the front-end to the login system.

The Login system allows you to turn a regular dumb object into something useful with only 1 line of code (the Users class definition).  Normally, the DDM handles all actions directed at a dynamic model, but in this case, we've overridden the basic DDM and given the Users object all of the dynamic functionality but added some additional functions as well.

&lt;h3&gt;Using the ACL&lt;/h3&gt;Using the ACL is just as simple as setting up a login system.  In fact, half of setting up the login system is actually setting up the ACL.  The rPermissionHolder role exposes 3 methods which interface with the Dynamic Data Model which allow for Getting/Setting permissions on resources.

&lt;h2&gt;Getting a User's Permissions&lt;/h2&gt;The User information is stored in the PHP $_SESSION object, which allows you to access the actual user information very easily ($_SESSION['User']).  Using this information, an actual model can be instantiated:
&lt;pre&gt;$user = new Users($_SESSION['User']);&lt;/pre&gt;
The permissions of any resource can then be checked with IsAllowed or GetPermissions.
&lt;pre&gt;
if ($user-&gt;IsAllowed("SomeModel/modify")) {    
    // success
}
else {    
    // InvalidPermissionsException
}
&lt;/pre&gt;
&lt;pre&gt;
$permissions = $user-&gt;GetPermissions();
/**
* Permissions would be something like:
* Array(
*    [SomeModel/] =&gt; 1,        // User has access to all function of SomeModel
*    [SomeModel/delete] =&gt; 0   // But there is also an explicit DENY to SomeModel/delete
* )
*/
&lt;/pre&gt;
By default, all permissions are denied for all users.  Each ACL entry represents an ALLOW permission for some resource.  As shown above, explicit DENYs can also exist, which is useful when you want to grant all permissions EXCEPT for some action-- in the above case, Deleting the objects is not allowed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-5262487709102396189?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/5262487709102396189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/05/users-permissions-and-acl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/5262487709102396189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/5262487709102396189'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/05/users-permissions-and-acl.html' title='Users, Permissions, and the ACL'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-6330186147181399200</id><published>2010-05-02T03:48:00.000-04:00</published><updated>2010-05-02T03:49:07.173-04:00</updated><title type='text'>Login- A good example of customizing the dynamic model</title><content type='html'>With the Dynamic Data Model rewritten in the new routing format, it was relatively easy to get the Login roles working.  The next step is to make the ACL work.

The login system is implemented in 3 different pieces:
&lt;ul&gt;&lt;li&gt;The Users object&lt;/li&gt;&lt;li&gt;The rLoginIdentifier roles&lt;/li&gt;&lt;li&gt;The UsersLoginCtx context&lt;/li&gt;&lt;/ul&gt;
Each of these pieces serves a different purpose, explained below.

&lt;h2&gt;The Users Object&lt;/h2&gt;The Users object contains the basic object that extends DDM.  Additionally, it implements the rLoginIdentifier which provides the Authenticate() and session management methods.

This object also provides the target for the actual request-- as in the URL for accessing the login function is:
&lt;pre&gt;/Users/login&lt;/pre&gt;
&lt;h2&gt;rLoginIdentifier&lt;/h2&gt;The rLoginIdentifier role provides methods that Authenticate the user against the dynamic model.  It makes use of the PasswordAttribute class and the rPasswordHasher role to hash the password using a User-specified hash function.

The LoginIdentifier role also provides access to 2 session management methods:
&lt;ul&gt;&lt;li&gt;SetSession($var, $value)&lt;/li&gt;&lt;li&gt;DestroySession()&lt;/li&gt;&lt;/ul&gt;
Where SetSession can set and unset session variables, while DestroySession can destroy a session for logout purposes.

&lt;h2&gt;UsersLoginCtx&lt;/h2&gt;This is the class that actually handles the Login request.  Requests are handled either by a corresponding context name (ie: UsersLoginCtx) or role method (Users-&gt;Login).  In this case, the context is used since each application's Login method will be different and as such, should not be coded as a role method.

Since the Authenticate role only returns the result of the actual Authentication, this context is responsible for handling the result of the Authenticate function.  It takes the result and stores it in the session, then redirects the User to the home page.  This context must be coded specifically for each application.  It allows for the basic Authentication module to be very dynamic (providing a list of different hash functions), while allowing the actual session management to be completely custom.

&lt;h2&gt;More To Come...&lt;/h2&gt;This is just this first example of the model of programming that Wax and the IWH package are built on.  The roles will provide commonly used functionality (scaffolding, the dynamic data model, login/sessions, etc.), while the contexts provide a way to set up these function calls around custom application functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-6330186147181399200?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/6330186147181399200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/05/login-works-good-example-of-working.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/6330186147181399200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/6330186147181399200'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/05/login-works-good-example-of-working.html' title='Login- A good example of customizing the dynamic model'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-1162196783958887239</id><published>2010-04-25T00:57:00.001-04:00</published><updated>2010-04-25T15:17:34.677-04:00</updated><title type='text'>MVC Got in the Way, So I Got Rid of It</title><content type='html'>As development of this framework went on, I began to realize that I didn't need to use MVC anymore.  In fact, I realized that the bulk of the work for the IWH project was simply working around MVC in order to get the system I wanted.  One of these major challenges was adding special functionality while still maintaining the dynamic data model ideas.&lt;h2&gt;Role methods to the rescue&lt;/h2&gt;Instead of analyzing a request to determine which controller should handle the request, the request provides a precise target of which code to run.  For example, in MVC, this request would run the view method in the PostsController and fetch record #3:&lt;pre&gt;/Posts/view/3&lt;/pre&gt;Instead of trying to figure out how Controllers fit into this new model, the routing method was rewritten, so the same request above would be rewritten as follows:&lt;pre&gt;/Post/3/view&lt;/pre&gt;Which is analyzed into "I want to perform an action on a Post object.  The object's id is 3, and i want to run the view method".  Instead of routing this through a controller, we can instead give the Post object the ability to play the role of a ViewActionHandler:&lt;pre&gt;class Post extends WaxObject implements rViewActionHandler&lt;/pre&gt;Which would link the Post object to the ViewActionHandler.  Similarly, this concept can be applied to static pages as well:&lt;pre&gt;/Home/mobile[/index]&lt;/pre&gt;Would tell Wax that the user wants to view the index() method on the Home object.  This Home object's ID happens to be 'mobile'.  We can use this identifier to link in different stylesheets, datasets, and anything else to distinguish the mobile view from the regular one.All in all, what does this mean?  Well basically, it means that the word 'Controller' won't be found anywhere in the Wax source code because there aren't any controllers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-1162196783958887239?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/1162196783958887239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/04/mvc-got-in-way-so-i-got-rid-of-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1162196783958887239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1162196783958887239'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/04/mvc-got-in-way-so-i-got-rid-of-it.html' title='MVC Got in the Way, So I Got Rid of It'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-7987000026744708008</id><published>2010-04-21T19:31:00.000-04:00</published><updated>2010-04-21T19:33:10.396-04:00</updated><title type='text'>InsertWebsiteHere Progress</title><content type='html'>So it's been awhile since posting anything, and the main reason for this is that it's hard to explain some of the things going on in this system.  However, now that I've got (most of) the hard parts done, I can give an overview of what's been put into this system and what's required to make it work.

&lt;h3&gt;The IWH DataSource Interface&lt;/h3&gt;First of all, the most important part of the IWH project is the IWH DataSource interface.  The interface provides a list of standard functions that are used by IWH to modify its dynamic model.  The default IWH DataSource (IWHDS) at this time wraps around PHP's PDO class.  The methods contained in IWHDS perform the necessary translation (in this case, SQL queries) for altering and accessing the dynamic model.  Below is a brief explanation of each table in the default schema:

&lt;ul&gt;&lt;li&gt;&lt;b&gt;models&lt;/b&gt;: stores a list of different models that are stored by the database.  This is a simple id =&gt; name assocation, with an extra field for a description.&lt;/li&gt;&lt;li&gt;&lt;b&gt;model_structure&lt;/b&gt;: stores a list of attributes for the stored models.  This table is really the heart of the dynamic model system, as it defines attributes, types, default values, and order.  Records in this table are linked to their respective model via model_id.&lt;/li&gt;&lt;li&gt;&lt;b&gt;structure_options&lt;/b&gt;: one feature in IWH that hasn't been present in any other dynamic systems I've created is the ability for attribute types to have custom options.  For example, a timestamp field would be able to store an option specifying what format to use.  These options are specific to their respective structure, so 2 timestamp fields would be able to use 2 different formats, depending on how they were set up.&lt;/li&gt;&lt;li&gt;&lt;b&gt;records&lt;/b&gt;: a list of records stored by the system.  This table is primarily responsible for maintaining a list of all records, and stores only the type of model that the reference refers to.&lt;/li&gt;&lt;li&gt;&lt;b&gt;record_data&lt;/b&gt;: this table stores all of the information for the data models.  It is easily the largest table in the system (in terms of number of records).  Information is always stored as a TEXT type, as PHP provides the necessary facilities for converting to the proper type automatically.  A TEXT type ensures that (almost) all types of data can be stored here.  Fields in this table are tied to their parent record (record_id) and the type of attribute (structure_id).  The attribute type determines how the stored data is presented to the user.&lt;/li&gt;&lt;/ul&gt;
Combined with this database structure, a special programming interface needed to be developed in order to really leverage the dynamic nature of the system.  The interface was designed to handle basic scaffolding automatically, with the ability for the programmer to override any defaults.  

&lt;h3&gt;Super-Scaffolding and Attributes&lt;/h3&gt;In a traditional MVC system, scaffolding is commonly used to get a base system up and running.  The scaffolding provides a form for input as well as the views necessary to present the data.  Scaffolding in Wax/IWH is a much different process.  Since the models may constantly be changing, the scaffolding is done automatically, but with a twist-- instead of writing custom views for each different MODEL, you write custom views for each different TYPE OF ATTRIBUTE.  This greatly reduces the amount of code necessary to provide a working system, and allows a much higher level of code reuseability.  Attribute types are stored in the attributes.wax block (within iwh.wax), and each one is made up of 4 basic parts (a context and 3 views):

&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;Attrname&lt;/i&gt;AttrCtx&lt;/b&gt;: Each attribute has a corresponding context for doing any custom manipulation of data before sending the data to the user or the database.  In the simplest sense, it acts as a controller.  It contains these methods: &lt;ul&gt;&lt;li&gt;&lt;b&gt;view()&lt;/b&gt;: Pass the data on to the view that will display the information.  Any custom formatting (timestamp formats, for example), can be done here.&lt;/li&gt;&lt;li&gt;&lt;b&gt;edit()&lt;/b&gt;: Pass the data on to the view that will present an input form to the user.  This method is used both for adding and editing of data, so it should be coded accordingly.  This method is usually pretty simple, as it must present data in a way that can be shown by standard HTML controls.&lt;/li&gt;&lt;li&gt;&lt;b&gt;editor()&lt;/b&gt;: All attributes have the ability to store custom options.  The example I've been referencing is if timestamps wanted to store a format.  In that case, the editor() method might return a list of common formats used for displaying times, of which 1 could be chosen as the display format for this attribute.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Each method in the AttrCtx has a corresponding view file which is embedded into the necessary forms via the AttrRenderCtx&lt;/li&gt;&lt;/ul&gt;

&lt;h3&gt;And soon to come...&lt;/h3&gt;&lt;h2&gt;Users and ACL&lt;/h2&gt;So what's next?  Obviously, a system like this isn't of very much use if anyone can edit the data or the data model, so one of the primary goals right now is the development of an integrated ACL and user system.  This change will likely add another table or two to the schema, since ACL and User Control isn't the type of information that can be stored dynamically.  The dynamic nature of the system will still be preserved, however, since dynamic models would be able to be linked to User accounts, allowing for the creation of profiles, favorites, etc.

&lt;h2&gt;RSS/ATOM/XML/and other Web 2.0 stuff&lt;/h2&gt;Additionally, getting data out of the system is just as important (maybe more important) than putting it there in the first place.  As a result RSS/ATOM feeds will become an important part of future versions of this system.  Using the ACL in conjunction with the dynamic models, the included RSS/ATOM feeds will allow for REST APIs to automatically be created for these data models.

&lt;h2&gt;Upcoming Poster Session&lt;/h2&gt;I hope to have most of these new features done by May 7th in time for the poster session.  At this session, I plan to show off the features by upgrading (and in the process, rewriting) a helpdesk system for use by the Rensselaer Union System Administrators.  If everything goes according to plan, it should be a pretty exciting demonstration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-7987000026744708008?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/7987000026744708008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/04/insertwebsitehere-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7987000026744708008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7987000026744708008'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/04/insertwebsitehere-progress.html' title='InsertWebsiteHere Progress'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-5610294620615559374</id><published>2010-02-19T17:48:00.000-05:00</published><updated>2010-02-20T17:21:24.349-05:00</updated><title type='text'>CoreDCI split into separate project</title><content type='html'>Wax's underlying DCI core has now been split into a separate library, called CoreDCI, and has been packaged as a way to provide DCI functionality in a more generic scope.  Version 1.0 of CoreDCI was released today, and provides:
&lt;ul&gt;    &lt;li&gt;DCIObject - allows for the creation of role-playing objects&lt;/li&gt;    &lt;li&gt;Context - a context class that is specifically designed for facilitating the execution of role methods&lt;/li&gt;    &lt;li&gt;DCIException - a custom exception class that provides a stacktrace that more accurately shows the DCI call stack&lt;/li&gt;    &lt;li&gt;The Account Example: a test file showing how to define roles, contexts, and model objects, then use the role methods to perform a Money Transfer operation.  Also demonstrates the functionality of the DCIException.&lt;/li&gt;&lt;/ul&gt;

The library is available for download at &lt;a href='http://code.google.com/p/php-coredci'&gt;The CoreDCI project page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-5610294620615559374?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/5610294620615559374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/02/coredci-split-into-separate-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/5610294620615559374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/5610294620615559374'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/02/coredci-split-into-separate-project.html' title='CoreDCI split into separate project'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-8801545750744167398</id><published>2010-02-10T17:35:00.001-05:00</published><updated>2010-02-10T17:35:59.442-05:00</updated><title type='text'>InsertWebsiteHere Announcement</title><content type='html'>InsertWebsiteHere is a WaxBlock specifically designed for using Wax to build dynamic information systems.  It provides everything required to get a simple, dynamic, and flexible system up and running in a matter of minutes.  Here's a description taken from the Google Groups page:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;The Idea:&lt;/b&gt;  A large number of simple information systems start with the&lt;br /&gt;
request: "I need a website to keep track of my _something_".  Let's&lt;br /&gt;
say in this example, the _something_ is books.  Then, the "Book" model&lt;br /&gt;
needs to be created and defined (ie: Title, Author, Year, ISBN, etc.),&lt;br /&gt;
and the IS is based around the model.  The issues arise when 6 months&lt;br /&gt;
later, the system user says "I also want to store the number of pages&lt;br /&gt;
in the book".  Then the code has to be reworked (in several places) to&lt;br /&gt;
allow for this change, which can sometimes be an incredibly daunting&lt;br /&gt;
task.  Wouldn't it be nice to have a system with a more dynamic data&lt;br /&gt;
model?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Solution:&lt;/b&gt; InsertWebsiteHere uses concepts developed and refined in&lt;br /&gt;
the RPI off-campus housing system as well as several other systems&lt;br /&gt;
with a dynamic data model.  The theory is that there is generally 1&lt;br /&gt;
primary data model and then all primary functionality is based around&lt;br /&gt;
that one model.  In the case of the housing system, that model is an&lt;br /&gt;
apartment listing.  In the book example, the model is a book.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;
More details and examples to come shortly.  The release of the Wax AppKit 0.10 is also coming soon.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
This project is made possible through the Rensselaer Center for Open-Source Software thanks to the generosity of Mr. Sean O'Sullivan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-8801545750744167398?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/8801545750744167398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/02/insertwebsitehere-announcement.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/8801545750744167398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/8801545750744167398'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/02/insertwebsitehere-announcement.html' title='InsertWebsiteHere Announcement'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-7055263435690449750</id><published>2010-01-13T13:26:00.000-05:00</published><updated>2010-01-13T13:26:53.092-05:00</updated><title type='text'>Preparing for the poster session</title><content type='html'>In preparation for the poster session coming up in a few weeks, I've been spending some time fixing bugs and creating a useable (albeit anything from mature) data model library.  In the future, I hope to wrap ActiveRecord around the DCI concept, but for the time being, a smaller, more specialized library has been developed.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The poster session content will focus mostly on the concepts behind the framework, the methods of implementation, and the advantages offered over standard MVC-based frameworks.  In addition, I will explain the methodology behind the building-blocks application structure that I've shaped the framework around.  Hopefully the poster session will encourage people to give the framework a try and help to make it a feasibly solution for real-world application development.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code updates will be coming soon.  Sometime in the near future, I will also be re-organizing the source repository to house the Wax Blocks in a different branch, rather than including them in the base framework.  This is done in anticipation of the package management system that will eventually (hopefully in the next few months) be developed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-7055263435690449750?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/7055263435690449750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2010/01/preparing-for-poster-session.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7055263435690449750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7055263435690449750'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2010/01/preparing-for-poster-session.html' title='Preparing for the poster session'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-3863586547561266750</id><published>2009-12-02T03:03:00.000-05:00</published><updated>2009-12-02T03:11:19.539-05:00</updated><title type='text'>Application Kit 0.9.0 Released</title><content type='html'>The framework is finally useable.  It's still missing many features that you'd expect in a framework and it's still pretty buggy, but for anyone adventurous, the Application Kit was released today.

The Application Kit provides everything you need to get going with Wax.  It provides a basic application structure that can be extended into a full application.  The Application Kit is still only bundled with the 2 essential blocks: webcore and messageboxes.  In the future, releases will be bundled with database connectivity blocks as well as some other utility blocks. 

Running the Application Kit is easy -- just unzip into the Document Root of the webserver and navigate to http://localhost/app.wax to launch the application.

In the meantime, you can generate fairly static websites with the current version (0.9.0) of the Application kit, available at &lt;a href="http://code.google.com/p/waxphp"&gt;http://code.google.com/p/waxphp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-3863586547561266750?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/3863586547561266750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/12/application-kit-090-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3863586547561266750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3863586547561266750'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/12/application-kit-090-released.html' title='Application Kit 0.9.0 Released'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-1914341975947236432</id><published>2009-11-28T23:47:00.000-05:00</published><updated>2009-11-28T23:47:43.544-05:00</updated><title type='text'>Significant Changes &amp; Code Update</title><content type='html'>&lt;style type='text/css'&gt;dt { font-weight:bold; } dd { margin-left: 20px; padding-left:10px; border-left:solid 1px gray; } &lt;/style&gt;&lt;br /&gt;
Today I uploaded a fresh copy of the source code.  This source is significantly different from the last commit and as a result many blocks were removed from the source.  The framework SVN repository contains only the few base files needed for Wax to function properly.  Some of the major changes are listed below:&lt;br /&gt;
&lt;dl&gt;&lt;dt&gt;Added include/ directory to block dirs&lt;/dt&gt;
&lt;dd&gt;
This change allows 3rd party libraries to be included with blocks.  Previously, this was done through the blockname.wax/lib directory, however, this directory's purpose has changed.
&lt;/dd&gt;

&lt;dt&gt;Changed purpose of lib/&lt;/dt&gt;
&lt;dd&gt;
The lib/ folder now contains role-playing objects exposed to the rest of the runtime.  Examples include Controllers, Models, and libraries.
&lt;/dd&gt;

&lt;dt&gt;Added blocks/ directory to block dirs&lt;/dt&gt;
&lt;dd&gt;
Blocks can now auto-include dependencies by putting them in the blocks/ subdirectory.  This is especially useful for the new Application structure, explained below.
&lt;/dd&gt;

&lt;dt&gt;Applications are now simple blocks&lt;/dt&gt;
&lt;dd&gt;
Applications are now exactly the same as a regular Wax block, but with the addition of &lt;u&gt;init.php&lt;/u&gt; and &lt;u&gt;index.php&lt;/u&gt;-- the two files required to make a block executable.  Applications can bundle their own dependencies and libraries using the new blocks/ subdirectory.
&lt;/dd&gt;

&lt;dt&gt;Added Exception Handling to the Core&lt;/dt&gt;
&lt;dd&gt;
Previously, Wax did not use Exceptions and used manual error catching.  As the framework matured it was clear this wouldn't scale as easily as adding a global Exception handler.  As a result, the WaxException class was added and the wax_exception_handler() and wax_error_handler() functions were added to core/include/exceptions.php

Many roles were also rewritten to use Exception handling as opposed to simple manual error catching.
&lt;/dd&gt;

&lt;dt&gt;TypeHinting now Discouraged&lt;/dt&gt;
&lt;dd&gt;
Using TypeHinting in roles was encouraged up until now, when a significant conflict was discovered.  When using the AddRole method after instantiation, the list of implemented interfaces is not modified.  As a result, PHP doesn't know that the object now plays the new Role and the TypeHint will fail when calling a Role method.

TypeHinting also is not the quickest feature in PHP, so its removal should result in a (very) slight performance gain.  To replace TypeHinting, Exceptions are now thrown in the case of an Object/Role mismatch.
&lt;/dd&gt;
&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-1914341975947236432?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/1914341975947236432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/11/significant-changes-code-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1914341975947236432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1914341975947236432'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/11/significant-changes-code-update.html' title='Significant Changes &amp; Code Update'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-3190595441688611350</id><published>2009-11-14T17:08:00.000-05:00</published><updated>2009-11-14T17:08:31.122-05:00</updated><title type='text'>Close to a release</title><content type='html'>With the semester coming to an end and the framework maturing, I feel confident that by the end of the semester I'll have a working framework capable of creating simple websites.  The initial release will require an installation of either CouchDB or MySQL for the database.  Unfortunately, due to the vast difference between database systems, I can't guarantee the ability to switch between them once an application has been written.  To put it simply, if you write an app using CouchDB, you'll have to restructure the entire application to make it work with MySQL.  I'm currently looking into the reverse, which may be possible (Port MySQL to CouchDB).&lt;br /&gt;
&lt;br /&gt;
Some of the basic blocks planned for inclusion are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;webcore&lt;/b&gt;: responsible for MVC roles, default Wax theme&lt;/li&gt;
&lt;li&gt;&lt;b&gt;couchdb&lt;/b&gt;: handles interaction with CouchDB&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mysql&lt;/b&gt;: handles interaction with MySQL&lt;/li&gt;
&lt;li&gt;&lt;b&gt;msgbox&lt;/b&gt;: provides library for displaying different types of messages&lt;/li&gt;
&lt;li&gt;&lt;b&gt;html&lt;/b&gt;: library for rendering different types of HTML controls, including forms&lt;/li&gt;
&lt;li&gt;&lt;b&gt;form&lt;/b&gt;: extended library for handling forms, including file uploads&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-3190595441688611350?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/3190595441688611350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/11/close-to-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3190595441688611350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3190595441688611350'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/11/close-to-release.html' title='Close to a release'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-199962554219176590</id><published>2009-09-30T11:49:00.000-04:00</published><updated>2009-09-30T11:52:30.646-04:00</updated><title type='text'>CouchDB</title><content type='html'>I've been trying to figure out how to make MySQL or SQLite play nice with DCI, and there always seems to be some compromise when I design the interaction.  In response to this, the default data storage method for Wax (besides SQLite) will be Apache's CouchDB.  &lt;br /&gt;
&lt;br /&gt;
CouchDB is a project started out of the need for a document-based database rather than a relational database.  The bulk of web applications don't ever use most of the power of a relational database like MySQL or PostgreSQL, so why not use a data-storage solution that is more scalable outside of the application itself?&lt;br /&gt;
&lt;br /&gt;
CouchDB uses HTTP to store/fetch data, using the 4 major HTTP request types: GET PUT POST and DELETE.  The entire database is directly queried through HTTP, meaning that data can be requested directly from PHP or JavaScript, allowing for a more fluid interaction between the client and the data itself, and less need for requests back to the webserver.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CouchDB binaries are available for Mac OS X and Windows XP/Vista, and most package management systems for Linux have a CouchDB package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-199962554219176590?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/199962554219176590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/09/couchdb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/199962554219176590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/199962554219176590'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/09/couchdb.html' title='CouchDB'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-926097281270053795</id><published>2009-09-27T13:37:00.000-04:00</published><updated>2009-09-27T13:43:05.144-04:00</updated><title type='text'>DCI with REST APIs</title><content type='html'>DCI's extremely flexible runtime structure opens up several possibilities for RESTful routing.  Since DCI uses a role-based runtime structure, we can use URLs to query the application as a dynamic source of data instead of a series of static links that provide access to the underlying system.  This method allows for nearly transparent controllers, as explained below:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;MVC REST Routing -- Standard Convention&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Most MVC based frameworks, including Rails and Symfony, use a controller-centered routing model.  For example, the default routes in rails translate to:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;http://site.com/app/controller/
http://site.com/app/controller/action
http://site.com/app/controller/action/id
&lt;/pre&gt;&lt;br /&gt;
This routing method works for most web based applications but with DCI, there is no static routing to a controller, but rather a 'request for a dynamic context execution'.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DCI REST Routing -- Proposed Method&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
With DCI routing, there is a special consideration to take into account when designing a system.  Since the runtime network is dynamically created, the same base actions can take place from completely different places with different actions.&lt;br /&gt;
&lt;br /&gt;
For example, if we were creating a message board application, we could create a post from either a logged in context or an anonymous (application) context.  The access URL would be different, but the same base action would be taking place with different 'arguments':&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;http://site.com/app/{context}/{data model}/{action}/{args}
http://site.com/app/app/post/create
http://site.com/app/user/username/post/create
&lt;/pre&gt;&lt;br /&gt;
In this situation, there are 2 distinctly different contexts executing the same action (create) on the same model (post).  The app context is the public application context that is used to anonymously perform system actions.  These actions could be reading an about page, submitting a form on the contact page, or they could be posting anonymously on a message board.  The user/username context is used to perform system actions as a specific individual.  This allows for models and views to be created, then simply deciding which contexts can perform which actions.  In this way, we can mostly replace the job of the controller (providing model data to the views) with simple REST routing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The source code is currently being reworked to reflect these capabilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-926097281270053795?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/926097281270053795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/09/dci-with-rest-apis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/926097281270053795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/926097281270053795'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/09/dci-with-rest-apis.html' title='DCI with REST APIs'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-1793004512146310108</id><published>2009-07-30T14:39:00.000-04:00</published><updated>2009-07-30T14:39:25.664-04:00</updated><title type='text'>Some Unique Framework Features</title><content type='html'>So up until now, DCI has really been the only distinguishing factor that separates wax from just about any other PHP framework.  However, now that the base framework is in a useable state, I can begin work on the next steps: SaaS, project exporting and administration.&lt;br /&gt;
&lt;br /&gt;
Wax was not designed as simply a web development framework, but as a SaaS framework as well.  The goal is to allow multiple applications built off a single Wax installation.  This is achieved by keeping all plugins/libraries and the like in the Wax installation rather than the application directory.  In addition, there are no code generation tools (like in RoR), so you don't end up with multiple copies of very similar code.&lt;br /&gt;
&lt;br /&gt;
With the SaaS mentality, we also want the ability to move apps to different servers.  From my experience, when installing new web applications, the biggest problem is dependencies (especially in my experience with rails).  Wax aims to solve this problem by allowing "project exporting".  The goal of project exporting is to allow a project written with Wax to run on systems that might not necessarily have it installed.  An application uses a designated set of blocks plus the base Wax core to run.  Exporting allows these specific blocks and the core to be copied and reorganized in such a way that the application will run with its own (lighter) individual framework install.  The way paths are resolved in Wax allows for all of this to happen without any changes to the application code.&lt;br /&gt;
&lt;br /&gt;
Last but not least, with SaaS comes administration needs.  Instead of having each application rebuild an administration interface from scratch, Wax will provide a central interface to administer all projects using a specific install of a framework.  In addition, the administration will be set up in such a way that the administration pages for individual projects will all be located in this interface.  Depending on a user's permissions, they may have access to administer all installed apps or just 1 or 2.&lt;br /&gt;
&lt;br /&gt;
In addition to this administration area, the administration interface will provide a way to install/uninstall Wax blocks from the central SVN repository.  This will allow for a centralized, easy way to deploy updates and dependencies, as well as a way to contribute user-created blocks.  A command-based interface for automated usage will probably be designed off the same core libs once they are mature.&lt;br /&gt;
&lt;br /&gt;
All this is future work (the administration and exporting will probably be a project for the fall), but I hope that it will accomplish my original goals for creating Wax:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Centralized Administration and Configuration&lt;/li&gt;
&lt;li&gt;No need for the command line&lt;/li&gt;
&lt;li&gt;All the functionality of other frameworks&lt;/li&gt;
&lt;li&gt;A low learning curve&lt;/li&gt;
&lt;li&gt;Community centered package repository&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-1793004512146310108?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/1793004512146310108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/07/some-unique-framework-features.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1793004512146310108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/1793004512146310108'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/07/some-unique-framework-features.html' title='Some Unique Framework Features'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-7012477133091973839</id><published>2009-07-17T13:56:00.000-04:00</published><updated>2009-07-17T13:56:18.594-04:00</updated><title type='text'>Working Examples</title><content type='html'>So I got the basic parts of the framework done.  By this I mean it's possible to create websites, but it's not necessarily pretty (or that easy-- yet).  The code still needs some more restructuring and organization, but as this happens, the code footprint will be reduced and the functionality enhanced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I've uploaded what code I have to the Google Code page at &lt;a href='http://code.google.com/p/waxphp'&gt;http://code.google.com/p/waxphp&lt;/a&gt; and have additionally uploaded the presentation given today.  DCI is still an evolving concept, but with time, hopefully it gains support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-7012477133091973839?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/7012477133091973839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/07/working-examples.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7012477133091973839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/7012477133091973839'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/07/working-examples.html' title='Working Examples'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-3917553938685414896</id><published>2009-07-02T11:22:00.000-04:00</published><updated>2009-07-30T14:40:49.000-04:00</updated><title type='text'>Wax Templating Engine</title><content type='html'>&lt;strike&gt;Like most frameworks, Wax makes use of a templating engine to make views easier to create.  However, unlike other frameworks (like rails and CakePHP), Wax does not allow any embedded PHP code.  Instead, Wax gives you the functionality to create new tags and interface directly with the view in the code.  For example, if you had (in rails) a partial named _post.html.erb that rendered a single blog post, you would create a loop inside the view that rendered data from the model.  Rather than trying to put logic like this in the view files, you could instead create a new tag.  Within the view file, you would then put &amp;lt;Posts /&amp;gt;.  From the code, you register the tag name and it's corresponding class name (essentially a model).  From this class, the data can be rendered in place of the Posts tag.

Examples and more details are soon to come, since I still need to figure out a specific process for passing data like this.&lt;/strike&gt;

&lt;b&gt;Update 7/30/09&lt;/b&gt;: Nevermind, I gave in to embedded PHP code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-3917553938685414896?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/3917553938685414896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/07/wax-templating-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3917553938685414896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/3917553938685414896'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/07/wax-templating-engine.html' title='Wax Templating Engine'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-8642374819320982239</id><published>2009-06-29T22:17:00.000-04:00</published><updated>2009-06-29T22:17:10.541-04:00</updated><title type='text'>I Really Hate Rails. A Lot.</title><content type='html'>Why?  Because it's not worth it.  Over the past couple weeks I've been working on a project that uses Ruby on Rails, trying to develop a plugin for it.  It has been an absolute nightmare.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
First I tried installing Rails on Windows.  Ruby is a language that makes very heavy use of the command line and command line tools.  As you may have guessed, Windows doesn't play well with that.  Getting Ruby running is easy enough, but anything past that becomes tedious.  Here was my experience.  &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
I needed to work on a project that resides in a git repository, which is where the trouble started.  Getting git to work on Windows took awhile, but I managed to get it up without too much trouble, so I continued on.  I downloaded the Ruby One-Click Installer, ran it, and was happy to see everything was working fine -- or so I thought.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
Next I had to install the Rails gem-- which should be easy enough, but no matter what I try, the gem command always says I need to update to a different version of RubyGems (even though it's the latest version).  Eventually I managed to fix that somehow (no idea how).  Second, the project I'm working on specifically requires Rails 2.2 -- not a big deal, just add -v=2.2 to the install command.  Well, I lost some time here just because Windows wants the entire "-v=2.2", not just -v="2.2" string to be wrapped in quotes, or it will completely fail.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
So I finally get the right versions of everything installed and I'm ready to get a running copy of this application.  I try starting the server (&lt;mono&gt;ruby script/server&lt;/mono&gt;) and get the message that I need to migrate the database.  Easy enough -- just a simple &lt;mono&gt;rake db:migrate&lt;/mono&gt; command right?  Wrong.  The rake failed because I needed to run &lt;mono&gt;rake create_a_secret&lt;/mono&gt;.  Fine.  So I run &lt;mono&gt;rake create_a_secret&lt;/mono&gt;, which fails because the command apparently makes use of some commands that don't exist on Windows machines.  At this point I'm extremely frustrated.  &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;Trying it on Mac&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;
So most Rails users use Macs, so I figured I'd try getting this all set up there.  I retrace the steps I took on Windows and was surprised to find that it was relatively painless.  I got the base application up and running, so I decided to create a new project so I could actually start learning Rails.  Everything seems to be working fine, until I want to start creating relationships.  Turns out sqlite produces all sorts of errors when using the &lt;mono&gt;belongs_to, has_many, etc&lt;/mono&gt; functions.  Well, I already had MySQL installed for the application I was working on so I figured I'd just change the configuration to use MySQL instead.  Well that failed too.  Turns out to make everything work I'd have to download the MySQL source code, the mysql gem source code, compile them against each other and do all sorts of other stuff just to make this application connect to MySQL.  Not worth it.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
By this point I've spent so much time trying to get Rails up and running that I'm ready to throw my laptop across the room.  For all the work it takes to get a working rails environment, I just don't think it's worth it to choose it as platform for development.  The reason I got into web development is because the technologies are cross-platform and applications can be delivered to any system.  On top of that, you don't need much to create a web site, just a text editor and a server.  Ruby has so many dependencies, requirements, and quirks that it causes more problems than it solves.  The syntax is very implicit, making it difficult to follow for beginners.&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
These are some of the reasons I chose to start this project.  I wanted a framework that didn't require a single bit of command-line interaction (no I don't have anything against the command line-- but it's a system tool, not a web development tool), that could be used from any machine, and that didn't NEED to be installed, just loaded (&lt;mono&gt;require_once('wax_init.php');&lt;/mono&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-8642374819320982239?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/8642374819320982239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/06/i-really-hate-rails-lot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/8642374819320982239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/8642374819320982239'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/06/i-really-hate-rails-lot.html' title='I Really Hate Rails. A Lot.'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-2927492941943563523</id><published>2009-05-27T03:10:00.001-04:00</published><updated>2009-05-27T03:15:24.170-04:00</updated><title type='text'>Ruby on Rails</title><content type='html'>Recently I've agreed to work on the Crabgrass and SocialGeo projects.  With these projects come a few technologies that I'm relatively inexperienced with, including Ruby on Rails and a Java-based map server.  

I've taken the time to learn Ruby and get acquainted with basic rails functionality.  I've also looked around the Crabgrass code in an effort to understand the Rails development process a little better.  With this new experience, I'm able to resolve a few roadblocks that I've had in my own framework development.  Many of these developments are in the area of TemplatedControls, as Rails has demonstrated a nice development process for passing model data to the views.

Some of my time from now on will be dedicated to these other projects, but I hope to keep progress strong on this project as well.  Hopefully working with these other technologies will provide some insight into how I can make improvements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-2927492941943563523?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/2927492941943563523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/05/ruby-on-rails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2927492941943563523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2927492941943563523'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/05/ruby-on-rails.html' title='Ruby on Rails'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-2221891482278935502</id><published>2009-05-25T20:54:00.000-04:00</published><updated>2009-05-25T21:06:31.773-04:00</updated><title type='text'>CSS Aggregation, Themeing, Entities</title><content type='html'>Recently I fixed a few things that have been in the way of really creating functional websites.  These included CSS Aggregation (required for dynamic themeing), Theme configuration files, and the ability to use common html entities from waxml files.


CSS aggregation was a necessary feature because the aggregator would be responsible for applying the current theme colors and styles to other resources.  With this functionality, controls can be designed to inherit information like color, border, and recommended padding size from the theme configuration file.  An example of a theme configuration file can be seen &lt;a href="http://code.google.com/p/waxphp/source/browse/trunk/themes/defaultblue/theme.waxml"&gt;here&lt;/a&gt;.


Another irritating bug was the inability to use HTML entities like &amp;amp;nbsp; and &amp;amp;copy; within the waxml template files.  This was due to the fact that these entities are not defined in the used XML schema.  The workaround involved preprocessing the template files to replace common HTML entities with their ASCII counterparts.  The XMLFixEntities function can be seen &lt;a href="http://code.google.com/p/waxphp/source/browse/trunk/core/Wax.php"&gt;here&lt;/a&gt;, starting on line 20.  Some reorganization of functions might be in order to separate the template loader from the Page object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-2221891482278935502?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/2221891482278935502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/05/css-aggregation-themeing-entities.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2221891482278935502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2221891482278935502'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/05/css-aggregation-themeing-entities.html' title='CSS Aggregation, Themeing, Entities'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-6767939739662684890</id><published>2009-05-18T01:46:00.001-04:00</published><updated>2009-05-18T01:50:28.564-04:00</updated><title type='text'>Code Page</title><content type='html'>So I found out that searching for Wax PHP Framework yields results from a UK based company called One Black Bear.  I'll be working on keeping the blog and code page active to try to raise up through the search results.  In the meantime, the code page is located at &lt;a href="http://code.google.com/p/waxphp"&gt;http://code.google.com/p/waxphp&lt;/a&gt;.  
&lt;br /&gt;
Just as a side node - I couldn't find any actual information or code for this other framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-6767939739662684890?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/6767939739662684890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/05/code-page.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/6767939739662684890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/6767939739662684890'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/05/code-page.html' title='Code Page'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5894084172436594728.post-2230698417286132205</id><published>2009-05-16T23:48:00.000-04:00</published><updated>2009-05-17T00:08:47.508-04:00</updated><title type='text'>Wax PHP Framework</title><content type='html'>So now that the framework is starting to mature a little bit, I finally decided to create an actual blog so I don't have to just keep updating the project page on Google Code.  Here's a brief summary of the work so far:&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The project started off as WISP PHP Framework, meaning Websites with Integrated Scripts and PHP.  The framework was designed to use PHP to generate an XML representation of a website and then use XSLT transforms and other manipulations to create a working website.  As the project progressed, the development style changed and the goals of the project evolved.  The current system uses XML template files as the base frame for the site, then uses PHP code-behinds to do any extra manipulation or logic.  It uses a library of custom controls to piece together the application.  If I had to relate it to any other language, it would be ASP.net.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Current features include:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;XML based layout system&lt;/li&gt;&lt;li&gt;Custom control development &lt;/li&gt;&lt;li&gt;Custom control invokation via XML tags (ie: &amp;lt;CustomControl Attribute="Value"&amp;gt;)&lt;/customcontrol&gt;&lt;/li&gt;&lt;li&gt;DOM based page rendering&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Features temporarily broken during the rewrite include:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Integration with PHP PDO (PHP Data Objects)&lt;/li&gt;&lt;li&gt;Data sources and data binding&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;High-Priority features include:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Templated controls (Controls that can use XML as a base template, right now they must be all PHP)&lt;/li&gt;&lt;li&gt;Integration with SDO (Service Data Objects)&lt;/li&gt;&lt;li&gt;Script binding&lt;/li&gt;&lt;li&gt;Remote method invokation (calling PHP functions from JavaScript for use in AJAX apps)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Development will progress throughout the summer and will continue during the fall semester.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;i&gt;Anyone interested in helping with development or testing the framework can E-Mail me at joechrz@gmail.com or visit the Google Code page at: &lt;a href="http://code.google.com/p/waxphp"&gt;http://code.google.com/p/waxphp&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5894084172436594728-2230698417286132205?l=waxphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waxphp.blogspot.com/feeds/2230698417286132205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://waxphp.blogspot.com/2009/05/wax-php-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2230698417286132205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5894084172436594728/posts/default/2230698417286132205'/><link rel='alternate' type='text/html' href='http://waxphp.blogspot.com/2009/05/wax-php-framework.html' title='Wax PHP Framework'/><author><name>Joe Chrzanowski</name><uri>http://www.blogger.com/profile/07931917684943687474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
