New Features & Enhancements

Orphaned Assets Tool

#6620 - Idea by Oliver Neal

A new tool for managing orphaned assets in the system has been added under the System Tools area.

The new Orphaned Assets Tool shows you a list of all assets that don't have a dedicated parent asset. An asset can become "orphaned" sometimes when all of its parent links are deleted by accident, for example via API calls to Matrix or from Trigger Actions.

The table on the report lists each orphaned asset including how many child assets it has, who was the last person to update it, and a link to directly go and edit it.

The tool also allows you to link the assets under a new parent in order for you to restore them or move them to the Trash. This is effectively an Admin Mode implementation of the already available system_integrity_orphaned_assets.php script that you can run on the CLI as a server admin.

New Trigger Events for Permissions, Web Paths, and Content Updates

#8770 - Idea by Daniel Graver

Five new Trigger Events have been added to allow you to have more control over when to fire Trigger Actions. These include:

  • Before/After Permissions Updated - This event will fire the Trigger before or after a Permission change has occurred on the asset. For example, if someone changes the Cascade setting on an existing Read Permission.
  • Before/After Web Paths Updated - This event will fire the Trigger before or after a Web Path has been changed on the asset. This includes adding a new one, changing an existing one, or deleting it.
  • Before Asset Content Updated - This event was added to complement the already existing After Asset Content Updated action. This event simply fires the Trigger before the contents of an asset has been updated.

Dynamic Values for Menu Design Area Settings

#9344 - Idea by James Chalmers

The Menu Normal Design Area for Design assets now accepts dynamic values for the Root Node and Menu Level settings using the standard Dynamic Parameters functionality in Matrix.

For example, you can now let users control these values from things like Metadata or other dynamic sources instead of having to create Design Customisations for each different menu variation you want to use.

Metadata Field Morphing

#9708 - Idea by Sean Gilligan (Squiz Client)

Asset Morphing support has been added to Metadata Field assets.

You can now convert any Metadata Field to a different type by simply going to its Settings screen (requires Admin access to the asset), selecting a different type, and saving the screen.

New URL Keyword for Git Bridge File Assets

#9440 - Idea by Fraser Brown

A new URL keyword has been added for referencing files from a Git File Bridge.

The new %asset_url_with_hash% keyword simply prints the full URL of a file, but with the latest Git hash appended to it. This is helpful for busting browser cache entries of outdated files as the hash value will change every time the file is updated from the Git repository.

To reference a specific file, you can use simply use the "globals" version of the keyword like this:

<link href="%globals_asset_url_with_hash:1234:css/styles.css%" rel="stylesheet"/>

Which then will output something like this:

<link href="https://matrix.squiz.net/__data/assets/git_bridge/0011/34949/css/styles.css?h=e6543c4" rel="stylesheet"/>

Configuration of the LDAP User ID Attribute

#9836 - Idea by Jennifer Flores

A new configuration option has been added to the LDAP Bridge that allows you to control which value to use as the unique identifier for a user's shadow asset ID.

When the Use User ID as Shadow ID option is set to Yes, each LDAP User shadow asset will use the LDAP entry's User ID value as the shadow asset ID.

For example, a user's username would then go from something like this:


To something like this:


This also means that your LDAP Users in Matrix won't get affected if you change the user groups or DN structure in your LDAP configuration or IDP.

This toggle will also be turned on by default for any new LDAP Bridge assets you create from this version on.

If you switch this setting on an existing system, and if there are references to LDAP users outside of the bridge, the new ldap_update_bridge_references.php script will also need to be run in order to the update all existing references in the database.

Ability to Export Metadata Select Field Options

#10001 - Idea by Douglas Davey (Squiz Client)

The Details screen of the Metadata Select Field now has an Export To CSV File button that will export all of the select options into a .csv file for you. You can then alter the keys and values in the exported file, in something like Excel, and then easily upload it again using the Upload From CSV File field to update the list.

Session Storage of Created Asset ID in the Create Asset Trigger Action

#10680 - Idea by John McCormick

You can now store the asset ID of the asset created by the Create Asset Trigger Action in a session variable.

You can then use this value as the source for another trigger to action on as a follow up action. For example, if you want to set the status of the newly created asset directly after creation.

