commerce_license-8.x-2.x-dev/src/Plugin/Commerce/LicenseType/Role.php
src/Plugin/Commerce/LicenseType/Role.php
<?php namespace Drupal\commerce_license\Plugin\Commerce\LicenseType; use Drupal\commerce\EntityHelper; use Drupal\commerce_license\Entity\LicenseInterface; use Drupal\commerce_license\ExistingRights\ExistingRightsResult; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\entity\BundleFieldDefinition; use Drupal\user\RoleInterface; use Drupal\user\UserInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a license type which grants one or more roles. * * @CommerceLicenseType( * id = "role", * label = @Translation("Role"), * ) * * @phpstan-consistent-constructor */ class Role extends LicenseTypeBase implements ExistingRightsFromConfigurationCheckingInterface, GrantedEntityLockingInterface { /** * The entity type manager service. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { $instance = new static($configuration, $plugin_id, $plugin_definition); $instance->entityTypeManager = $container->get('entity_type.manager'); return $instance; } /** * {@inheritdoc} */ public function buildLabel(LicenseInterface $license) { $args = [ '@role' => $license->license_role->entity->label(), ]; return $this->t('@role role license', $args); } /** * {@inheritdoc} */ public function defaultConfiguration() { return [ 'license_role' => '', ] + parent::defaultConfiguration(); } /** * {@inheritdoc} */ public function grantLicense(LicenseInterface $license) { // Get the role ID that this license grants. $role_id = $license->license_role->target_id; // Get the owner of the license and grant them the role. $owner = $license->getOwner(); if (!$owner->isAnonymous()) { $owner->addRole($role_id); $owner->save(); } } /** * {@inheritdoc} */ public function revokeLicense(LicenseInterface $license) { // Get the role ID that this license grants. $role_id = $license->license_role->first()->target_id; // Get the owner of the license and remove that role. $owner = $license->getOwner(); if (!$owner->isAnonymous()) { $owner->removeRole($role_id); $owner->save(); } } /** * {@inheritdoc} */ public function checkUserHasExistingRights(UserInterface $user) { $role_id = $this->configuration['license_role']; $role = $this->entityTypeManager->getStorage('user_role')->load($role_id); return ExistingRightsResult::rightsExistIf( $user->hasRole($role_id), $this->t('You already have the @role-label role.', [ '@role-label' => $role->label(), ]), $this->t('User @user already has the @role-label role.', [ '@user' => $user->getDisplayName(), '@role-label' => $role->label(), ]) ); } /** * {@inheritdoc} */ public function alterEntityOwnerForm(array &$form, FormStateInterface $form_state, string $form_id, LicenseInterface $license, EntityInterface $form_entity) { if ($form_entity->getEntityTypeId() !== 'user') { // Only act on a user form. return; } $licensed_role_id = $license->license_role->target_id; $form['account']['roles'][$licensed_role_id]['#disabled'] = TRUE; $form['account']['roles'][$licensed_role_id]['#default_value'] = TRUE; $form['account']['roles'][$licensed_role_id]['#description'] = $this->t('This role is granted by a license. It cannot be removed manually.'); } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $roles = $this->entityTypeManager->getStorage('user_role')->loadMultiple(); // Skip the built-in roles. unset($roles[RoleInterface::ANONYMOUS_ID], $roles[RoleInterface::AUTHENTICATED_ID]); // Remove the admin role if it exists. // @todo consider removing any role that has "is_admin" set. unset($roles['administrator']); // If no licensable roles exist, display an error message. // A radios element without options will result in an // "Illegal choice detected" error. if (!$roles) { $form['error'] = [ '#markup' => $this->t('No licensable roles can be configured, please review your configuration.'), ]; return $form; } $options = EntityHelper::extractLabels($roles); $form['license_role'] = [ '#type' => 'radios', '#title' => $this->t('Licensed role'), '#options' => EntityHelper::extractLabels($roles), '#default_value' => isset($options[$this->configuration['license_role']]) ? $this->configuration['license_role'] : key($options), '#required' => TRUE, ]; return $form; } /** * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {} /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { $values = $form_state->getValue($form['#parents']); if (!empty($values['license_role'])) { $this->configuration['license_role'] = $values['license_role']; } } /** * {@inheritdoc} */ public function buildFieldDefinitions() { $fields = parent::buildFieldDefinitions(); $fields['license_role'] = BundleFieldDefinition::create('entity_reference') ->setLabel($this->t('Role')) ->setDescription($this->t('The role this product grants access to.')) ->setCardinality(1) ->setRequired(TRUE) ->setSetting('target_type', 'user_role') ->setDisplayOptions('form', [ 'type' => 'options_select', ]) ->setDisplayOptions('view', [ 'label' => 'inline', 'type' => 'entity_reference_label', 'weight' => 1, 'settings' => [ 'link' => TRUE, ], ]); return $fields; } }