EllisLab text mark

Kanban Board

Managing a team is hard work made even harder when you work remotely and only know what people are working on when you ask or when they tell you. We’ve used numerous tools that attempt to organize and communicate what each of us is working on: JIRA, Pivotal Tracker, Sprint.ly, Trello, and—currently—GitHub Issues.

Each of these tools has done something different that worked for us at the time with the people we had. I can look back on them and say that while I had frustrations with each and

Continue Reading

CodeIgniter 2.2.0 Released

CodeIgniter 2.2.0 has been released today, and is a security release for the 2.x branch. One of these changes is significant, so please be sure to read the version notes for upgrading from 2.1.4 to 2.2.0 to ensure your environment is ready for the update.

Since most have moved on to the development version of 3.0 from the GitHub repo, these fixes only affect sites powered by the legacy version. Sites running the development version of 3.x are unaffected as they have already been addressed in that version line. We felt that sites who were still running 2.x and potentially impacted by the vulnerability warranted an update so the release available for that version line is secure.

You can download v2.2.0 and find the full changelog here.

Continue Reading

Improved License Management

For many years we have heard from agencies about the difficulties they have in keeping track of client licenses for ExpressionEngine. Good record keeping is a necessity, and can be as simple as a spreadsheet with the client’s name and license numbers for ExpressionEngine and any third-party add-ons used for their build. On our end we’ve provided a few things to assist, such as a “Notes” field in the Manage Purchases page with each license that can be used for the client’s name or other identifying information.

Even with these things in place, it’s easy after a few years of ExpressionEngine work to have accumulated so many licenses that some fall through the cracks. Many factors are at play: sheer volume, using a base install and forgetting to update the license, transferring some licenses to clients while maintaining others, etc. A far too common result of these many branching pathways and points for potential license confusion are conversations like this one:

End user: Hi EllisLab, we’d like to upgrade to the latest version, but we don’t know how to access the software on your site.

EllisLab: No problem, what is your license number in Admin > General Configuration? We can help you locate your account.

End user: It’s blank / It says <insert license number that is for a third-party add-on> / <insert valid license number that is not owned by the end user>

EllisLab: No problem, do you know who built your site for you?

End user: Yes but we haven’t been able to contact them / no, nobody still working here remembers who set it up.

At that point we try to help the client track down the developer, sometimes with success, sometimes not. Ultimately the developer simply neglected to key in the license number, forgot to purchase a license before taking the site live, or meant to transfer the license to their client but didn’t. To give a sense of scale to the problem, in just the last year clients have collectively experienced almost three years of waiting (25,394 hours) while sorting out their license ownership with all parties involved.

To try to address these challenges more directly, starting in ExpressionEngine 2.9, the Software License number has been moved to its own section of the control panel, and we’ve added a field to help clients (and EllisLab) know who to contact if they have questions about their license.

software license page

Note that this contact email address doesn’t have to be associated with your EllisLab.com account, as this is more for your client’s benefit down the road. In the example above, we’re taking advantage of plus addressing in the email address to use one account but still readily identify the client. If the information on this page is for some reason blank (due to using a base install, or removed from config), the control panel will prompt you to fill in that information to properly register your software. This registration information gets sent to EllisLab1 and when you are logged in, is displayed for you next to the license and your existing notes.

license use info

You will be able to see where the license is in use, as well as the last time the ping occurred. Using this information, you can monitor your clients’ sites by taking a quick glance at your Manage Purchases page and ensure none of your clients have a site that’s been down for months. E.g.: if you see a client site that hasn’t sent a ping in six months, it could be a sign that they need you for some services.

EllisLab has always taken a soft approach to license registration so we treaded very lightly here. You will never be locked out of your software nor will the behavior and output of your site be impacted by this in any way. But now agencies, freelancers, and clients are assured to have reliable information keyed in prior to launching their site, and readily on hand for managing their ExpressionEngine licenses down the road.

  1. We also include the server IP, domain name, ExpressionEngine version, and PHP version. Having that version information allows us to make more informed development decisions, and rather than have a separate ping, we are piggybacking this one for performance. Further, this ping only occurs in the control panel on select pages and with a two week cache, so it will never interrupt the use of your site, your content authors, or your site visitors. 

Continue Reading

“View All” Pagination, Part 2

A while back, [we showed you a way][1] to display your paginated entries on one page in addition to the paginated pages. It was pretty simple: if the correct segment is set to all, show all of the entries using the same embedded template we use to show one entry.

{if segment_2 == 'all'}
='quotations/_entry' limit='30' paginate=''}
='quotations/_entry' limit='1' paginate='bottom'}

It’s a handy tip and it’s still viable. However, what if you wanted to display those pages slightly differently?

Continue Reading

ExpressionEngine StackExchange Alfred Workflow

As of today, ExpressionEngine Answers at StackExchange (EESE) has over 7100 questions, 9500 answers, and 1500 visits per day. Perhaps even more impressive but not at all a surprise given how active the ExpressionEngine community is, there are over 2800 users, including 230+ users that exceed StackExchange’s own measure of reputation excellence. The result is an absolute wealth of curated expert information about ExpressionEngine.

A lot of us at EllisLab also like Alfred 2, a handy productivity app for Mac OS X. If you use Alfred 2, we have released a simple workflow to put EESE at your fingertips.

sample eese search

You can get the EESE Alfred Workflow from the GitHub repo or you can download version 1.0.0 directly. Enjoy.

Continue Reading

Improved Download Management

We have made it a bit easier to manage your software downloads and access previous invoices. On your manage purchases page, you will now find links to your six most recent support subscription invoices in the subscription detail area of the page, and the main table listing now only lists your software downloads.

