Skip to content

Mailing - Support custom data in tokens - #36285

Draft
colemanw wants to merge 2 commits into
civicrm:masterfrom
colemanw:mailingTokensCustom
Draft

Mailing - Support custom data in tokens#36285
colemanw wants to merge 2 commits into
civicrm:masterfrom
colemanw:mailingTokensCustom

Conversation

@colemanw

@colemanw colemanw commented Jul 21, 2026

Copy link
Copy Markdown
Member

Overview

Building on #36280 this supports api4-style custom field tokens in mailings, including pseudoconstants like {mailing.mailing_extra_info.priority_level:label} and joins to entity reference fields like {mailing.mailing_extra_info.assigned_author.display_name}

For https://lab.civicrm.org/dev/core/-/work_items/6288

Open Questions

  • Is this how we want Api4-style tokens to look?
  • Is this duplicating any work already done on Api4-style tokens?
  • Are pseudoconstant suffixes already supported by tokens? For core fields only or for custom fields too?

Switches mailingTokens to extend CRM_Core_EntityTokens instead of the base class, to get the benefit of bulk prefetching and custom field support.
@civibot

civibot Bot commented Jul 21, 2026

Copy link
Copy Markdown

🤖 Thank you for contributing to CiviCRM! ❤️ We will need to test and review this PR. 👷

Introduction for new contributors...
  • If this is your first PR, an admin will greenlight automated testing with the command ok to test or add to whitelist.
  • A series of tests will automatically run. You can see the results at the bottom of this page (if there are any problems, it will include a link to see what went wrong).
  • A demo site will be built where anyone can try out a version of CiviCRM that includes your changes.
  • If this process needs to be repeated, an admin will issue the command test this please to rerun tests and build a new demo site.
  • Before this PR can be merged, it needs to be reviewed. Please keep in mind that reviewers are volunteers, and their response time can vary from a few hours to a few weeks depending on their availability and their knowledge of this particular part of CiviCRM.
  • A great way to speed up this process is to "trade reviews" with someone - find an open PR that you feel able to review, and leave a comment like "I'm reviewing this now, could you please review mine?" (include a link to yours). You don't have to wait for a response to get started (and you don't have to stop at one!) the more you review, the faster this process goes for everyone 😄
  • To ensure that you are credited properly in the final release notes, please add yourself to contributor-key.yml
  • For more information about contributing, see CONTRIBUTING.md.
PR commands & links...
  • /rebase <branch-name> will rebase your branch and change the base of the PR.
  • /squash will combine all commits (keeping only the first commit messsage).
  • /port <branch-name> will create a copy of this PR against a different branch.
  • /lintroll will automatically fix linting errors, amending commits as needed.
  • retest this please will rerun the tests and rebuild the demo site.
  • 📖 Review standards
  • 🗒️ Review template (brief or verbose)

➡️ Online demo of this PR 🔗

@civibot civibot Bot added the master label Jul 21, 2026
@colemanw colemanw changed the title Mailing tokens custom Mailing - Support custom data in tokens Jul 21, 2026
Supports api4-style custom data
@colemanw
colemanw force-pushed the mailingTokensCustom branch from 01932c8 to 477218c Compare July 22, 2026 02:21
@colemanw
colemanw marked this pull request as draft July 23, 2026 02:39
Comment thread CRM/Mailing/Tokens.php
class CRM_Mailing_Tokens extends \Civi\Token\AbstractTokenSubscriber {
class CRM_Mailing_Tokens extends CRM_Core_EntityTokens {

use \Civi\Token\Api4CustomTokenTrait;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the trait would be included directly in the EntityTokens rather than here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually I don't even know I'd separate into a trait - it feels like part of the EntityTokens logic

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comments here

if ($field['type'] === 'Custom') {
// Convert to apiv3 style for now. Later we can add v4 with
// portable naming & support for labels/ dates etc so let's leave
// the space open for that.
// Not the existing QuickForm widget has handling for the custom field
// format based on the title using this syntax.
$parts = explode(': ', $field['label'], 2);
$field['title'] = "{$parts[1]} :: {$parts[0]}";
$tokenName = 'custom_' . $field['custom_field_id'];
$tokensMetadata[$tokenName] = $field;
return;

@eileenmcnaughton

Copy link
Copy Markdown
Contributor

So yes - that looks about right - we already support

{contribution.payment_instrument_id:label} - we ALSO support
{contribution.payment_instrument_id:name} but the code doesn't advertise it via listTokens() due to the perceived audience.

I think the rendering side of it might 'almost' work in EntityTokens already but see

if ($field['type'] === 'Custom') {
// Convert to apiv3 style for now. Later we can add v4 with
// portable naming & support for labels/ dates etc so let's leave
// the space open for that.
// Not the existing QuickForm widget has handling for the custom field
// format based on the title using this syntax.
$parts = explode(': ', $field['label'], 2);
$field['title'] = "{$parts[1]} :: {$parts[0]}";
$tokenName = 'custom_' . $field['custom_field_id'];
$tokensMetadata[$tokenName] = $field;
return;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants