Skip to content

Alter and extend

Membership Term plugins are discovered automatically and can be altered by other modules.

Plugin discovery

Plugins live in src/Plugin/MembershipTerm/ and are annotated with the PHP attribute:

#[MembershipTerm(
  id: "my_term",
  label: new TranslatableMarkup("My term"),
  allowOverrideStartDate: TRUE,
)]

Attribute class: Drupal\crm_membership\Attribute\MembershipTerm
Interface: Drupal\crm_membership\Plugin\MembershipTermInterface
Base class: Drupal\crm_membership\Plugin\MembershipTermBase

Plugin manager

Service ID: plugin.manager.crm_membership_term
Class: Drupal\crm_membership\Plugin\MembershipTermManager

The manager extends DefaultPluginManager and:

  • Discovers plugins in the Plugin/MembershipTerm subdirectory
  • Uses cache bin crm_membership_term_plugins
  • Registers alter hook crm_membership_term_info

Getting a plugin instance

$manager = \Drupal::service('plugin.manager.crm_membership_term');
$config = $membership_type->getMembershipTermPluginConfig();
$plugin = $manager->createInstance($membership_type->getMembershipTermPluginId(), $config);
$plugin->setMembership($membership);

The Membership entity’s getMembershipTerm() method performs this binding automatically.

hook_crm_membership_term_info()

Implement hook_crm_membership_term_info() in your module’s .module file (or use a hook class) to alter plugin definitions after discovery:

/**
 * Implements hook_crm_membership_term_info().
 */
function my_module_crm_membership_term_info(array &$definitions): void {
  if (isset($definitions['fixed_duration'])) {
    $definitions['fixed_duration']['label'] = t('Calendar year (custom label)');
  }
}

Alterations affect the Membership Type form plugin dropdown and any code using getDefinitions().

Listing definitions

$definitions = \Drupal::service('plugin.manager.crm_membership_term')->getDefinitions();
foreach ($definitions as $id => $definition) {
  // $definition['label'], $definition['id'], etc.
}