You can find a chronological listing of your entire purchase history by clicking the “view all invoices” link in the support subscription area. If you have never had a support subscription, your invoice history is already available via the main table. Enjoy!

simplified invoice listing

Continue Reading

ExpressionEngine 2.8.2 Developer Preview

Late last week we released a Developer Preview for ExpressionEngine 2.8.2. Being that it’s a maintenance release, there should not be any changes required to update add-ons for compatibility.

However, since a few add-ons are still catching up to 2.8, we thought it would be best to open up another Developer Preview to provide an additional opportunity for third-party developers to get help from us and to communicate any issues impeding their add-ons from being compatible.

We are constantly looking at how we can improve how we work with third-party developers to enable their add-ons to be ready simultaneous with an ExpressionEngine feature release. We’ve noticed that some developers are having difficulty being ready on time, and we want to ensure that the pathway for them to communicate with our engineers is clear. So we thought we would create a page in our user guide to make it easier for folks to know about the existing Developer Preview Program, enjoy.

Continue Reading

2.8 User Guide Additions: Advanced Templates

We thought it would be helpful to point out some of the additions and changes to the user guide that came with the release of ExpressionEngine 2.8. Today’s topic: advanced templates.

Relative Dates

Relative date formatting gives even greater control on how you present time-based information. There is a great deal of variety and control at your disposal with the relative date formatting parameters that you may not be aware of. For instance, did you know that the format= and timezone= parameters will take over when your stop= parameter kicks in? Or perhaps you even missed that all of your date variables can now be displayed in any timezone.

Modulus Operator for Conditionals

The modulus operator for conditionals was added in ExpressionEngine 2.7.1 last September, and we blogged about it but whoops! We neglected to add it to the user guide until December.

Multiple search:field= Parameter Clarification

In the example of using multiple search parameters in the Channel Entries tag:

{exp:channel:entries search:style="=ale" search:region="germany|belgium" search:rating="=3|4|5"}

We added the following explanation to help clarify how they will interact:

When using multiple search parameters, all search parameters must be matched in order for an entry to be included. The above example would pull back only those entries where the style is ‘ale’, the region is ‘germany’ or ‘belgium’ and the rating is 3, 4 or 5.

Relationship Namespaced Variables

Did you know that inside a Relationship tag pair that you can namespace and use any variable available to the Channel Entries tag, including switch?

Continue Reading

2.8 User Guide Additions: Developer Interest

We thought it would be helpful to point out some of the additions and changes to the user guide that came with the release of ExpressionEngine 2.8. Today’s topic: advanced items of interest for developers.

System Configuration Overrides

Many of the system and site settings that are stored in the database can be overriden in config files. For power users, this can be handy to modify settings in different contexts. They are now fully documented with the config setting, allowed values, and an explanation of what they are for. This type of configuration is an advanced area of ExpressionEngine that you certainly don’t have to understand or use in order to build a site, but some people like tinkering under the hood and for those people we now have all of these parts documented.

RSS Parser Class

Developers, have you seen how simple it is to create SimplePie objects for working with Atom and RSS feeds? The new RSS Parser class allows you to do that. Say goodbye to Magpie.

Pages Module Warning

As a result of things we have encountered while providing support, we have added a warning against excessive use of the Pages module, to help alert site builders before they head down a long dark path that is difficult to maintain and untangle.

Caching Drivers

ExpressionEngine 2.8 added memory-based caching options, but if you haven’t changed your cache storage settings, you are still using files and disk I/O for caching. Are you up to speed on these new drivers, and what you need to ask your host to enable to take full advantage of them?

If you are an add-on developer, have you updated your add-ons to take advantage of the new Cache Class so that your users are able to benefit fully from utilizing memory-based caching?

Pagination Class

Third-party developers historically were left to their own devices to add pagination to their add-ons, often copying/pasting from first-party modules to do so. This worked okay, but each of our modules had collected slightly different ways of handling pagination, with slightly different featuresets.

So we took our first steps to abstract things out to a useful Pagination library in version 2.4.0. That was refined and improved while it was in use on Channel Entries, Comments, and the Search module. In 2.8.0, we moved all first-party add-ons to the unified Pagination library, and simultaneously released final developer documentation as it is now stabilized and recommended for all developers to use.

Continue Reading

2.8 User Guide Additions: Templates

We thought it would be helpful to point out some of the additions and changes to the user guide that came with the release of ExpressionEngine 2.8. Today’s topic: templates.

Template Layouts

Template Layouts are all new to ExpressionEngine 2.8. Have you read how to use them yet?

Template Routes

Template Routes are also new to ExpressionEngine 2.8. Visit this section of the user guide to see how to add advanced fine-grained control to your ExpressionEngine site’s URL structure. ExpressionEngine’s default URL structure is flexible and powerful, but some clients have very specific URL structures that have special needs. Now you can accommodate them without template tricks or a conditionals dance.


Previously the user guide only discussed Channel entry and Comment pagination, but now that pagination has been unified across all first-party modules, it was time to give its documentation some reorganization and refinement.

Path Variable tip

While providing support, we discovered that many users are implementing path variables like this:

<a href="{path='company/employees'}/customer-service/joe">JoeCustomer Service</a

So we thought we would highlight in the user guide that the {path=} variable can accept any number of segments, which makes for more readable templates.

<a href="{path='company/employees/customer-service/joe'}">JoeCustomer Service</a

Simple Conditional clarification

What variables are available in “simple” conditionals? No more guesswork or mistaken assumptions, we’ve documented what’s available at that stage of the parsing engine.

Continue Reading