# CiviCRM 5.23.0
Released March 4, 2020
- **[Bugs resolved](#bugs)**
## <a name="synopsis"></a>Synopsis
| *Does this version...?* | |
| Fix security vulnerabilities? | no |
| **Change the database schema?** | **yes** |
| **Alter the API?** | **yes** |
| Require attention to configuration options? | no |
| **Fix problems installing or upgrading to a previous version?** | **yes** |
| **Introduce features?** | **yes** |
| **Fix bugs?** | **yes** |
## <a name="features"></a>Features
### Core CiviCRM
- **Add PDF letter functionality for Activities using new token processor
Adds the ability to create PDF letters that include activity tokens from the
- **Add utf8 to utfmb8 conversion api command
Adds an API to convert the database from utf8 to utf8mb4. This is intended to
help early adopters using the utf8mb4 standard (which includes support for
emojis) with CiviCRM.
- **Move exportui extension into core
Updates the 'Select Fields' screen on step 3 of the Export wizard.
- **Allow setting a custom L10n/I18n resource directory
Adds a new setting for the "L10n/I18n resource directory" which allows site
administrators to specify the location of the l10n directory (and allows the
directory to be outside of the main code base).
- **Proposal to add a new hook_civicrm_alterExternUrl
Adds a new hook `hook_civicrm_alterExternUrl` which can be used by extension
developers to alter Extern scripts.
- **Support MySQL 8.0 now that it is GA
(Work Towards [dev/core#392](https://lab.civicrm.org/dev/core/issues/392):
Works toward supporting MySQL 8.0 by:
+ Ensuring that the log_date column on logging tables is NOT NULL in MySQL 8.
+ Ensuring that `CRM_Utils_QueryFormatterTest` passes on MySQL 8.
+ Fixing the handling of dates in `getMembershipStarts` function to ensure
date is passed to query as yyyy-mm-dd to fix test failure on MySQL 8.
- **Field Names now Reserved Words in MySQL8
MySQL8 reserves the words "description" and "grouping" which CiviCRM uses as
field names. These changes work to ensure that these fields play nicely when
- **CQ: Migrate simple Preferences & Settings forms to using a Generic class.
(Work Towards [dev/core#495](https://lab.civicrm.org/dev/core/issues/495):
Makes admin settings field labels translatable.
- **composer.json - Update civicrm-setup
Improves civicrm-setup for scripted installations of Druapl8 with `cv` and GUI
based installations on WordPress.
- **Replace all instances of CRM_Core_Fatal with throw new CRM_Core_Exception
(Work Towards [dev/core#560](https://lab.civicrm.org/dev/core/issues/560):
Work towards throwing exceptions instead of fatal errors.
- **Google+ references should be removed as it phases out (Work Towards
Google is phasing out Google+ this begins work to remove all visible
references to Google+ from CiviCRM.
- **"config_backend" should be thoroughly removed (Work Towards
Ensures that the column `civicrm_domain.config_backend` is not created on new
sites and drops the column `civicrm_domain.config_backend` for sites that
started on 4.7-5.20. Additionally, this deprecates some functions related to
the setting `civicrm_domain.config_backend`.
- **Address ID field should be exportable
Makes Address ID an exportable field.
- **APIv3 - Only scan files for deprecation checks in Entity.get
Improves performance of APIv3 by stopping scanning nonexistent files.
- **Add debug info to api4 output
Improves API4 by adding debug info and displaying the query.
- **APIv4 - don't throw exception when updating/deleting 0 items
Improves APIv4's update and delete actions when operating on 0 items so that
they do not throw exceptions, instead they return 0 results.
- **APIv4 - Variable substitution in docblocks
Makes the help text more meaningful in the APIv4 Explorer by always referring to
the correct entity & action names.
- **APIv4 Explorer css tweaks
Makes the checkboxes in the APIv4 explorer line up better and makes them bold
- **APIv4 docs improvements
Improves APIv4 docs and their display in the explorer.
- **APIv4 Explorer - Better UI for defaults param
Improves APIv4 so that it handles defaults param with select2 instead of a
text box. Also shows the new way of using the variadic addSelect function.
- **Api4 - improve docblocks & display links in explorer
Improves documentation for most APIv4 entities by adding clickable links
to documentation displayed in the APIv4 explorer.
- **Implement PaymentProcessor and PaymentProcessorType APIv4 Entities
Adds `PaymentProcesor` and `PaymentProcessorType` entities to APIv4.
- **Update function to repair indexes to take table as a parameter
Makes it so the `System.getmissingindices` and `System.updateindexes` APIs
accept 'tables' as a parameter (array or string) and limits the results to the
specified tables if supplied.
- **Api4 - Support wildcard * in select clause
Adds support for the * wildcard in the SELECT clause of APIv4 Get actions.
- **Api4 - Filter returned fields by contact type
Ensures that civicrm_api4('Contact', 'get' ...) filters the fields returned
based on contact type.
- **Api4 - Convert field values to correct data type
Ensures that Api4 returns field values as the correct data type (instead of
always as a raw string).
- **Api4 - format output consistently across get/create/update.
Improves consistency of output in Api4.
- **Add more functionality to the api4 $index param
Improves APIv4 by making the `$index` param support 4 modes: Integer, String,
Non-associative array and Associative array and documenting them more clearly.
- **Use markdown in php docblocks & display in APIv4 Explorer
Reformats some docblocks to use markdown, and uses the marked.js library to
display the docblocks clearly in the APIv4 Explorer.
- **Civi\Test - Allow `headless()->apply()` (etc) to execute without setup.sh
Makes it possible to run the headless test suites without running setup.sh.
- **Allow most values of $civicrm_paths['XXX']['url'] to be relative
Allows system administrators to override various path and URL computations
using a relative URL.
- **composer.json - Explicitly set target PHP platform
Refines the way in which composer resolves dependencies - so as to prefer
packages that are compatible with CiviCRM's declared minimum requirement.
- **Add function to set entitySubType for entity forms
Makes it so entity subtype can be set in a standard way and is used if set.
- **Add metadata to is_primary fields
Improves field information for `is_primary` for the sake of Form Builder.
- **Check field to carry over custom data by default when the other contact has
Improves the contact merge screen by defaulting to checking the box to
carryover any custom data fields where the contact being merged into has no
- **Add resolved to return array for get_conflicts
Enhances the `Contact.get_merge_conflicts` API call to also include an array
of resolved conflicts.
- **Add case tokens to email activities
Adds the ability to use case tokens in PDF Letters and single emails.
- **Restrict case roles by group
Adds a setting to restrict contacts available to be selected for a case role
- **Add columns to Contribution Detail report: Employer, Location Type,
Preferred Communication Method
Improves the Contribution Detail report by making the fields 'Employer',
'Location Type', 'Preferred Communication Method' available as columns.
- **Add "Contributor Name" to Offline Contribution Receipts
Adds the display name of the contributor to Offline Contribution Receipts.
- **Add pre/post hooks on ContributionSoft entity
Add Pre and post hooks for the `ContributionSoft` entity.
- **Deprecate creating partially paid contributions, other than by partially
paying a contribution.
Adds deprecation noise when an attempt is made to set a contribution to
partially paid other than by adding a payment (using Payment.create). This is
necessary not only because we have a preferred workflow but also because
setting to "Partially Paid" doesn't actually create the `financial_trxn` that
is required if done via `Contribution.create` flow.
- **Expose "is_show_location" to control display of event locations
Exposes an option to show event location on the event configuration tab.
- **Make Deja Vu Sans the default font for mailing labels
Updates the default font for mailing labels to be "Deja Vu Sans" which is a
font that supports unicode characters.
- **Pass through mailing id to alterMailContent hook
Improves the `hook_civicrm_alterMailContent` hook by passing the mailing ID to
it so that developers can access data about the mailing that the content is
- **Eventually google will require OAUTH for bounce processing and may require
it for outbound SMTP through gmail servers
(Work Towards [dev/mail#59](https://lab.civicrm.org/dev/mail/issues/59):
Adds the ability to connect to IMAP server using XOAUTH2 protocol. Updates the
version of zetacomponents/mail package to a version that will support XAUTH2.
- **Allow personalised 'view in browser' links for mass emails
Improves the CiviMail "view in browser" experience by allowing personalized
- **When viewing a membership show if the status is overridden
Adds the text "(Overridden)" next to the membership status when viewing a
membership for which the status has been overridden.
- **Auto renew text appears at top of membership edit form
Improves the placement of the Auto Renew help text on the Membership edit
- **Improve accessibility of membership edit form
Updates the help text link text on the membership edit form to be meaningful
to improve accessibility.
- **Permit modified_id as a parameter for membership create api
Adds `modified_id` as a parameter for APIv3 `membership.create`.
### Wordpress Integration
- **WordPress Version Update
Ensures the WordPress plugin version is updated by distmaker.
- **Pass language code to CiviCRM for Wordpress
Ensures CiviCRM will always pick up the language that WordPress is configured
to use instead of having to configure the language in both CiviCRM and
- **Update civicrm.settings.php.template to default to CLEANURL for WP
Makes it so that new WordPress/CiviCRM sites default to having CleanUrls.
## <a name="bugs"></a>Bugs resolved
### Core CiviCRM
- **No Household Member Relationship Created when an Individual shares a
relationship with a household
Fixes a regression in core where sharing an address with a household stopped
creating a household member relationship so that there is a checkbox (that
defaults to checked) to create a household member relationship when sharing
an address with a household.
- **Add mechanism for avoiding conflicts when deduping
Improves dedupe functionality so that it aborts early if two (or more)
dedupe jobs are running at the same time and attempt to act on the same
- **Clear asset builder cache when clearing cache
Ensures the "dyn" folder gets cleared when clearing CiviCRM caches.
- **Smart groups with deleted/disabled custom fields throw fatal error on its
usage. (Work Towards [dev/core#1471](https://lab.civicrm.org/dev/core/issues/1471):
Adds an alert on the system status page when deleted custom fields are used in
a smart group.
- **Invalid links to extension directory
Fixes an invalid link to the extension directory in help text.
- **CQ: Eliminate 'contribution_invoice_settings' 'Setting' in favour of
following our standard (Work Towards
Works towards eliminating the 'contribution_invoice_settings' 'Setting' in
favor of following the CiviCRM standard by ensuring the `credit_notes_prefix`
is retrieved the standard way, refactoring some old code and adding some data
conversion code for the non-standard setting.
- **Errors in link ReCaptcha and Extension Directory
Fixes a link with incorrect quoting leading to malformed html and a link with
an incorrect anchor.
- **Incorrect Contact Reference option for Postal Code in civicrm_data.sql
Fixes a bug where custom fields of the type "contact reference" would
display the country instead of the postal code so that they show the country
- **Getting Started dashlet does not cache per language
Ensures the CiviCRM Resources dashlet displays in the user's language.
- **Call hook_civicrm_copy for RecurringEntity
Ensures that `hook_civicrm_copy` is called when entities are copied via
- **CRM_Utils_XML::parseFile() - Fix obscure segfault
Fixes a Segfault error for users with a very specific config (Macs running php
7.4.1 or 7.3.9 MAMP 5.6).
- **Add require_once to api3TestTrait
Ensures the `api3TestTrait` includes the file for the
`_civicrm_api3_get_options_from_params` function instead of relying on it
being loaded tangentially.
- **Cleanup API_Exception usage
Fixes mis-capitalized exception class name, and moves a APIv3-only check to the
- **IconPicker widget improvements
Fixes some style issues with the icon picker widget and adds some controls to
- **CRM_Core_Menu - Fix warnings during local test run
Fixes the warning `Warning: simplexml_load_file(): I/O warning : failed to
load external entity` when running the test suite on Drupal 8 sites on OSX.
- **Add user friendly error message on merge error
Adds a user friendly error when attempting to merge two contacts from the
Advanced Search Screen when no Supervised rule is present on the site, before
this change a fatal error was thrown.
- **Enotice fix ((https://github.com/civicrm/civicrm-core/pull/16293))**
Fixes an "Warning: Invalid argument supplied foreach()" e-notice on the edit
smart group screen.
- **Force reCaptcha is not working when pay later enabled
Ensures that ReCaptcha is always on even if only pay later is enabled as a
- **Dedupe rules don't work with custom fields/Variable type error during import
process ([dev/core#1597](https://lab.civicrm.org/dev/core/issues/1597) and
Fixes a regression where dedupe rules were failing when attempting to use a
custom field as the match field.
- **Select_string only accepts integers: 1
Fixes an error for translated sites when trying to perform a contact search.
- **Advanced Search: "active period" filter regression
Fixes a bug in Advanced Search where the filter "active period" (for
relationships) is not respected.
- **Advanced search links on mailing reports page give "DB Error: syntax error"
Fixes a regression where this url
"civicrm/contact/search/advanced?force=1&mailing_id=1" throws a fatal error.
- **Upgrade fails when civicrm_managed table contains a row including
- **Fix loading with alternate packages path (system-level)
- **Fix loading with alternate packages path (UI-level)
- **setup.sh - Fixes for running in basic composer file-structure
- **Make $civicrm_paths less sensitive to trailing slashes. Add tests.
- **Prevent PropertBag from being so noisy about deprecation warnings
- **Wrong parameter passed to executeQuery function
- **Update temp table handler to support utf8mb4 if that is the db collation
- **Enforce isSkipLineItem for membership payment entity in Order.create
- **Fetch Only Active Custom Group Extend Values
- **Ensure that we always return a raw urlencoded url for extenal urls to fix
- **Country/State PseudoConstant not sorted according to the locale
- **Change check.gif to an actual gif (was a PNG)
- **Fix Error handling following DB Package upgrade
- **Do not escape html in report header and footers on API create
- **Editing a group description inline causes the recent items list to display
blank instead of the group title
- **Recent items list has blank entry and E_NOTICE's when viewing an Email
activity from activities tab
- **'Merge All Contacts with the Same Address' doesn't consider Household
replace individuals that share same address. ([CRM-21858
- **Scheduled reminder emails sent to contacts with do_not_email set or with
email on hold ([dev/core#1378](https://lab.civicrm.org/dev/core/issues/1378):
- **Update BAO_Acl internal functions to protected & unused to deprecated
- **Deactivating CiviContribute causes SQL error
- **Changing a civicase activity's label breaks the max_instances check
- **Case Resource shows contact names that are not accessible to logged in user
- **Fix activity.case_id token to always display the first case ID
- **Positive integer expected for recurring interval even when user is not
making a recurring contribution
Fixes a Fatal error when the recurring option "Support recurring intervals" is
enabled on a contribution page.
- **Make getTotalPayments return 0 instead of NULL
- **Email address token on the confirmation message not working for a pay later
- **Paypal IPN fails when contact is merged
- **`,` as decimal separator, and [space] as thousand separators leads to api
- **Fix retrieving contribution_status_id for manual payment processor
- **Set contribution status to refunded when it has been refunded
- **"Confirm Event Invitation" message template has a bad variable
Fixes the URL for self-service updates links in the "Confirm Event Invitation"
message template to include the participant ID so that they link correctly.
- **Respect form value for register_date on participant form
Fixes a bug where the participant registration date is exposed on the
backoffice event form, but when a credit card payment is being submitted it is
- **Scheduled reminders are incorrectly sent from event templates when
"additional group" is selected
- **"Confirm from waitlist" doesn't consider whether participant roles are
- **Event registration form doesn't prevent multiple signups for waitlisted
- **Permission error on event info page for anonymous users
- **Changing the membership type causes multiple copies of related membership
text on edit membership page
- **search builder: member since field ignored
Ensures that "Search Builder" respects the "Member Since" field.
### Drupal Integration
- **composer.json - Relax psr/log constraint. Improve D8 compatibility.
Fixes a composer conflict when installing CiviCRM on Drupal 8.7.
- **Drupal8: Enabling language breaks a fresh CiviCRM install
- **Drupal8 - Contact Report does not load any values in the ACL Group/Role
- **CiviCRM session instance not working when Masquerading in Drupal 7
- **Wiki link in OG Sync module description gives a 404
## <a name="misc"></a>Miscellany
- **Duplicate code (for real)
- **Mailing Subscribe Form: remove nbsp from descriptions
- **Remove SymfonyComponents/YAML package
- **Update DB_Object
- **Update gettext to latest tagged release
- **Upgrade DB package to be version 1.9.3
- **Update copyright headers following merge of #14662
- **Add tax rates to metadata
- **Add helper for getting participantValues
- **Update docs link for edit scheduled job parameters
- **Start to use function rather than multiple queries for event details add
- **Simplify event title retrieval, use cache, add test
- **Change function buildEventFeeForm to non-static
- **Finish removal of deferred_revenue_enabled from non-standard setting
- **Api4 - Improve Entity::get
- **Api4 - Make abstract function abstract
- **Api4 - Use explicit adder functions rather than magicMethod
- **Update contributor-key.yml
- **Update my contributor details
- **APIv4 documentation & code cleanup
- **Fix minor typo in help text.
- **Extract code for isPaymentOnExistingContribution.
- **Remove function that exactly matches parent class.
- **Remove unsupported and unused package DB_Table
- **Remove $ids as parameter for Membership::add
- **Remove unused code in Case/Form/Activity postProcess
- **Remove never passed-in parameter from addPayments
- **Remove duplicate line of code
- **Remove unreachable code lines.
- **Remove unused code
- **Remove irrelevant code.
- **Remove unindexed join from getACLRoles query
- **Remove unmaintained unsupported System_Command package
- **fix typo's in the text
- **fix more typo's in the text
- **Fix unit tests after gettext merge
- **Update recently-added PathUrlTest to be more representative
- **Fix tests to use buildFeeFn
- **Add unit test to back office form when a payment is made against a partially
- **Revised version of test from #15725
- **Update failing test to match intervening changes elsewhere
- **Fix unit test so price set params are valid
- **Update Export unit test to pass on MySQL 8
- **Basic extraction of paid event processing
- **Refactor CRM_Contact_BAO_Contact::importableFields() to use metadata
- **[REF] Remove setting of unused function.
- **[REF] Remove apparent copy & paste code.
- **[REF] Move the bounce to the start of the form submit
- **[REF] Eliminate silly parameter from function signature.
- **[REF] Extract code that assigns event variables to the tpl
- **[REF] Fix return value on deleting financial type
- **[REF] Move handling of default payment instrument for a payment proc…
- **[REF] Move use of priceSetID & amount_override to where they are used
- **[REF] Cleanup CRM_Member_BAO_Membership::buildMembershipTypeValues
- **[REF] Remove enclosed & escaped variables
- **[REF] Minor code simplification in dedupe.
- **[REF] move sessionStart functionality to System subclass
- **[REF] Update fetchAll function signature to match parent function
- **REF Simplify if statement on case activity form
- **[REF] Eliminate ['userID'] as an input for BAO_Membership::create
- **[REF] Move the storing of custom data into the add function rather th…
- **[REF] Remove never-passed param from getLineItems
- **[REF] Extract location wrangling code.
- **[REF] rename lineItem & lineItems variable
- **[REF] Activate fetchAll function in DataObject file
- **[REF] Reduce places where we pass ids into Mailing::create
- **[REF] Remove ids and fully deprecate passing it to Contribution::create
- **[REF] Pass params into function rather than this weird check for whether
params exists. ((https://github.com/civicrm/civicrm-core/pull/16438))**
- **[REF] Move assignment of BalanceAmount
- **[REF] Fix CRM_Core_BAO_UFGroup::createUFJoin to not receive by reference.
- **[REF] Interim code cleanup - make the usage of addPayments clearer
- **[REF] Remove unused variable
- **[REF] Add test for line item, extract fn
- **[REF] Ensure that the from is correctly modified in both the main que…
- **[REF] Remove some unused variables
- **REF Extract code to build pcp_supporter_text and enable translation
- **[REF] Remove unused variables
- **[REF] Extract function to export header row
- **[REF] Extract & share code to determine revenue recognition date.
- **[NFC] code cleanup
- **[NFC] Code cleanup
- **[NFC] code cleanup
- **[NFC] Minor code cleanup
- **[NFC] Extend unit test to cover for recent refactor by eileen to ensure sup…
- **[NFC] Code formatting
- **[NFC] Code cleanup
- **NFC Convert Manage PCP page to short array syntax
- **[NFC] Add in more assertions around the content of line items and tot…
- **[NFC] Doc Block fix should be bool no boolean as per coding standards
- **[NFC] Code comments
- **[NFC] Minor cleanup in test class
- **[NFC] Skip utf8mb4 test on MySQL versions lower than 5.7
- **[NFC] Test update following PR #16150, assertEquals first param is th…
- **[NFC] Explicitly specify that it is the Payment processor Type Name n…
- **NFC Fix TokenRow docblock
- **[NFC] Minor test cleanup.
- **[NFC] Remove unused local variables from
- **[NFC] throw exceptions, single quotes, declare exceptions, remove unused
- **(NFC) Update Var declaration to be standard in CRM folder
- **(NFC) Civi/*.php - Update for
- **NFC Add parameter definition to membershipstatus.calc
- **[NFC] Ensure that annon permissions are correctly assigned when enabling
civicrm webtest module in backdrop
- **[NFC] Fix style error
## <a name="credits"></a>Credits
This release was developed by the following code authors:
a-n The Artists Information Company - William Mortada; AGH Strategies - Andrew
Hunt; Agileware - Pengyi Zhang; Andrei Mondoc; British Humanist Association -
Andrew West; Caltha - Tomasz Pietrzkowski; Chris Burgess; Circle Interactive -
Pradeep Nayak; CiviCoop - Jaap Jansma; CiviCRM - Coleman Watts, Tim Otten;
CiviDesk - Yashodha Chaku; CompuCorp - Vinu Varshith Sekar; Coop SymbioTIC -
Mathieu Lutfy, Samuel Vanhove; Dave D; Electronic Frontier Foundation - Mark
Burdett; Fuzion - Jitendra Purohit; GMCVO Databases - Jade Gaunt; JMA Consulting -
Seamus Lee; John Kingsnorth; Joinery - Allen Shaw; Joris Vercammen; Megaphone
Technology Consulting - Jon Goldberg; MJCO - Mikey O'Toole; MJW Consulting -
Matthew Wire; myDropWizard - David Snopek; Progressive Technology Project -
Jamie McClelland; Squiffle Consulting - Aidan Saunders; Tadpole Collective -
Kevin Cristiano; Third Sector Design - Michael McAndrew; Timbsoft Technologies -
Tunbola Ogunwande; Web Access - Kurund Jalmi; Wikimedia Foundation - Eileen
McNaughton, Elliott Eggleston
Most authors also reviewed code for this release; in addition, the following
reviewers contributed their comments:
AGH Strategies - Alice Frumin; Agileware - Justin Freeman; Andrew
Cormick-Dockery; Artful Robot - Rich Lott; Christian Wach; CiviDesk - Nicolas
Ganivet; CompuCorp - Shitij Gugnani; Francesc Bassas i Bullich; Fuzion - Luke
Stewart, Peter Davis; Greenpeace Central and Eastern Europe - Patrick Figel; JMA
Consulting - Joe Murray, Monish Deb; Korlon - Stuart Gaston; Lighthouse Design
and Consulting - Brian Shaughnessy; mikantchap; Richard van Oosterhout; SYSTOPIA
Organisationsberatung - Björn Endres; tapashdatta;
## <a name="feedback"></a>Feedback
These release notes are edited by Alice Frumin and Andrew Hunt. If you'd like
to provide feedback on them, please log in to https://chat.civicrm.org/civicrm
and contact `@agh1`.