diff --git a/composer.json b/composer.json index 49409af..a321d15 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "source": "http://cgit.drupalcode.org/recurring_events" }, "require": { - "drupal/field_inheritance": "^2" + "drupal/field_inheritance": "^2", + "drupal/computed_field_plugin": "^1.3" } } diff --git a/modules/recurring_events_registration/recurring_events_registration.info.yml b/modules/recurring_events_registration/recurring_events_registration.info.yml index fa24a1b..292e661 100644 --- a/modules/recurring_events_registration/recurring_events_registration.info.yml +++ b/modules/recurring_events_registration/recurring_events_registration.info.yml @@ -5,3 +5,4 @@ core_version_requirement: ^8.9 || ^9 package: 'Recurring Events' dependencies: - recurring_events:recurring_events + - computed_field_plugin:computed_field_plugin diff --git a/modules/recurring_events_registration/recurring_events_registration.module b/modules/recurring_events_registration/recurring_events_registration.module index 6c8d49f..9dea5ea 100644 --- a/modules/recurring_events_registration/recurring_events_registration.module +++ b/modules/recurring_events_registration/recurring_events_registration.module @@ -67,6 +67,25 @@ function recurring_events_registration_entity_base_field_info_alter(&$fields, En } } +/** + * Implements hook_entity_base_field_info(). + */ +function recurring_events_registration_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) { + if ($entity_type->id() === 'eventinstance') { + // Add computed fields for availability, registration and waitlist counts. + foreach (['availability', 'registration', 'waitlist'] as $count_type) { + $field_name = $count_type . '_count'; + $class_name = ucfirst($count_type) . 'Count'; + $label = ucfirst($count_type) . ' count'; + $fields[$field_name] = BaseFieldDefinition::create($field_name) + ->setName($field_name) + ->setLabel(t($label)) + ->setComputed(TRUE) + ->setClass("\\Drupal\\recurring_events_registration\\Plugin\\ComputedField\\$class_name"); + } + } +} + /** * Implements hook_theme(). */ diff --git a/modules/recurring_events_registration/src/Plugin/ComputedField/AvailabilityCount.php b/modules/recurring_events_registration/src/Plugin/ComputedField/AvailabilityCount.php new file mode 100644 index 0000000..47eb2de --- /dev/null +++ b/modules/recurring_events_registration/src/Plugin/ComputedField/AvailabilityCount.php @@ -0,0 +1,38 @@ +getEntity(); + + return [ + 'value' => $this->getRegistrationCreationService($entity)->retrieveAvailability(), + ]; + } + +} diff --git a/modules/recurring_events_registration/src/Plugin/ComputedField/RegistrationCount.php b/modules/recurring_events_registration/src/Plugin/ComputedField/RegistrationCount.php new file mode 100644 index 0000000..3cd37e9 --- /dev/null +++ b/modules/recurring_events_registration/src/Plugin/ComputedField/RegistrationCount.php @@ -0,0 +1,38 @@ +getEntity(); + + return [ + 'value' => count($this->getRegistrationCreationService($entity)->retrieveRegisteredParties(TRUE, FALSE)), + ]; + } + +} diff --git a/modules/recurring_events_registration/src/Plugin/ComputedField/WaitlistCount.php b/modules/recurring_events_registration/src/Plugin/ComputedField/WaitlistCount.php new file mode 100644 index 0000000..ed8592d --- /dev/null +++ b/modules/recurring_events_registration/src/Plugin/ComputedField/WaitlistCount.php @@ -0,0 +1,38 @@ +getEntity(); + + return [ + 'value' => count($this->getRegistrationCreationService($entity)->retrieveRegisteredParties(FALSE, TRUE)), + ]; + } + +} diff --git a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationAvailability.php b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationAvailability.php index 1723571..4dcd551 100644 --- a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationAvailability.php +++ b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationAvailability.php @@ -4,8 +4,6 @@ namespace Drupal\recurring_events_registration\Plugin\views\field; use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\ResultRow; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Drupal\recurring_events_registration\RegistrationCreationService; /** * Field handler to show the availability of registrations for event instances. @@ -16,45 +14,6 @@ use Drupal\recurring_events_registration\RegistrationCreationService; */ class EventInstanceRegistrationAvailability extends FieldPluginBase { - /** - * The registration creation service. - * - * @var \Drupal\recurring_events_registration\RegistrationCreationService - */ - protected $registrationCreationService; - - /** - * Constructs a new EventInstanceRegistrationAvailability object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin ID for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\recurring_events_registration\RegistrationCreationService $registration_creation_service - * The registration creation service. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RegistrationCreationService $registration_creation_service) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - - $this->registrationCreationService = $registration_creation_service; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('recurring_events_registration.creation_service') - ); - } - /** * {@inheritdoc} */ @@ -67,8 +26,8 @@ class EventInstanceRegistrationAvailability extends FieldPluginBase { */ public function render(ResultRow $values) { $event = $values->_entity; - $this->registrationCreationService->setEventInstance($event); - $capacity = (int) $this->registrationCreationService->retrieveAvailability(); + $capacity = $event->get('availability_count')->getValue()[0]['value'] ?? 0; + if ($capacity === -1) { $capacity = $this->t('Unlimited'); } diff --git a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationCount.php b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationCount.php index f82d7a7..08b1906 100644 --- a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationCount.php +++ b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceRegistrationCount.php @@ -4,8 +4,6 @@ namespace Drupal\recurring_events_registration\Plugin\views\field; use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\ResultRow; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Drupal\recurring_events_registration\RegistrationCreationService; /** * Field handler to show the count of registrations for event instances. @@ -16,45 +14,6 @@ use Drupal\recurring_events_registration\RegistrationCreationService; */ class EventInstanceRegistrationCount extends FieldPluginBase { - /** - * The registration creation service. - * - * @var \Drupal\recurring_events_registration\RegistrationCreationService - */ - protected $registrationCreationService; - - /** - * Constructs a new EventInstanceRegistrationCount object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin ID for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\recurring_events_registration\RegistrationCreationService $registration_creation_service - * The registration creation service. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RegistrationCreationService $registration_creation_service) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - - $this->registrationCreationService = $registration_creation_service; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('recurring_events_registration.creation_service') - ); - } - /** * {@inheritdoc} */ @@ -67,8 +26,7 @@ class EventInstanceRegistrationCount extends FieldPluginBase { */ public function render(ResultRow $values) { $event = $values->_entity; - $this->registrationCreationService->setEventInstance($event); - return count($this->registrationCreationService->retrieveRegisteredParties(TRUE, FALSE)); + return $event->get('registration_count')->getValue()[0]['value'] ?? 0; } } diff --git a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceWaitlistCount.php b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceWaitlistCount.php index fb0b7ec..a432fb8 100644 --- a/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceWaitlistCount.php +++ b/modules/recurring_events_registration/src/Plugin/views/field/EventInstanceWaitlistCount.php @@ -4,8 +4,6 @@ namespace Drupal\recurring_events_registration\Plugin\views\field; use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\ResultRow; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Drupal\recurring_events_registration\RegistrationCreationService; /** * Field handler to show the count of waitlisted registrants. @@ -16,45 +14,6 @@ use Drupal\recurring_events_registration\RegistrationCreationService; */ class EventInstanceWaitlistCount extends FieldPluginBase { - /** - * The registration creation service. - * - * @var \Drupal\recurring_events_registration\RegistrationCreationService - */ - protected $registrationCreationService; - - /** - * Constructs a new EventInstanceWaitlistCount object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin ID for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\recurring_events_registration\RegistrationCreationService $registration_creation_service - * The registration creation service. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RegistrationCreationService $registration_creation_service) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - - $this->registrationCreationService = $registration_creation_service; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('recurring_events_registration.creation_service') - ); - } - /** * {@inheritdoc} */ @@ -67,8 +26,7 @@ class EventInstanceWaitlistCount extends FieldPluginBase { */ public function render(ResultRow $values) { $event = $values->_entity; - $this->registrationCreationService->setEventInstance($event); - return count($this->registrationCreationService->retrieveRegisteredParties(FALSE, TRUE)); + return $event->get('waitlist_count')->getValue()[0]['value'] ?? 0; } } diff --git a/modules/recurring_events_registration/src/Plugin/views/filter/EventInstanceRegistrationAvailability.php b/modules/recurring_events_registration/src/Plugin/views/filter/EventInstanceRegistrationAvailability.php index 21bb21d..2fff968 100644 --- a/modules/recurring_events_registration/src/Plugin/views/filter/EventInstanceRegistrationAvailability.php +++ b/modules/recurring_events_registration/src/Plugin/views/filter/EventInstanceRegistrationAvailability.php @@ -4,8 +4,6 @@ namespace Drupal\recurring_events_registration\Plugin\views\filter; use Drupal\views\Plugin\views\filter\FilterPluginBase; use Drupal\Core\Form\FormStateInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Drupal\recurring_events_registration\RegistrationCreationService; /** * Filter handler to show the availability of registrations for event instances. @@ -16,44 +14,6 @@ use Drupal\recurring_events_registration\RegistrationCreationService; */ class EventInstanceRegistrationAvailability extends FilterPluginBase { - /** - * The registration creation service. - * - * @var \Drupal\recurring_events_registration\RegistrationCreationService - */ - protected $registrationCreationService; - - /** - * Constructs a new EventInstanceRegistrationAvailability object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin ID for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\recurring_events_registration\RegistrationCreationService $registration_creation_service - * The registration creation service. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RegistrationCreationService $registration_creation_service) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->registrationCreationService = $registration_creation_service; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('recurring_events_registration.creation_service') - ); - } - /** * {@inheritdoc} */ @@ -200,8 +160,7 @@ class EventInstanceRegistrationAvailability extends FilterPluginBase { if (!empty($view->result)) { foreach ($view->result as $key => $result) { - $this->registrationCreationService->setEventInstance($result->_entity); - $availability = $this->registrationCreationService->retrieveAvailability(); + $availability = $result->_entity->get('availability_count')->getValue()[0]['value'] ?? -1; switch ($available) { // Filtering for available events means unlimited availability of an diff --git a/modules/recurring_events_registration/src/Traits/RegistrationCreationServiceTrait.php b/modules/recurring_events_registration/src/Traits/RegistrationCreationServiceTrait.php new file mode 100644 index 0000000..fa730b4 --- /dev/null +++ b/modules/recurring_events_registration/src/Traits/RegistrationCreationServiceTrait.php @@ -0,0 +1,36 @@ +registration_creation_service) { + $this->registration_creation_service = \Drupal::service('recurring_events_registration.creation_service'); + $this->registration_creation_service->setEventInstance($entity); + } + + return $this->registration_creation_service; + } + +}