Introducing Aerial CMS
Well, I finally let my irritation get to me… I’ve been developing Flash, Flex & AIR applications for two years now – most of them pulling data through AMFPHP from a PHP-based back-end. In those two years, I’ve tried nearly all the suggested solutions for managing content on the back-end and pulling it through to the front-end; Drupal, MODx, WordPress, Symfony. They are all fantastic PHP-based frameworks and systems, but they don’t allow me to develop applications the way I want to. So, as a consequence of this combination of irritation, frustration, egotism and flat-out boredom with writing the same code, over and over, for each project, I’ve decided to build a CMS – Aerial CMS.

What is Aerial CMS?
Aerial CMS (named Aerial because it was the first word i could think of with “RIA” in it) is a simple content management framework. I decided to rethink the concept of a content management system, because – the way I see it – CMSs these days are about content management AND content presentation. I think that these two massive areas of development & design need to stay very far away from each other. They are like brother and sister to us now, but sometimes – when stuck in a room together for so long – they breed and the results are disastrous (on top of being scandalous!).
Design Philosophy
Look at how the MVC (Model View Controller) pattern came about: software engineers found that separating application logic from presentation from data has serious design benefits. Now, i’m not attempting to bad-mouth all the incredible efforts of the CMS developers… I’m saying that for Rich Internet Application development, it really becomes a chore to use systems like Drupal or Symfony because they were not meant to be used in that way. They do what they do superbly well, but for RIAs they fail to impress me.
Aerial CMS has been built from the first line of code for optimized Rich Internet Application development. It focuses only on content management and development tooling, and wants nothing to do with how you present the data. It’s certainly a change from the standard model, and i’m convinced about how I want to develop my RIAs, but that’s why i’ve put out this early release – to see if you all agree with me. This CMS still has a very, very long way to go; it works well for most situations but the tools haven’t been developed yet.
Technology
Aerial has been built on two very well established and loved open-source frameworks, namely AMFPHP 1.9 and Doctrine 1.2.1. The Aerial framework is built for compatibility with PHP 5 only. Aerial enforces no rules upon you when you get down to developing your back-end code, but it does stick to Doctrine’s method of generating database tables and models. In essence, once you’ve set up your database schema, you can do whatever you like
you can plug into Doctrine’s API or you can write your own code; it really gives you the freedom to code the way you’re comfortable with.
Tutorials and Videos
I’ve made a Getting Started video to get you familiar with the framework and i’ll be writing a series of tutorials in the Wiki section of the Google Code page for Aerial CMS. I’ve also got plans for a couple more video tutorials, so keep checking the site for updates or follow me on Twitter (@dannykopping).
Comments, Suggestions, et al
I’d love to hear what you have to say (as long as it’s in English – being monolingual sucks)! I’m very open to suggestions, any offers to help contribute would be welcomed and all constructive criticism is encouraged!
| Print article | This entry was posted by Danny Kopping on April 11, 2010 at 10:09 pm, and is filed under AIR, ActionScript, Aerial CMS, Community, Flash, Flex, PHP. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |
about 1 year ago
very well done. This one could be the killer application in php/amf world.
It is better than phpamf because it has an enhanced support for ORM. I am a fan of otherAMF(zend weborb) but the lack of support in php/flex type automatic conversion of amfphp, has moved me to SabreAmf, very simply but slow. Anyway i develop with an eye to the return of AMF. I use MDB2 as DB layer without ORM i prefer simple and fast service called thinking to them as function call. In Doctrine which one do you use between pdo/mdb2. I suggest a clear printable documentation, step by step for example a pdf(or any othr format you prefer) version of your video with an image 3/4 of page and a comment that explain the step. If you are interested i may help you to write them i have not much time (i work far from home) so i could produce 1 or 2 page per week because during the installation i write them so i test my work. I’m a fan of MVC i have realized my personal MVC from scratch, view is a composition of mxm as pure view and a view event handler and a view setter (both mxml+as3) to set a view with return message from observed model. There is a controller that can use multiple data model, for example a login call the controller login, than it call the model of login and the model that log the login attempt. the model dispatch all the event to the registred observer. I think the problem is when a view is displayed in flex, all the gui part became truly ready when complete events is dispatched so the gui need to acces to the information and amf add delay to those operation.
about 1 year ago
Another 2 suggestion
1) I knw that charleese is the best in AMF decoding but firefox with firebug and amf decodin is out and it can decode submit and response
2)there is a flash style connection that doesn’t use xml this is useful if you make multiple call, i use this method because i get remote connection endpoint from DB tanks goes to Corlan in his tutorial http://corlan.org/2008/10/10/flex-and-php-remoting-with-amfphp/
about 1 year ago
Brilliant! Simple and obviously versatile.
Will give it a test ride and let you know.
Thx a ton for your initiative.
about 1 year ago
Hi!
First of all : Very good job!
Second: A have some problems to get good decoding of utf-8.
Solved by: write some new line in file: PHP.baseservice.tmpl
in place:
…
public function __construct()
{
$this->connection = Doctrine_Manager::connection();
$this->table = $this->connection->getTable($this->modelName);
Doctrine_Manager::connection()->setCharset(‘utf8′);//new line
Doctrine_Manager::connection()->setCollate(‘utf8_unicode_ci’);//new line
}
…
I have a question: How can i get charset and collate for table from schema.yml
Best Regards
about 1 year ago
Hi Jakub
Thanks for the kinds words and the solution!
As far as i know, you can do that through YAML this way:
options:
type: INNODB
collate: utf8_unicode_ci
charset: utf8
Does that help?
Thanks
about 1 year ago
Not help
I have this obefore:
“options:
type: INNODB
collate: utf8_unicode_ci
charset: utf8″
and doesn’t decode utf-8 correctly
i have succes when add new line in file: PHP.baseservice.tmpl
But i have new issue:
when i want update some records in table i get this message:
“Invalid parameter number: number of bound variables does not match number of tokens”
Could You help me with this?
about 1 year ago
Hi Jakub
You can try removing the line:
$gateway->setCharsetHandler(“utf8_decode”, “ISO-8859-1″, “ISO-8859-1″);
in backend/aerial/core/amfphp/gateway.php…. That should help with the UTF8 decoding
As for your other problem, did you change your table in the database instead of changing the schema.yml file and regenerating? This is a PDO error – PDO is the Database Abstraction Layer that Doctrine builds upon. This error might creep in if you’ve changed your database table without updating the Doctrine models…
about 1 year ago
Thanks for info:
I first of all change the line:
$gateway->setCharsetHandler(”utf8_decode”, “ISO-8859-1?, “ISO-8859-1?);
to:
$gateway->setCharsetHandler(“utf8_decode”, “UTF-8″, “UTF-8″);
And the other problem:
I don’t change my table in the database.
I compile this one more time i will write to You that will be any change.
Best Regards
about 1 year ago
This looks very nice; I’m excited to get into it. Just getting started, so this question might be premature:
Why does the userService.save() not return the new user’s Id? This is a pretty common expectation for adding a new item (not just users).
Cheers