Support for the SCSS @import Directive in SCSS Design Files


The SCSS Design File asset now supports the Sass based @import directive for including .scss files into the compiling of the final .css file.

You can use a number of ways to include a .scss file:

@import "mysource_files/_variables.scss";
@import "./?a=1234";
@import "./?external-uuid=178bd4bb-d4fa-40a0-bf1c-6a6575c48b61"; 
@import "%globals_asset_url:1234%";
@import "%globals_asset_url_with_hash:5678:scss/_variables.scss%";

Whenever one of the @import file assets are updated, it will also trigger an update of the SCSS Design File so that it automatically compiles and creates a new version of the generated .css file.

Westpac PayWay Payment Gateway

#10946 - Idea by Joseph So (Client Funded Feature)

A brand new Payment Gateway asset has been added to Matrix that lets you easily create e-commerce integrations with the Westpac PayWay system.

The new PayWay Payment Gateway asset works very similarly to other e-commerce integration assets in Matrix, where it allows you to connect to it using either an E-Commerce Form asset or a Shopping Cart for processing payments.

Tracking of Log Entries Created by Trigger Actions


Trigger Actions that change attributes, metadata, or anything else on an asset, now get reflected in the entries for assets.

For example, if you have a Trigger that changes the status of an asset, when it runs, the log entry on the asset's Logs screen will now indicate which Trigger caused that change to happen.

New Keywords

Several new keywords have been added in order to help with implementations of various functionality.

  • #6041 - New Keywords for Printing Custom Form Sections
    Three new keywords have been added for Custom Form Sections that allow you to print either the section's title, contents, or both, when customising the Bodycopy of a particular section.
    • %section_contents% - Prints the name and the contents of each question of the section.
    • %section_title% - Prints the name of the section.
    • %section_questions_contents% - Prints the contents of each question of the section.
  • #11176 - New Keywords for User Asset Permissions
    New keywords have been added to help evaluate conditions around the current user's access levels.
    • %asset_has_read/write/admin_access% - Prints a boolean value based on if the user has a specific type of access to an asset. For example, %frontend_asset_has_write_access%, will print either 1 if the current user has Write Access to the current frontend asset, or 0 if they don't.
    • %globals_user_is_logged_in% - Prints a boolean value based on if the current user viewing an asset is logged in or not.

    You can use these keywords in conditional content blocks using the conditional keyword format, for example:

      <p>Welcome <strong>%globals_user_name%</strong></p>
      <p><a href="/_login">Click here to log in</a></p> 
  • #11380 - New Keywords for Site & Index Asset Comparison
    Three new keywords have been added to check if a certain asset is the site asset, homepage asset, or either one of those.
    • %asset_is_site_asset% - Prints a boolean value based on if the asset is the site asset.
    • %asset_is_index_asset% -  Prints a boolean value based on if the asset is the site's index page asset.
    • %asset_is_homepage% - Prints a boolean value based on if the asset is the site asset or the site's index page asset (if it's the homepage).

    This is handy for printing different content in listings, designs, and templates based on if the current page is the home page or not, for example:

    <body class="%frontend_asset_is_homepage^eq:1:home:inside%-page">

Performance Improvements

Several performance improvements have been made in order to more efficiently perform certain backend operations. These include:

  • #6927 - Faster Update Lookups processing for creating, linking, and moving assets around the Asset Map
  • #9752 - Optimised search indexing when using weighting settings in the Search Manager
  • #9754 - Faster indexing of metadata when creating new assets
  • #11252 - Earlier session lock releases for files served directly from Matrix

