From ExpressionEngine to Craft
Now that we’re wrapping our first large-scale Craft CMS build, I want to take some time to reflect on Craft itself, speaking to how it compares to ExpressionEngine, a tool we have used for a number of years and a platform from which Craft was clearly inspired.
Note: this article is now outdated with the release of ExpressionEngine 3. While some of the concepts still hold true, others have been addressed with the new release, and we encourage you to give EE3 a look as well.
While this direct comparison is a topic some people might frown upon, there are many designers and developers who are in the same position we find ourselves in: loving ExpressionEngine but wanting something new. Something that takes advantage of newer technologies and architectures, but similar to EE, is easy to use and powerful.
Why we love EE
To begin, let me explain why I love ExpressionEngine and why it has been our tool of choice for the past 5+ years.
First, as opposed to many other CMS’, ExpressionEngine does not dictate markup. When it comes down to Wordpress vs. ExpressionEngine, the choice was always clear. We preferred EE where we could write all of our own markup and keep PHP calls out of the templating, leaving the code as DRY and orderly as possible.
Second, the CMS data model backing EE was simple to understand, and powerful. Sure, Field Groups, Fields, and Channels are a little ambiguous and don’t fit into conventional relational DB terminology, but after building a few sites and getting use to the workflow involved in building an EE data model, the concepts start to make sense and you can easily build a full site (or web app for that matter) in a handful of hours.
Third, the extendability. EE is built on top of Codeigniter, a lean and smartly architected PHP web application framework which helped bring concepts like MVC and ORM (kinda) to the rogue landscape that was PHP development. Building EE on top of Codeigniter gave third-party developers easy access to a powerful toolset, helping them build third-party software that worked in conjunction with EE. It also brought functionality that wasn’t provided within the out-of-the-box codebase of the platform.
Because of these unique attributes of ExpressionEngine, it has been our tool for choice for many years. We’ve built countless sites on the platform and seldom find a piece of technology that works better for building small, medium, and even large sized content-driven websites.
Where EE falls short
With all that we love about EE, it also has its fair share of issues we’re tired of dealing with.
For one, the EE templating language/system is much too verbose for how underpowered it is. To be fair, it’s great for building simple sites that don’t need to modify or behave dynamically based on the content it’s rendering. However, when you get to a point where you start adding conditionals in your code — or need to include partials or dynamic layouts — things start becoming increasingly hard.
Parse Order, Advanced/Simple Conditionals, and Embeds vs. Snippets vs. Global Variables are all things the developer shouldn’t have to worry about and the framework itself should be responsible for.
Also, EE templating doesn’t let you access and manipulate raw data very easily. To display stored content inside templates, the first thing you need to do is create a channel:entries tag where you essentially loop over a collection of entries, putting all of your content and template tags within said loop. This “loop-everything” approach immediately adds a scope to the content within the loop, and makes it hard to display unrelated content in a very simple manner.
Thanks to amazing third-party developers, things like Stash and Low Variables have been created to assist with these shortcomings, but at the end of the day, we need a platform more powerful out-of-the-box and that has less of a learning curve to handle seemingly simple tasks.
Beyond the templating framework EE utilizes, the CMS itself is also rather feature barren and requires a handful of third-party add-ons to get to a place where we can start a build. Without going into the specifics of each feature these add-ons provide, we utilize at least 6–10 add-ons per build:
- Matrix: for dynamic and flexible entry data
- Structure: for building navigation and creating a better admin experience for clients
- Playa: for creating relationships between entries
- Low Variables: for storing global variables
- Zoo Flexible Admin: for customizing the (complex) CMS interface for clients
- Entry Type: for building flexible channel entry forms
- Wygwam: for providing a more feature rich WYSIWYG form field
- Assets: for storing and managing file uploads
- Stash: for creating dynamic and flexible layouts, and storing template data
- Mo’ Variables: for creating more global variables necessary in a majority of our builds
All of the functionality these fields provide are areas a modern CMS should be responsible for. And again, to be fair, EE has implemented internal modules for many of these pieces of functionality. Unfortunately though, many times these components are released far too late, or are not as robust or stable as the third-party tool.
Lastly, as much as I enjoy EE being built on Codeigniter, the CI framework itself is outdated, and more recently defunct. As of July 2013, the framework itself is not being actively worked on or contributed to. CI did bring many niceties to the table for building robust add-ons, but with the resurgence of PHP development over the past few years, many contemporary concepts such as dependency management, unit testing, and full active record ORM implementations; are not included in CI, making the building powerful add-ons a fairly cumbersome process.
All that being said, unfortunately most of my gripes with EE come down to the fact that EE is becoming an outdated piece of software that has, to some extent, been passed by similar technologies utilizing more modern technology. I have heard things about EE 3.0 on the horizon, and eagerly await seeing where the platform is headed.
Looking at Craft
As evident with my critiques above, we’ve been looking for a more contemporary and powerful CMS, that includes much of the genius brought to the table by EE, but that utilizes more modern technology. In comes Craft.
For those of you who don’t know, Craft was built by Pixel & Tonic, the team behind legendary EE add-ons Matrix, Playa, Wygwam, and Assets. My assumption is that Brandon Kelly and his team had some of the same frustrations with EE that I highlighted above and wanted to release their own framework, making huge leaps forward with the responsibilities and feature set of a modern CMS. Being that P&T are responsible for arguably some of the best and most crucial third-party EE add-ons, they seemed like a perfect team to take on the challenge.
Like I mentioned above, we’re currently wrapping up our first client build of a site built on Craft, and while I don’t have the knowledge to give the end-all be-all comparison of Craft vs. EE, I can share a few things I love about Craft and why it has now become our CMS of choice.
Where Craft really shines
To begin, the data model behind the CMS itself feels very familiar. Like I mentioned above, one of EE’s greatest attributes is its powerful data model. Craft’s architecture feels very similar: you create field groups, add fields to groups, and assign groups to sections (similar to channels). This is nearly identical to EE.
Beyond this paradigm, however, is where Craft really took this model to the next level. Craft includes the ability to create different Entry Types, where you can assign different fields to various types of entries, all within the same channel.
Also, I’ll include the default field types inside this conversation of the data model as well. All of the default field types are extremely robust. On our current build, we only needed one third-party field type (to handle a Google Maps integration) which we really don’t want Craft being responsible for anyway. Behind the scenes Craft has a few powerhouse Model objects that essentially let you access any piece of content throughout the site, using a consistent and easy to understand syntax. Without getting too technical, this is great because it allows us to query nearly any specific field, from any entry, inside any page on the site. I was blown away at how easily accessible data was within our templates. Instead of hacking multiple channel:entries tags and stash embeds to retrieve and display a specific field within a specific entry, we used one simple line of Craft template logic to handle this.
The next major improvement we’ve fallen in love with is Twig. Wow. Twig is amazing. Twig is a PHP templating language built by Sensio Labs which is a great mix of expressive, simple, and powerful. With EE, many times the templating language felt too removed from writing actual PHP, and simple data manipulation was cumbersome and much too challenging. Twig allows you to manipulate, store, and loop your data in a more PHP-centric and simple format.
My only complaint, which isn’t really a complaint and more so something I’m still pondering, is the best way to organize my twig inside the templates. Sometimes the Craft query syntax and Twig is so powerful I find myself writing logic that should actually be inside some sort of view-model, or another higher level of business logic.
I’d also like to briefly mention a handful of niceties Craft includes out of the box. Not all of these are specific features or functionality within the CMS, but each one makes the experience of using Craft that much more enjoyable:
- Custom routing
- Channels, Sections, Singles
- Multi-environment ready
- Single click updates (a little tricky with multiple-environment, though)
- Frequent updates to core platform
- Open and transparent communication from P&T team
- Built with extendability in mind: Yii
At this point it’s hard to say Craft has many shortcomings as it’s such a new product with much more room to grow. However, there are a few areas of the product we would like to see improved.
Currently there is no definitive way to create a hierarchy of pages within the Craft interface. Craft does include a section type called “Structure” which lets you order pages within in a hierarchical manner; however, we’re looking for something a little more global, that can be used across multiple sections, giving the client the ability to create a flexible dynamic site-map, and giving developers tags which can render navigation within templates.
As with most database driven CMS’, one issue that always comes up for us is managing the database between multiple environments. Over the years we have come up with protocols and various scripts to help us manually migrate data between environments, but I would love to see Craft solve this problem and include it as part of the platform.
While it’s a very hard problem to solve, it’s one that has been along for far too long to not have a reliable viable solution.
All that being said, we are obviously enthusiastic about continuing to develop in Craft, all the while being proud and thankful for the work we have done using ExpressionEngine. Both platforms are unique and powerful products, helping us execute the work we love to do, and letting us better help our clients find success.
Keep in mind the purpose of this article was not to talk about all the reasons why ExpressionEngine is great, and to describe all of the new features Craft includes. The purpose is to highlight why we’re excited about using Craft and some of the things we find useful and interesting (and hope you do too!).