| 1 | # CiviCRM 5.28.0 |
| 2 | |
| 3 | Released August 5, 2020 |
| 4 | |
| 5 | - **[Synopsis](#synopsis)** |
| 6 | - **[Features](#features)** |
| 7 | - **[Bugs resolved](#bugs)** |
| 8 | - **[Miscellany](#misc)** |
| 9 | - **[Credits](#credits)** |
| 10 | - **[Feedback](#feedback)** |
| 11 | |
| 12 | ## <a name="synopsis"></a>Synopsis |
| 13 | |
| 14 | | *Does this version...?* | | |
| 15 | |:--------------------------------------------------------------- |:-------:| |
| 16 | | Fix security vulnerabilities? | no | |
| 17 | | **Change the database schema?** | **yes** | |
| 18 | | **Alter the API?** | **yes** | |
| 19 | | **Require attention to configuration options?** | **yes** | |
| 20 | | **Fix problems installing or upgrading to a previous version?** | **yes** | |
| 21 | | **Introduce features?** | **yes** | |
| 22 | | **Fix bugs?** | **yes** | |
| 23 | |
| 24 | ## <a name="features"></a>Features |
| 25 | |
| 26 | ### CiviCRM Core |
| 27 | |
| 28 | - **End of life planning for MySQL server 5.0 - 5.6 (Work Towards |
| 29 | [dev/core#1681](https://lab.civicrm.org/dev/core/-/issues/1681): |
| 30 | [17558](https://github.com/civicrm/civicrm-core/pull/17558))** |
| 31 | |
| 32 | Block sites from upgrading if on a MySQL version less than 5.6.5. |
| 33 | |
| 34 | - **Ability to enable SSL for database connection. (Work Towards |
| 35 | [dev/core#1137](https://lab.civicrm.org/dev/core/-/issues/1137): |
| 36 | [298](https://github.com/civicrm/civicrm-packages/pull/298))** |
| 37 | |
| 38 | Makes SSL database connections without client certificates work in PHP 7. |
| 39 | |
| 40 | - **Create new customPre hook |
| 41 | ([dev/core#1716](https://lab.civicrm.org/dev/core/-/issues/1716): |
| 42 | [17144](https://github.com/civicrm/civicrm-core/pull/17144))** |
| 43 | |
| 44 | Creates a new hook customPre which makes it so one can impact or observe |
| 45 | custom data before it is saved. |
| 46 | |
| 47 | - **Investigate PHP currency library |
| 48 | ([dev/translation#48](https://lab.civicrm.org/dev/translation/-/issues/48): |
| 49 | [17608](https://github.com/civicrm/civicrm-core/pull/17608))** |
| 50 | |
| 51 | Implements the PHP library [brick/money](https://github.com/brick/money) to |
| 52 | better handle currency amounts. |
| 53 | |
| 54 | - **Replace all instances of CRM_Core_Fatal with throw new CRM_Core_Exception |
| 55 | (Work Towards [dev/core#560](https://lab.civicrm.org/dev/core/-/issues/560): |
| 56 | [17555](https://github.com/civicrm/civicrm-core/pull/17555), |
| 57 | [295](https://github.com/civicrm/civicrm-packages/pull/295), |
| 58 | [602](https://github.com/civicrm/civicrm-drupal/pull/602), |
| 59 | [17550](https://github.com/civicrm/civicrm-core/pull/17550), |
| 60 | [17534](https://github.com/civicrm/civicrm-core/pull/17534), |
| 61 | [17541](https://github.com/civicrm/civicrm-core/pull/17541), |
| 62 | [17545](https://github.com/civicrm/civicrm-core/pull/17545) and |
| 63 | [17539](https://github.com/civicrm/civicrm-core/pull/17539))** |
| 64 | |
| 65 | Work towards throwing exceptions instead of fatal errors. |
| 66 | |
| 67 | - **APIv4 - Activity has no default for activity_date_time |
| 68 | ([dev/core#1782](https://lab.civicrm.org/dev/core/-/issues/1782): |
| 69 | [17450](https://github.com/civicrm/civicrm-core/pull/17450))** |
| 70 | |
| 71 | Sets the default for `activity_date_time` and `created_date` as the current |
| 72 | date when using the APIv4 Activity. |
| 73 | |
| 74 | - **Update guzzle to d8 latest |
| 75 | ([dev/core#1803](https://lab.civicrm.org/dev/core/-/issues/1803): |
| 76 | [17551](https://github.com/civicrm/civicrm-core/pull/17551))** |
| 77 | |
| 78 | This updates guzzle to version 6.5.4, civicrm/civicrm-cxn-rpc to "version" |
| 79 | "v0.19.01.00", guzzlehttp/psr7 to version 1.6.1 and psr/log to version 1.1.3 |
| 80 | |
| 81 | - **APIv4 - Improve row_count to work with HAVING, GROUP BY, and SELECT |
| 82 | ([17704](https://github.com/civicrm/civicrm-core/pull/17704))** |
| 83 | |
| 84 | This changes the meaning of $result->count(), to give a total count of |
| 85 | filtered items, ignoring limit and offset. |
| 86 | |
| 87 | - **APIv4 - Add more SQL functions |
| 88 | ([17692](https://github.com/civicrm/civicrm-core/pull/17692))** |
| 89 | |
| 90 | Adds support for additional SQL functions in APIv4. Also categorizes them and |
| 91 | adds translated titles for the new Search Builder. |
| 92 | |
| 93 | - **APIv4 - Add titles and icons to entities |
| 94 | ([17527](https://github.com/civicrm/civicrm-core/pull/17527) and |
| 95 | [17685](https://github.com/civicrm/civicrm-core/pull/17685))** |
| 96 | |
| 97 | Adds titles and icons to DAO entities and expose them to APIv4 Entity::get and |
| 98 | adds meta-metadata. |
| 99 | |
| 100 | - **APIv4 Explorer - UI support for join ON clause |
| 101 | ([17682](https://github.com/civicrm/civicrm-core/pull/17682))** |
| 102 | |
| 103 | Improves the APIv4 explorer to give selectable clauses when adding a JOIN. |
| 104 | |
| 105 | - **Add permission metadata to contact is_deleted field |
| 106 | ([17721](https://github.com/civicrm/civicrm-core/pull/17721))** |
| 107 | |
| 108 | Improves the contact schema metadata. |
| 109 | |
| 110 | - **API/DAO Metadata - Retain versioning metadata for possible usage in |
| 111 | runtime+tooling |
| 112 | ([17735](https://github.com/civicrm/civicrm-core/pull/17735))** |
| 113 | |
| 114 | Adds metadata to indicate when fields are created. |
| 115 | |
| 116 | - **Connect to database using SET NAMES utf8mb4 |
| 117 | ([17716](https://github.com/civicrm/civicrm-core/pull/17716))** |
| 118 | |
| 119 | This change makes it so one can use utf8mb4 characters. However, databases |
| 120 | that do not support utf8mb4 will not be affected. |
| 121 | |
| 122 | - **Remove slow join from activity search |
| 123 | ([17250](https://github.com/civicrm/civicrm-core/pull/17250))** |
| 124 | |
| 125 | Improves performance of the activity search. |
| 126 | |
| 127 | - **Add icons to standalone contact tasks |
| 128 | ([17667](https://github.com/civicrm/civicrm-core/pull/17667))** |
| 129 | |
| 130 | This adds icon data to contact tasks that appear in the new search builder |
| 131 | extension. |
| 132 | |
| 133 | - **Add icons to multi-valued custom groups and display on contact tab |
| 134 | ([17531](https://github.com/civicrm/civicrm-core/pull/17531))** |
| 135 | |
| 136 | Custom data sets that appear as tabs can now have configurable icons to |
| 137 | display on the tab. |
| 138 | |
| 139 | - **Add serialize metadata to domain.locales field |
| 140 | ([17651](https://github.com/civicrm/civicrm-core/pull/17651))** |
| 141 | |
| 142 | Adds metadata to help APIv4 serialize/unserialize the domain.locales |
| 143 | field correctly. |
| 144 | |
| 145 | - **Add Smarty error event |
| 146 | ([16918](https://github.com/civicrm/civicrm-core/pull/16918) and |
| 147 | [292](https://github.com/civicrm/civicrm-packages/pull/292))** |
| 148 | |
| 149 | Improves debugging errors in Smarty templates. |
| 150 | |
| 151 | - **Allow HEAD requests to generate a form key |
| 152 | ([17321](https://github.com/civicrm/civicrm-core/pull/17321))** |
| 153 | |
| 154 | Avoids generating crashes (500 errors) when bots check links. |
| 155 | |
| 156 | - **Include a new SqlParallel queue type that enables multiple queue runners to |
| 157 | process in parallel |
| 158 | ([15422](https://github.com/civicrm/civicrm-core/pull/15422))** |
| 159 | |
| 160 | Adds a new SQL queue type which will allow multiple runners to fetch the next |
| 161 | available job from a queue and run in parallel. |
| 162 | |
| 163 | - **Allow adding datepicker to metadata based settings pages |
| 164 | ([16610](https://github.com/civicrm/civicrm-core/pull/16610))** |
| 165 | |
| 166 | Makes it so that datepicker can be added to metadata based settings pages by |
| 167 | specifying html_Type='datepicker' in settings metadata. |
| 168 | |
| 169 | ### CiviContribute |
| 170 | |
| 171 | - **Add payment processor to details on list of recurring contributions |
| 172 | ([17179](https://github.com/civicrm/civicrm-core/pull/17179))** |
| 173 | |
| 174 | The list of recurring contributions now has a column showing the payment |
| 175 | processor. |
| 176 | |
| 177 | - **Fix all core processors to throw exceptions and not rely on the |
| 178 | CRM_Core_Payment to convert errors to exceptions |
| 179 | ([dev/financial#131](https://lab.civicrm.org/dev/financial/-/issues/131): |
| 180 | [17565](https://github.com/civicrm/civicrm-core/pull/17565), |
| 181 | [17559](https://github.com/civicrm/civicrm-core/pull/17559), |
| 182 | [17542](https://github.com/civicrm/civicrm-core/pull/17542), |
| 183 | [17502](https://github.com/civicrm/civicrm-core/pull/17502), |
| 184 | [17500](https://github.com/civicrm/civicrm-core/pull/17500), |
| 185 | [17597](https://github.com/civicrm/civicrm-core/pull/17597), |
| 186 | [17592](https://github.com/civicrm/civicrm-core/pull/17592) and |
| 187 | [17596](https://github.com/civicrm/civicrm-core/pull/17596))** |
| 188 | |
| 189 | Makes it so that core payment processors fail gracefully more often. |
| 190 | |
| 191 | - **Add selfService flag to cancelSubscription getText so we can display |
| 192 | different text for each case |
| 193 | ([17687](https://github.com/civicrm/civicrm-core/pull/17687))** |
| 194 | |
| 195 | Makes it so payment processor developers can identify the different contexts |
| 196 | someone may be canceling from and display appropriate messaging. |
| 197 | |
| 198 | - **Price Field Form - Save the fid for the postProcess hook |
| 199 | ([17639](https://github.com/civicrm/civicrm-core/pull/17639))** |
| 200 | |
| 201 | Improves `postProcess` hook for Price Field Form by making the field id |
| 202 | available. |
| 203 | |
| 204 | - **Improve error handling on IPN |
| 205 | ([18062](https://github.com/civicrm/civicrm-core/pull/18062))** |
| 206 | |
| 207 | The error message and backtrace from a failed PayPal Website Payments Standard |
| 208 | instant payment notification (IPN) are now logged. |
| 209 | |
| 210 | ### CiviMember |
| 211 | |
| 212 | - **Display start/end adjustment on membership status page. |
| 213 | ([dev/core#1809](https://lab.civicrm.org/dev/core/-/issues/1809): |
| 214 | [17571](https://github.com/civicrm/civicrm-core/pull/17571))** |
| 215 | |
| 216 | Improves the Membership Status administration page by adding columns for the |
| 217 | start/end adjustment. |
| 218 | |
| 219 | ### WordPress Integration |
| 220 | |
| 221 | - **Provide concrete details about civicrm.files |
| 222 | ([18011](https://github.com/civicrm/civicrm-core/pull/18011) follows on |
| 223 | [dev/wordpress#66](https://lab.civicrm.org/dev/wordpress/-/issues/66), see |
| 224 | also [17868](https://github.com/civicrm/civicrm-core/pull/17868))** |
| 225 | |
| 226 | A message will appear after an upgrade to 5.28.0 or later specifying the |
| 227 | calculated and expected file upload locations. |
| 228 | |
| 229 | Changes appearing in 5.27 have been reverted but will be reapplied in 5.29 |
| 230 | after more notice is provided. |
| 231 | |
| 232 | ## <a name="bugs"></a>Bugs resolved |
| 233 | |
| 234 | ### Core CiviCRM |
| 235 | |
| 236 | - **Contact image is broken |
| 237 | ([dev/wordpress#62](https://lab.civicrm.org/dev/wordpress/-/issues/62): |
| 238 | [17853](https://github.com/civicrm/civicrm-core/pull/17853))** |
| 239 | |
| 240 | This resolves a problem on sites managed with Git where the `db.json` file |
| 241 | would be missed. |
| 242 | |
| 243 | - **Evaluate if any indexed fields are unused (Work Towards |
| 244 | [dev/core#1634](https://lab.civicrm.org/dev/core/-/issues/1634): |
| 245 | [17686](https://github.com/civicrm/civicrm-core/pull/17686))** |
| 246 | |
| 247 | Remove database index on `medium_id` from `civicrm_activity`. |
| 248 | |
| 249 | - **Activity - Default priority value when adding an activity |
| 250 | ([dev/core#1801](https://lab.civicrm.org/dev/core/-/issues/1801): |
| 251 | [17557](https://github.com/civicrm/civicrm-core/pull/17557))** |
| 252 | |
| 253 | Ensures when creating a new activity the priority field defaults correctly for |
| 254 | sites not in english. |
| 255 | |
| 256 | - **The multi-lingual multi-domain problem |
| 257 | ([dev/core#1852](https://lab.civicrm.org/dev/core/-/issues/1852): |
| 258 | [17738](https://github.com/civicrm/civicrm-core/pull/17738) and |
| 259 | [17733](https://github.com/civicrm/civicrm-core/pull/17733))** |
| 260 | |
| 261 | Ensures that the list of languages civicrm_domain.locales is the same for all |
| 262 | domains in a multi-domain set up. |
| 263 | |
| 264 | - **APIv4 - Skip empty leaves in WHERE clause |
| 265 | ([17576](https://github.com/civicrm/civicrm-core/pull/17576))** |
| 266 | |
| 267 | Fixes a bug in search builder where APIv4 gives a SQL error while building |
| 268 | your where clause. |
| 269 | |
| 270 | - **Offset is not respected in Date Preferences |
| 271 | ([dev/core#1847](https://lab.civicrm.org/dev/core/-/issues/1847) and |
| 272 | [dev/core#1874](https://lab.civicrm.org/dev/core/-/issues/1874): |
| 273 | [17762](https://github.com/civicrm/civicrm-core/pull/17762) and |
| 274 | [17836](https://github.com/civicrm/civicrm-core/pull/17836))** |
| 275 | |
| 276 | - **Fix CRM_Utils_JS::dedupeClosures to ignore comments |
| 277 | ([17717](https://github.com/civicrm/civicrm-core/pull/17717))** |
| 278 | |
| 279 | Ensures comments do not interfere with deduping. |
| 280 | |
| 281 | - **Use PHPUnit7 as the primary test runner |
| 282 | ([17615](https://github.com/civicrm/civicrm-core/pull/17615), |
| 283 | [17661](https://github.com/civicrm/civicrm-core/pull/17661), |
| 284 | [120](https://github.com/civicrm/civicrm-backdrop/pull/120), |
| 285 | [605](https://github.com/civicrm/civicrm-drupal/pull/605), |
| 286 | [206](https://github.com/civicrm/civicrm-wordpress/pull/206))** |
| 287 | |
| 288 | - **Fix isMultilingual to use static caching and respect current domain |
| 289 | ([17646](https://github.com/civicrm/civicrm-core/pull/17646))** |
| 290 | |
| 291 | Improves the efficiency and accuracy of the `CRM_Core_I18n::isMultilingual` |
| 292 | function, preventing a large number of duplicate queries on every request. |
| 293 | |
| 294 | - **Update has_separator field in civicrm_navigation |
| 295 | ([17579](https://github.com/civicrm/civicrm-core/pull/17579))** |
| 296 | |
| 297 | This field was incorrectly marked as a boolean; it's actually an int with an |
| 298 | option list. |
| 299 | |
| 300 | - **Civi\Payment\PropertyBag - Remove warning |
| 301 | ([17506](https://github.com/civicrm/civicrm-core/pull/17506))** |
| 302 | |
| 303 | - **Fix duplicate upgrade function |
| 304 | ([17582](https://github.com/civicrm/civicrm-core/pull/17582))** |
| 305 | |
| 306 | Fixes a fatal error on upgrade caused by a merge conflict. |
| 307 | |
| 308 | - **CRM_Case_XMLProcessor::allActivityTypes() doesn't do caching right |
| 309 | ([dev/core#1433](https://lab.civicrm.org/dev/core/-/issues/1433): |
| 310 | [17627](https://github.com/civicrm/civicrm-core/pull/17627), |
| 311 | [17616](https://github.com/civicrm/civicrm-core/pull/17616) and |
| 312 | [17614](https://github.com/civicrm/civicrm-core/pull/17614))** |
| 313 | |
| 314 | - **CustomValue.GetTree API Does Not Return Display Value for Money Select/Radio |
| 315 | Custom field ([dev/core#1566](https://lab.civicrm.org/dev/core/-/issues/1566): |
| 316 | [17008](https://github.com/civicrm/civicrm-core/pull/17008))** |
| 317 | |
| 318 | - **whom_url missing contact ID parameter in detailed logging report |
| 319 | ([dev/core#1749](https://lab.civicrm.org/dev/core/-/issues/1749): |
| 320 | [17440](https://github.com/civicrm/civicrm-core/pull/17440))** |
| 321 | |
| 322 | - **Regression - File fields export results in DB error |
| 323 | ([dev/core#1787](https://lab.civicrm.org/dev/core/-/issues/1787): |
| 324 | [17578](https://github.com/civicrm/civicrm-core/pull/17578))** |
| 325 | |
| 326 | - **Relative date filter - End of yesterday not working properly |
| 327 | ([dev/core#1798](https://lab.civicrm.org/dev/core/-/issues/1798): |
| 328 | [17512](https://github.com/civicrm/civicrm-core/pull/17512))** |
| 329 | |
| 330 | - **Editing a custom field choice label changes the `name` if you do it from the |
| 331 | custom field admin screens |
| 332 | ([dev/core#1817](https://lab.civicrm.org/dev/core/-/issues/1817): |
| 333 | [17681](https://github.com/civicrm/civicrm-core/pull/17681))** |
| 334 | |
| 335 | - **Custom Date field with format=yy displays calendar icon that doesn't work |
| 336 | ([dev/core#1829](https://lab.civicrm.org/dev/core/-/issues/1829): |
| 337 | [17664](https://github.com/civicrm/civicrm-core/pull/17664))** |
| 338 | |
| 339 | - **Unable to install 5.28 on Maria DB 10.3 on Ubuntu |
| 340 | ([dev/core#1860](https://lab.civicrm.org/dev/core/-/issues/1860): |
| 341 | [17772](https://github.com/civicrm/civicrm-core/pull/17772))** |
| 342 | |
| 343 | - **APIv4 - Filter getActions results based on user permissions |
| 344 | ([17540](https://github.com/civicrm/civicrm-core/pull/17540))** |
| 345 | |
| 346 | - **Pre-upgrade message for php-intl shows twice |
| 347 | ([17748](https://github.com/civicrm/civicrm-core/pull/17748))** |
| 348 | |
| 349 | - **Fix saving of State/Province Multi-select values |
| 350 | ([17737](https://github.com/civicrm/civicrm-core/pull/17737))** |
| 351 | |
| 352 | - **[regression] Attempting to access Multi-Record Custom Field import results |
| 353 | in crash ([dev/core#1841](https://lab.civicrm.org/dev/core/-/issues/1841): |
| 354 | [17697](https://github.com/civicrm/civicrm-core/pull/17697))** |
| 355 | |
| 356 | - **Use PSR-4 instead of PSR-0 in Civi directory |
| 357 | ([17690](https://github.com/civicrm/civicrm-core/pull/17690))** |
| 358 | |
| 359 | - **Sort options without relying on unavailable buildOptions param |
| 360 | ([17621](https://github.com/civicrm/civicrm-core/pull/17621))** |
| 361 | |
| 362 | - **Throw exception if id not passed into discard |
| 363 | ([17666](https://github.com/civicrm/civicrm-core/pull/17666))** |
| 364 | |
| 365 | - **Fix validation of select2 fields in "On behalf of Organisation" block |
| 366 | ([17672](https://github.com/civicrm/civicrm-core/pull/17672))** |
| 367 | |
| 368 | - **Pass required attribute for quickform fields through to form |
| 369 | ([16488](https://github.com/civicrm/civicrm-core/pull/16488) and |
| 370 | [17929](https://github.com/civicrm/civicrm-core/pull/17929) related to |
| 371 | [dev/core#1903](https://lab.civicrm.org/dev/core/-/issues/1903))** |
| 372 | |
| 373 | - **CRM_Core_I18n::setLocale() - Fix bug with repeated usage |
| 374 | ([17374](https://github.com/civicrm/civicrm-core/pull/17374))** |
| 375 | |
| 376 | - **Fix retrieving MySQL version for checking as part of install requirements |
| 377 | ([17593](https://github.com/civicrm/civicrm-core/pull/17593))** |
| 378 | |
| 379 | - **Set ContactType.name as required in the schema. |
| 380 | ([17548](https://github.com/civicrm/civicrm-core/pull/17548), |
| 381 | [17570](https://github.com/civicrm/civicrm-core/pull/17570), and |
| 382 | [18070](https://github.com/civicrm/civicrm-core/pull/18070) related to |
| 383 | [dev/core#1927](https://lab.civicrm.org/dev/core/-/issues/1927))** |
| 384 | |
| 385 | - **Fix "Undefined variable: entryFound" notice on Bookkeeping report |
| 386 | ([17554](https://github.com/civicrm/civicrm-core/pull/17554))** |
| 387 | |
| 388 | - **Zip code range search only supports numeric zip codes |
| 389 | ([17523](https://github.com/civicrm/civicrm-core/pull/17523))** |
| 390 | |
| 391 | Rather than causing a database error, this displays an error message when |
| 392 | attempting to search a postal code range using non-numeric postal codes. |
| 393 | |
| 394 | - **Remove isThrowException from CRM_Utils_Type::validate() signature |
| 395 | ([17546](https://github.com/civicrm/civicrm-core/pull/17546))** |
| 396 | |
| 397 | - **`codeVersion` not displayed in system status check error message about db |
| 398 | version vs codeversion |
| 399 | ([dev/core#1882](https://lab.civicrm.org/dev/core/-/issues/1882): |
| 400 | [17854](https://github.com/civicrm/civicrm-core/pull/17854))** |
| 401 | |
| 402 | - **"Merge" form moves unchecked related entities (intra-RC regression) |
| 403 | ([dev/core#1930](https://lab.civicrm.org/dev/core/-/issues/1930): |
| 404 | [18079](https://github.com/civicrm/civicrm-core/pull/18079))** |
| 405 | |
| 406 | ### CiviCase |
| 407 | |
| 408 | - **Non-compliant query leads to (semi-)random sorting and failing unit test |
| 409 | CRM_Case_BAO_CaseTest::testSortByCaseContact |
| 410 | ([dev/core#1844](https://lab.civicrm.org/dev/core/-/issues/1844): |
| 411 | [17708](https://github.com/civicrm/civicrm-core/pull/17708))** |
| 412 | |
| 413 | ### CiviContribute |
| 414 | |
| 415 | - **Payment instrument ID is not required at processorform level |
| 416 | ([17510](https://github.com/civicrm/civicrm-core/pull/17510))** |
| 417 | |
| 418 | Do not throw warning if payment instrument is not sent. |
| 419 | |
| 420 | - **Bank fee has wrong date on import in civicrm_financial_item.transaction_date |
| 421 | incorrected uses import date rather than payment date on |
| 422 | ([dev/core#1776](https://lab.civicrm.org/dev/core/-/issues/1776): |
| 423 | [17389](https://github.com/civicrm/civicrm-core/pull/17389))** |
| 424 | |
| 425 | Ensures the `civicrm_financial_item.transaction_date` gets recorded correctly |
| 426 | when importing a transaction with a bank fee. |
| 427 | |
| 428 | - **Payment.create should not set contribution date to today |
| 429 | ([17688](https://github.com/civicrm/civicrm-core/pull/17688))** |
| 430 | |
| 431 | - **Fix PHP notice when we don't have credit card params |
| 432 | ([16514](https://github.com/civicrm/civicrm-core/pull/16514) and |
| 433 | [17584](https://github.com/civicrm/civicrm-core/pull/17584))** |
| 434 | |
| 435 | - **Improve PropertyBag handling of offsetGet and custom properties; add more |
| 436 | tests ([17588](https://github.com/civicrm/civicrm-core/pull/17588) and |
| 437 | [17654](https://github.com/civicrm/civicrm-core/pull/17654))** |
| 438 | |
| 439 | - **Graphs on Contribution Summary report replace final row with grand total |
| 440 | value ([dev/report#40](https://lab.civicrm.org/dev/report/-/issues/40): |
| 441 | [17412](https://github.com/civicrm/civicrm-core/pull/17412))** |
| 442 | |
| 443 | - **"Undefined offset" bug in BAO/FinancialAccount.php |
| 444 | ([dev/wordpress#61](https://lab.civicrm.org/dev/wordpress/-/issues/61): |
| 445 | [17701](https://github.com/civicrm/civicrm-core/pull/17701) and |
| 446 | [17689](https://github.com/civicrm/civicrm-core/pull/17689))** |
| 447 | |
| 448 | Ensures that the financial account is set correctly even when the name does |
| 449 | not match the label. |
| 450 | |
| 451 | ### CiviEvent |
| 452 | |
| 453 | - **Event participant_listing_id field defaults to 0 instead of Null |
| 454 | ([dev/core#1833](https://lab.civicrm.org/dev/core/-/issues/1833): |
| 455 | [17677](https://github.com/civicrm/civicrm-core/pull/17677))** |
| 456 | |
| 457 | - **Multiple line item shown on view contribution if participant is transferred |
| 458 | to another contact. |
| 459 | ([dev/core#890](https://lab.civicrm.org/dev/core/-/issues/890): |
| 460 | [16956](https://github.com/civicrm/civicrm-core/pull/16956))** |
| 461 | |
| 462 | ### CiviGrant |
| 463 | |
| 464 | - **Bug in Grant statistics report |
| 465 | ([17640](https://github.com/civicrm/civicrm-core/pull/17640))** |
| 466 | |
| 467 | ### CiviSMS |
| 468 | |
| 469 | - **Can't change SMS recipient on non-bulk SMS |
| 470 | ([dev/core#1840](https://lab.civicrm.org/dev/core/-/issues/1840): |
| 471 | [17691](https://github.com/civicrm/civicrm-core/pull/17691))** |
| 472 | |
| 473 | ### Drupal Integration |
| 474 | |
| 475 | - **Error: Class 'CRM_Upgrade_Incremental_General' not found in |
| 476 | Civi\Install\Requirements->checkMysqlVersion() |
| 477 | ([dev/drupal#131](https://lab.civicrm.org/dev/drupal/-/issues/131): |
| 478 | [18066](https://github.com/civicrm/civicrm-core/pull/18066))** |
| 479 | |
| 480 | ### Joomla Integration |
| 481 | |
| 482 | - **Ensure that when normal routing trackable urls and opens in Joomla go to the |
| 483 | frontend not administrator site |
| 484 | ([17760](https://github.com/civicrm/civicrm-core/pull/17760))** |
| 485 | |
| 486 | ### WordPress Integration |
| 487 | |
| 488 | - **Remove `/` from the beginning and end of query string |
| 489 | ([207](https://github.com/civicrm/civicrm-wordpress/pull/207))** |
| 490 | |
| 491 | Fixes a 'You do not have permission to access this content.' error resulting |
| 492 | from an extra '/' in the `q=` string in the url. |
| 493 | |
| 494 | - **Base page fails to recognise Page Templates in subdirectories. |
| 495 | ([dev/wordpress#58](https://lab.civicrm.org/dev/wordpress/-/issues/58): |
| 496 | [204](https://github.com/civicrm/civicrm-wordpress/pull/204))** |
| 497 | |
| 498 | Ensures that the CiviCRM base page is correctly identified when it does not |
| 499 | reside in the theme root directory. |
| 500 | |
| 501 | - **Prevent session from starting during WordPress pseudo cron procedures |
| 502 | ([dev/core#1889](https://lab.civicrm.org/dev/core/-/issues/1889): |
| 503 | [17890](https://github.com/civicrm/civicrm-core/pull/17890) and |
| 504 | [210](https://github.com/civicrm/civicrm-wordpress/pull/210))** |
| 505 | |
| 506 | ## <a name="misc"></a>Miscellany |
| 507 | |
| 508 | - **Ship Flexmailer extension with civicrm-core |
| 509 | ([17669](https://github.com/civicrm/civicrm-core/pull/17669), |
| 510 | ([17768](https://github.com/civicrm/civicrm-core/pull/17768))** |
| 511 | |
| 512 | - **Support passing old method name into deprecatedFunctionWarning |
| 513 | ([17552](https://github.com/civicrm/civicrm-core/pull/17552))** |
| 514 | |
| 515 | - **Add CRM_Core_Form::isFormInViewMode and CRM_Core_Form::isFormInEditMode |
| 516 | ([17637](https://github.com/civicrm/civicrm-core/pull/17637))** |
| 517 | |
| 518 | - **CRM_Utils_JS - Dedupe 'use strict' directive |
| 519 | ([17711](https://github.com/civicrm/civicrm-core/pull/17711))** |
| 520 | |
| 521 | - **Add isBackOffice, isPayLater, getPaymentMode helpers to |
| 522 | frontendpaymentformtrait |
| 523 | ([17511](https://github.com/civicrm/civicrm-core/pull/17511))** |
| 524 | |
| 525 | - **Fix issue $this |
| 526 | ([589](https://github.com/civicrm/civicrm-drupal/pull/589))** |
| 527 | |
| 528 | - **Fix validateAll to no longer support unused abort param |
| 529 | ([17544](https://github.com/civicrm/civicrm-core/pull/17544))** |
| 530 | |
| 531 | - **Remove deprecated billingID from baseIPN |
| 532 | ([17525](https://github.com/civicrm/civicrm-core/pull/17525))** |
| 533 | |
| 534 | - **Add EntityFormTrait to pricefieldForm - stdised getEntityId() |
| 535 | ([17516](https://github.com/civicrm/civicrm-core/pull/17516))** |
| 536 | |
| 537 | - **Update contributor-key.yml |
| 538 | ([17553](https://github.com/civicrm/civicrm-core/pull/17553))** |
| 539 | |
| 540 | - **Export fix ([17644](https://github.com/civicrm/civicrm-core/pull/17644))** |
| 541 | |
| 542 | - **Upgrade HTML Purifier to v4.12.0 to support for PHP7.4 |
| 543 | ([297](https://github.com/civicrm/civicrm-packages/pull/297))** |
| 544 | |
| 545 | - **Temporary tables should follow consistent naming convention |
| 546 | ([dev/core#183](https://lab.civicrm.org/dev/core/-/issues/183): |
| 547 | [15796](https://github.com/civicrm/civicrm-core/pull/15796))** |
| 548 | |
| 549 | - **Remove unreachable lines |
| 550 | ([17563](https://github.com/civicrm/civicrm-core/pull/17563))** |
| 551 | |
| 552 | - **EventInfo template cleanup |
| 553 | ([17581](https://github.com/civicrm/civicrm-core/pull/17581))** |
| 554 | |
| 555 | - **[NFC] Misspelled word |
| 556 | ([17652](https://github.com/civicrm/civicrm-core/pull/17652))** |
| 557 | |
| 558 | - **Remove a usage of deprecated funtion get_magic_quotes_gpc and also switch out |
| 559 | {} for [] whne acecssing string or array offsets |
| 560 | ([296](https://github.com/civicrm/civicrm-packages/pull/296))** |
| 561 | |
| 562 | - **Remove unused deprecated class |
| 563 | ([17535](https://github.com/civicrm/civicrm-core/pull/17535))** |
| 564 | |
| 565 | - **Remove obsolete function formatWikiURL |
| 566 | ([17726](https://github.com/civicrm/civicrm-core/pull/17726))** |
| 567 | |
| 568 | - **[REF] Simplify the replacing of the email with the email from the url |
| 569 | ([17491](https://github.com/civicrm/civicrm-core/pull/17491))** |
| 570 | |
| 571 | - **[REF] Replace incorrect usages of array_key_exists when the variable is not |
| 572 | an array with property_exists and also fix the parameter order for an implode |
| 573 | statement ([17573](https://github.com/civicrm/civicrm-core/pull/17573))** |
| 574 | |
| 575 | - **[REF] Convert Authorize.net to use Guzzle for update subscription class, add |
| 576 | test ([17585](https://github.com/civicrm/civicrm-core/pull/17585))** |
| 577 | |
| 578 | - **[REF] Using {} to access string or array offsets has been deprecated in |
| 579 | PHP7.4 ([17574](https://github.com/civicrm/civicrm-core/pull/17574))** |
| 580 | |
| 581 | - **[REF] Mark unused date functions as deprecated |
| 582 | ([17487](https://github.com/civicrm/civicrm-core/pull/17487))** |
| 583 | |
| 584 | - **[REF] Using ternary operation without nesting is deprecated and also using |
| 585 | methods and properly instanciate the CiviCase Info object in test |
| 586 | ([17575](https://github.com/civicrm/civicrm-core/pull/17575))** |
| 587 | |
| 588 | - **[REF] Convert Authorize.net doDirectPayment to use guzzle & add test |
| 589 | ([17501](https://github.com/civicrm/civicrm-core/pull/17501))** |
| 590 | |
| 591 | - **[REF] Replace the deprecated system_rebuild_module_data function with |
| 592 | equivilant extension.list.module service function calls to be Drupal 9 |
| 593 | compatiable ([17515](https://github.com/civicrm/civicrm-core/pull/17515))** |
| 594 | |
| 595 | - **[REF] Remove never reachable lines. |
| 596 | ([17556](https://github.com/civicrm/civicrm-core/pull/17556))** |
| 597 | |
| 598 | - **[REF] Remove another instance of fatal() |
| 599 | ([17549](https://github.com/civicrm/civicrm-core/pull/17549))** |
| 600 | |
| 601 | - **[REF] Readability extraction in Dummy class |
| 602 | ([17543](https://github.com/civicrm/civicrm-core/pull/17543))** |
| 603 | |
| 604 | - **[REF] Replace some instances of fatal with thrown exceptions. |
| 605 | ([17533](https://github.com/civicrm/civicrm-core/pull/17533))** |
| 606 | |
| 607 | - **[REF] Remove calls to, and deprecate, unhandled function |
| 608 | ([17499](https://github.com/civicrm/civicrm-core/pull/17499))** |
| 609 | |
| 610 | - **[REF] Remove handling for 2 fields not on the form |
| 611 | ([17504](https://github.com/civicrm/civicrm-core/pull/17504))** |
| 612 | |
| 613 | - **[REF] Remove some instances of fatal in BAO classes |
| 614 | ([17536](https://github.com/civicrm/civicrm-core/pull/17536))** |
| 615 | |
| 616 | - **[REF] Access the method not the property directly to check if a payment |
| 617 | processor supports recurring |
| 618 | ([17602](https://github.com/civicrm/civicrm-core/pull/17602))** |
| 619 | |
| 620 | - **[REF] Ensure that our custom error handler is called when jQuery validates |
| 621 | and expand any collapsed accordions that are hiding required fields that |
| 622 | haven't been filled in |
| 623 | ([17673](https://github.com/civicrm/civicrm-core/pull/17673))** |
| 624 | |
| 625 | - **[REF] Consolidate code in processMembership |
| 626 | ([17611](https://github.com/civicrm/civicrm-core/pull/17611))** |
| 627 | |
| 628 | - **[REF] Cleanup function for retrieving contact types. |
| 629 | ([17676](https://github.com/civicrm/civicrm-core/pull/17676))** |
| 630 | |
| 631 | - **[REF] Fix Javascript syntax error |
| 632 | ([17678](https://github.com/civicrm/civicrm-core/pull/17678))** |
| 633 | |
| 634 | - **[REF] Fix jQuery error message display on select2 field validation |
| 635 | ([17671](https://github.com/civicrm/civicrm-core/pull/17671))** |
| 636 | |
| 637 | - **[REF] Fix allowing users to clear values for raido custom fields when not |
| 638 | required ([17670](https://github.com/civicrm/civicrm-core/pull/17670))** |
| 639 | |
| 640 | - **[REF] Extract getTestTrxnID |
| 641 | ([17642](https://github.com/civicrm/civicrm-core/pull/17642))** |
| 642 | |
| 643 | - **Update Flexmailer to be PHP7.4 compatible |
| 644 | ([17779](https://github.com/civicrm/civicrm-core/pull/17779), [17660](https://github.com/civicrm/civicrm-core/pull/17660))** |
| 645 | |
| 646 | - **[REF] Ensure that the Manual Payment Processor sets the _paymentProcessor |
| 647 | variable like other Processors to fix issues in PHP7.4 and UnitTests |
| 648 | ([17648](https://github.com/civicrm/civicrm-core/pull/17648))** |
| 649 | |
| 650 | - **[REF] Fix PHP7.4 Test fails when we are accessing array keys when the value |
| 651 | is not an array |
| 652 | ([17649](https://github.com/civicrm/civicrm-core/pull/17649))** |
| 653 | |
| 654 | - **[REF] Fix parts of code where curly brackets were being used for array or |
| 655 | string access which is deprecated in PHP7.4 |
| 656 | ([17647](https://github.com/civicrm/civicrm-core/pull/17647))** |
| 657 | |
| 658 | - **[REF] Fix issue with using array access tools on NULL values |
| 659 | ([17600](https://github.com/civicrm/civicrm-core/pull/17600))** |
| 660 | |
| 661 | - **[REF] Replace incorrect usage of array_key_exists with property_exists in |
| 662 | Group BAO Class |
| 663 | ([17604](https://github.com/civicrm/civicrm-core/pull/17604))** |
| 664 | |
| 665 | - **[REF] Add test for renewing old expired membership via form |
| 666 | ([17564](https://github.com/civicrm/civicrm-core/pull/17564))** |
| 667 | |
| 668 | - **[REF] Update packages to work with PHP7.4 |
| 669 | ([17598](https://github.com/civicrm/civicrm-core/pull/17598))** |
| 670 | |
| 671 | - **[REF] Fix another couple of uses of array_key_exists when the variable being |
| 672 | checked is an object |
| 673 | ([17601](https://github.com/civicrm/civicrm-core/pull/17601))** |
| 674 | |
| 675 | - **[REF] Remove deprecated methods of booting Drupal container and getting |
| 676 | Drupal timezone information |
| 677 | ([17522](https://github.com/civicrm/civicrm-core/pull/17522))** |
| 678 | |
| 679 | - **[REF] Fix some additional issues where curly braces were being used to |
| 680 | access string or array offsets |
| 681 | ([17599](https://github.com/civicrm/civicrm-core/pull/17599))** |
| 682 | |
| 683 | - **[NFC] Update existing APIv3 MembershipType Tests to also test against APIv4 |
| 684 | as appropriate ([17528](https://github.com/civicrm/civicrm-core/pull/17528))** |
| 685 | |
| 686 | - **[NFC] cleanup docblocks in CRM_Utils_JS |
| 687 | ([17714](https://github.com/civicrm/civicrm-core/pull/17714))** |
| 688 | |
| 689 | - **[NFC] Fix some outdated wiki links |
| 690 | ([17739](https://github.com/civicrm/civicrm-core/pull/17739))** |
| 691 | |
| 692 | - **[NFC] Fix contributor key for Lighthouse Consulting and Design |
| 693 | ([17727](https://github.com/civicrm/civicrm-core/pull/17727))** |
| 694 | |
| 695 | - **[NFC] Fix unit test failure on MySQL 8 due to ordering issue |
| 696 | ([17674](https://github.com/civicrm/civicrm-core/pull/17674))** |
| 697 | |
| 698 | - **[NFC] Remove instances where html is passed to crmMoney |
| 699 | ([17612](https://github.com/civicrm/civicrm-core/pull/17612))** |
| 700 | |
| 701 | - **[NFC] Add assertions to existing test to lock in current behaviour |
| 702 | ([17605](https://github.com/civicrm/civicrm-core/pull/17605))** |
| 703 | |
| 704 | - **[NFC] Update mocking to use getMockBuilder instead instead of createMock |
| 705 | ([17606](https://github.com/civicrm/civicrm-core/pull/17606))** |
| 706 | |
| 707 | - **[NFC] Formatting cleanup on contribution/recur templates |
| 708 | ([17603](https://github.com/civicrm/civicrm-core/pull/17603))** |
| 709 | |
| 710 | - **[NFC] Minor code cleanup |
| 711 | ([17566](https://github.com/civicrm/civicrm-core/pull/17566))** |
| 712 | |
| 713 | - **MembershipRenewalTest - Fix failure |
| 714 | ([17830](https://github.com/civicrm/civicrm-core/pull/17830))** |
| 715 | |
| 716 | - **[REF] Fix regression where adding any date based field onto a profile |
| 717 | triggers an error date preferences not configured when previewing the profile |
| 718 | ([17973](https://github.com/civicrm/civicrm-core/pull/17973))** |
| 719 | |
| 720 | - **[NFC] Port some recent test fixes from master to 5.28 |
| 721 | ([18053](https://github.com/civicrm/civicrm-core/pull/18053))** |
| 722 | |
| 723 | ## <a name="credits"></a>Credits |
| 724 | |
| 725 | This release was developed by the following code authors: |
| 726 | |
| 727 | AGH Strategies - Alice Frumin, Andie Hunt; British Humanist Association - |
| 728 | Andrew West; Christian Wach; Circle Interactive - Pradeep Nayak; CiviCRM - |
| 729 | Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; CompuCorp - Ivan; Coop |
| 730 | SymbioTIC - Mathieu Lutfy, Samuel Vanhove; Dave D; Dietermartens; ES-Progress - |
| 731 | Sandor Semsey; Flinders University of South Australia - Tom Anderson; Fuzion - |
| 732 | Jitendra Purohit; JMA Consulting - Seamus Lee; Lighthouse Consulting and |
| 733 | Design- Brian Shaughnessy; Marcin Lewandowski; Megaphone Technology Consulting - |
| 734 | Jon Goldberg; MJW Consulting - Matthew Wire; Tadpole Collective - Kevin |
| 735 | Cristiano; Wikimedia Foundation - Eileen McNaughton |
| 736 | |
| 737 | Most authors also reviewed code for this release; in addition, the following |
| 738 | reviewers contributed their comments: |
| 739 | |
| 740 | a-n The Artists Information Company - William Mortada; Agileware - Francis |
| 741 | Whittle, Justin Freeman; Andrew Thompson; Artful Robot - Rich Lott; Betty |
| 742 | Dolfing; Blackfly Solutions - Alan Dixon; CiviCoop - Jaap Jansma; Fuzion - Luke |
| 743 | Stewart, Peter Davis; JMA Consulting - Joe Murray; MJCO - Mikey O'Toole; Semper |
| 744 | IT - Karin Gerritsen; Squiffle Consulting - Aidan Saunders; Third Sector Design: |
| 745 | Eriol Fox; Timbsoft Technologies - Tunbola Ogunwande |
| 746 | |
| 747 | ## <a name="feedback"></a>Feedback |
| 748 | |
| 749 | These release notes are edited by Alice Frumin and Andie Hunt. If you'd like |
| 750 | to provide feedback on them, please log in to https://chat.civicrm.org/civicrm |
| 751 | and contact `@agh1`. |