Other Features & Enhancements

  • #4995 - Log in as user using asset map context menu
  • #8337 - SOAP API GetImageInformation function to return sha1 hash value
  • #8452 - Calendar Pages should allow searching and listing events that are of any status
  • #8560 - Creating a Trigger should broadcast an AssetCreate event
  • #9457 - Linking Screen for LDAP User Groups
  • #10471 - Update Value of initial Context selection on Preview Page of assets
  • #10604 - Rollback test_message.php Transactions
  • #10652 - Asset Listing Asset Sorting by Asset Keyword Value needs to indicate that percentage symbols are not needed
  • #10768 - Acquire locks immediately after creating an asset in Admin Mode
  • #10894 - Clean up System Config assets and unused screens
  • #10988 - System administrators should be able to disable 'hide errors on the frontend'
  • #11037 - Cancel Safe Edit needs a confirmation warning
  • #11142 - Prevent accidental deletion of Bodycopy Div's dependent child content type assets
  • #11156 - Allow passing a body payload when doing any request type using a Matrix Rest functionality
  • #11269 - Add Delete Filtered Remaps option in Remap Manager
  • #11300 - Enable keyword replacements in "Add URL" trigger action
  • #11344 - Matrix to automatically send surrogate-control headers for Edge
  • #11347 - Change default value or Send Cacheable Header Protocols to "Both"
  • #11360 - E-Commerce form does not allow you to remove an item from the cart
  • #11368 - Update Viper to latest code for
  • #11377 - Make Secret Key in Git Bridge a normal text field but still restricted from public view
  • #11408 - Make assets require a flash menu path to appear in asset map

Deprecations & Removals

  • #10020 - Hide settings that are for deprecated assets
  • #11216 - Deprecate Mollom support in Matrix
  • #11286 - Remove delete_assets_by_id.php script
  • #11312 - Remove Set Design Parse File and Set Design Associated Files trigger actions

Bug Fixes

  • #9091 - Viper toolbar buttons misaligned when zooming in
  • #9859 - Funnelback Manager still running events despite OEM being deprecated
  • #10034 - On the Workflow screen of assets, if you have selected Delete and also changed the Cascade value, the Workflow will not be deleted on Commit
  • #10074 - In Edit+ if a User is in a group that has specific permission to an asset but user has permission denied, the lock icon will not display on the Asset in the Asset Finder
  • #10432 - Have to select a WYSIWYG container twice to activate the Insert Character Viper button
  • #10496 - %question_contents_X_qY% keywords are not being validated on the front end
  • #10778 - Make 'Metadata Field Updated' trigger condition work with 'After Asset Metadata Updated' trigger event
  • #10868 - Viper can accidentally delete the whole content container when selecting all text and hitting delete
  • #10993 - JS_API errors in error.log don't have a newline at the end
  • #11009 - Matrix trigger_exception() doesn't make sense
  • #11168 - Incrementing the major version number on the settings screen doesn't update the last updated date
  • #11199 - Changing the name of the default stream in a workflow schema is not reflected in the stream selection list
  • #11242 - Can't save "0" as session variable
  • #11244 - %asset_metadata_field% of text and select fields during "Asset Metadata Updated" trigger
  • #11248 - LDAP User containing single quote (') in their DN breaks the Asset Finder in Linking screen
  • #11256 - "After Asset Metadata Updated" event types will fired the trigger multiple times if there are multiple context.
  • #11282 - Trigger linked outside of Trigger Manager does not reflect Enabled status in Asset Map
  • #11310 - Failed SOAP call still updates metadata
  • #11320 - Google Analytics Connector and View misbehavior if the authorized Google user does not have any valid GA View
  • #11327 - Changing the URL of a Site asset is not logged
  • #11335 - Viper WYSIWYG Remove Format breaks toolbar if used on complex google doc content
  • #11348 - trigger Add Web Path option not saving
  • #11372 - Triggers throwing undefined index notices v2
  • #11383 - Scripts unable to update asset conditions without running triggers
  • #11388 - "Advanced Filters" in Google Analytics View throw Notice errors when no "Field B" defined
  • #11389 - Updating a triggers category causes the asset map to refresh, but not display the new category
  • #11395 - Incomplete metadata warning missing from Edit+
  • #11396 - Multiple text field triggers a metadata change event even when you don't change it's value
  • #11398 - Image variety trigger action is handled differently for pngs vs jpg, jpeg, gif
  • #11404 - Asset type v2 selector throws PHP notice and warning if no type is selected
  • #11405 - Frontend metadata not showing correct metadata values for LDAP users
  • #11406 - Un-contextualised bodycopy container not showing up nicely in backend
  • #11412 - Form Submission Log screen: large number of submissions can result in running out of memory
  • #11416 - Hipo job get stuck when cloning calendar recurring event