Entry

ExpressionEngine “Kitchen Sink” 3.5.0 Released

by: Derek Jones on: 1/16/2017

ExpressionEngine 3.5.0 is full of many time-saving improvements for content authors, site builders, and programmers alike. It’s a little of everything, a “kitchen sink” release that was borne mostly from the fact that we eat our own dogfood and there were some things we wanted for ourselves. We’ve been running a pre-release version of 3.5.0 for a couple months now, and we’re ready to share it with you!

ExpressionEngine 3.5.0 Released

Label / Value Options

Checkboxes, Radio Buttons, Select, and Multiselect fields can now all be setup with Label / Value options, giving greater flexibility for how content is stored vs. displayed.

This is a great feature with a plethora of use cases. State selections:

<option value='OR'>Oregon</option>
<option value='PA'>Pennsylvania</option>

Sort orders:

<option value='asc'>Ascending Alphabetical</option>
<option value='desc'>Descending Alphabetical</option>

And other things:

<option value='jezza'>Jeremy Clarkson</option>
<option value='hamster'>Richard Hammond</option>
<option value='captain-slow'>James May</option>

Model Query Performance

Model query performance has been improved, making the whole application a bit snappier. I’ll keep the description of this improvement as fast as the models, so moving right along…

PHP 7.1 Compatibility

If you aren’t already running PHP 7, it’s time to upgrade. PHP 7.1 deprecated mcrypt, so while v3.4 won’t break, PHP would throw deprecation errors. Therefore, we took the opportunity to overhaul our encryption libraries and use OpenSSL instead. In addition to better security, it has an improved API and the ability to sign and verify data.

// encrypt and decrypt content
$encrypted = ee('Encrypt')->encrypt($content)
$unencrypted = ee('Encrypt')->decrypt($encrypted);

// encrypt and base64 encode content for safe transport (and the reverse)
$encoded = ee('Encrypt')->encode($content);
$unencoded = ee('Encrypt')->decode($content);

// sign content
$signature = ee('Encrypt')->sign($content);

// verify the data hasn't changed
$safe = ee('Encrypt')->verifySignature($content, $signature);

This is a completely backwards compatible change. Add-ons that are using the legacy ee()->encrypt-> methods will seamlessly be handled by the new improved Encrypt service.

Category-related Variable Improvements

We’ve added a new helper variable to the Channel Entries tag. If you’ve ever done this before:

{if '{categories limit="1"}{category_id}{/categories}' != ''}
    Some content that is only output if an entry is categorized.
{if}

You will be happy to know you can now replace that with {if has_categories}:

{if has_categories}
    Some content that is only output if an entry is categorized.
{/if}

As for the {categories}{/categories} tag pair itself, it has its own count-related variables. Finally.

{categories}
    {if category_count == 1}
        <h2>Categories</h2>
        <ul>
    {/if}

            <li>{category_name}</li>

    {if category_count == category_total_results}
        </ul>
    {/if}
{/categories}

We even tossed in {category_reverse_count} for “countdown” style display. And lastly the {category_name} variable itself has auto-typography for pretty quotes and dashes.

File Field Interface

When editing content, the toolbar no longer obscures small thumbnails, and the filename (or supplied Title if given) is displayed to give additional context to the existing selected file.

Before (left), After (right)
File Field: Before (left), After 3.5.0 (right)

core_boot Extension Hook

Gone are the days when the poor sessions_start and sessions_end hooks get abused simply because they are called on every request. There’s a really nerdy explanation behind what those hooks are for, and the oddities that come from trying to run application code during their execution, but I’ll spare you that. Ask me sometime in Slack if you’re curious. But because they are reliably called on every request, developers understandably used them for all sorts of things that they also wanted to always happen.

Now they can use the core_boot extension hook, which is fired on every request just as soon as the app is finished spinning up all of its necessary internals.

Outgoing Email Configuration

As email services modernize, SSL and STARTTLS are becoming the norm, rather than outliers. So two related config.php file overrides have been graduated to the UI: email_newline and email_smtp_crypto. For example, if you want to use Google as your sender, you will need to set both of these settings. Both are now set in the UI with “Newline character” and “Connection type”, respectively. If you were already using the overrides, they will be set properly when you update to 3.5.0, and then you are free to remove them from your config file if you wish.

And a small UX thing, but we’re always thinking about how to improve things, so SMTP server options are no longer visible unless you have selected SMTP for your sending protocol.

Discussion Forums

While we’re not quite ready to release the brand new forum module we’re running on our site, we made a few improvements to the existing Discussion Forum module that give greater flexibility for those building forum themes:

  • Forum conditionals—which for legacy reasons do not use ExpressionEngine’s fantastic conditional parser—are now at least nestable.
  • {forum_id} is available to the Thead Rows theme partial.
  • {if is_moderator} is available to the Threads and Thread Rows theme partials.
  • {topic_date} is available to the Threads theme partial.
  • {topic_class} is available to the Topic Rows partial.
  • Poll data is available to the Thread Rows partial, so polls can optionally be displayed inline with the author’s post, instead of only above the associated thread.
  • Code samples now use the new, easy-to-style code blocks, rather than the old school PHP highlighter method.

And the rest

Lots of additional small refinements:

  • Added entry_id= and url_title= parameters to the “Related Categories Mode” of the Channel Entries Tag, providing compatibility with custom template routing.
  • The {redirect=} variable can now take full URLs, including external URLs instead of just path segments.
  • Usernames and screen names now have a maximum length of 75 characters.
  • SimplePie, used by the RSS Parser, has been updated to 1.4.3.
  • Administrators must now verify themselves when creating a new member record that will have control panel access. Trust, but verify. Hat tip to Travis Smith at Hop Studios for the suggestion.

And plenty of bugs squashed. We appreciate everyone who takes the time to file solid bug reports, but a few of these were corner cases that were frustrating to replicate or understand. Thanks to Pedro Guimaraes of Willow Light Studio, Kurt Deutscher of Netraising and Nicolas Bottari of Zenbu Studio for helping us identify some of those.

See the full list and details in the ExpressionEngine 3.5.0 Change Log.

Go download, replace two folders, and update to 3.5.0 right now!

.(JavaScript must be enabled to view this email address) or share your feedback on this entry with @ellislab on Twitter.

ExpressionEngine News

#eecms, #events, #releases