diff --git a/config/schema/rng.views.schema.yml b/config/schema/rng.views.schema.yml new file mode 100644 index 0000000..51ec703 --- /dev/null +++ b/config/schema/rng.views.schema.yml @@ -0,0 +1,10 @@ +views.field.rng_event_register: + type: views_field + label: 'Event register link' + mapping: + text: + type: label + label: 'Text to display' + registration_type: + type: string + label: 'An optional registration type' diff --git a/rng.views.inc b/rng.views.inc new file mode 100644 index 0000000..8c87f3d --- /dev/null +++ b/rng.views.inc @@ -0,0 +1,30 @@ +getEventTypes(); + foreach (array_keys($event_types) as $entity_type) { + $definition = $entity_type_manager->getDefinition($entity_type); + if ($base_table = $definition->getBaseTable()) { + $data[$base_table]['rng_event_register'] = [ + 'field' => [ + 'title' => t('Register for event'), + 'help' => t('Provides a link to register for the event.'), + 'id' => 'rng_event_register', + ], + ]; + } + } + + return $data; +} diff --git a/src/Plugin/views/field/LinkRegister.php b/src/Plugin/views/field/LinkRegister.php new file mode 100644 index 0000000..57cead9 --- /dev/null +++ b/src/Plugin/views/field/LinkRegister.php @@ -0,0 +1,73 @@ + '']; + return $options; + } + + /** + * {@inheritdoc} + */ + public function buildOptionsForm(&$form, FormStateInterface $form_state) { + parent::buildOptionsForm($form, $form_state); + + $registration_types = []; + foreach (RegistrationType::loadMultiple() as $registration_type) { + $registration_types[$registration_type->id()] = $registration_type->label(); + } + + $form['registration_type'] = [ + '#type' => 'select', + '#title' => $this->t('Registration type'), + '#default_value' => $this->options['registration_type'], + '#options' => $registration_types, + '#empty_option' => $this->t('- Display all registration types -'), + ]; + } + + /** + * {@inheritdoc} + */ + protected function getUrlInfo(ResultRow $row) { + $event = $this->getEntity($row); + $route_parameters[$event->getEntityTypeId()] = $event->id(); + + $registration_type = $this->options['registration_type']; + if ($registration_type && RegistrationType::load($registration_type)) { + $route = 'rng.event.' . $event->getEntityTypeId() . '.register'; + $route_parameters['registration_type'] = $registration_type; + } + else { + $route = 'rng.event.' . $event->getEntityTypeId() . '.register.type_list'; + } + + return Url::fromRoute($route, $route_parameters); + } + + /** + * {@inheritdoc} + */ + protected function getDefaultLabel() { + return $this->t('Register'); + } + +} diff --git a/tests/modules/rng_test_views/rng_test_views.info.yml b/tests/modules/rng_test_views/rng_test_views.info.yml new file mode 100644 index 0000000..559172a --- /dev/null +++ b/tests/modules/rng_test_views/rng_test_views.info.yml @@ -0,0 +1,7 @@ +name: 'RNG test views' +type: module +description: 'Provides views for RNG Views tests.' +dependencies: + - rng + - views +core: '8.x' diff --git a/tests/modules/rng_test_views/test_views/views.view.test_rng.yml b/tests/modules/rng_test_views/test_views/views.view.test_rng.yml new file mode 100644 index 0000000..078bb5c --- /dev/null +++ b/tests/modules/rng_test_views/test_views/views.view.test_rng.yml @@ -0,0 +1,33 @@ +langcode: en +status: true +dependencies: + module: + - rng + - entity_test +id: test_rng +label: test_rng +module: views +description: '' +tag: '' +base_table: entity_test +base_field: id +core: 8.x +display: + default: + display_plugin: default + display_title: Master + id: default + position: 0 + display_options: + defaults: + fields: false + pager: false + sorts: false + row: + type: fields + fields: { } + pager: + options: + offset: 0 + type: none + sorts: { } diff --git a/tests/src/Kernel/Views/RngViewsTest.php b/tests/src/Kernel/Views/RngViewsTest.php new file mode 100644 index 0000000..8a6f5bf --- /dev/null +++ b/tests/src/Kernel/Views/RngViewsTest.php @@ -0,0 +1,166 @@ +eventManager = $this->container->get('rng.event_manager'); + + $this->installConfig(['field']); + $this->installConfig(['rng']); + $this->installEntitySchema('user'); + $this->installEntitySchema('entity_test'); + $this->installEntitySchema('registration'); + $this->installEntitySchema('registrant'); + $this->installEntitySchema('rng_rule'); + $this->installEntitySchema('rng_rule_component'); + + ViewTestData::createTestViews(get_class($this), ['rng_test_views']); + + $this->registrationType = $this->createRegistrationType(); + $this->createEventType('entity_test', 'entity_test'); + + $this->view = Views::getView('test_rng'); + $this->view->setDisplay(); + } + + /** + * Test register link field. + */ + public function testRegisterLink() { + $event = $this->createEvent()->getEvent(); + $user1 = $this->drupalCreateUser(['rng register self']); + $this->setCurrentUser($user1); + $this->createUserRoleRules([], ['create' => TRUE]); + + $this->view->displayHandlers->get('default')->overrideOption('fields', [ + 'rng_event_register' => [ + 'table' => 'entity_test', + 'field' => 'rng_event_register', + 'id' => 'rng_event_register', + 'plugin_id' => 'rng_event_register', + 'entity_type' => 'entity_test', + ], + ]); + $this->view->save(); + + $this->view->preview(); + $expected = Link::createFromRoute(t('Register'), 'rng.event.entity_test.register.type_list', [ + 'entity_test' => $event->id(), + ])->toString(); + $actual = $this->view->style_plugin->getField(0, 'rng_event_register'); + $this->assertEquals($expected, $actual); + } + + /** + * Test register link field with a registration type. + */ + public function testRegisterLinkWithRegistrationType() { + $event = $this->createEvent()->getEvent(); + $user1 = $this->drupalCreateUser(['rng register self']); + $this->setCurrentUser($user1); + $this->createUserRoleRules([], ['create' => TRUE]); + + $this->view->displayHandlers->get('default')->overrideOption('fields', [ + 'rng_event_register' => [ + 'table' => 'entity_test', + 'field' => 'rng_event_register', + 'id' => 'rng_event_register', + 'plugin_id' => 'rng_event_register', + 'entity_type' => 'entity_test', + 'registration_type' => $this->registrationType->id(), + ], + ]); + $this->view->save(); + + $this->view->preview(); + $expected = Link::createFromRoute(t('Register'), 'rng.event.entity_test.register', [ + 'entity_test' => $event->id(), + 'registration_type' => $this->registrationType->id(), + ])->toString(); + $actual = $this->view->style_plugin->getField(0, 'rng_event_register'); + $this->assertEquals($expected, $actual); + } + + /** + * Test register link field with no access produces empty field. + */ + public function testRegisterLinkNoAccess() { + $this->createEvent(); + $user1 = $this->drupalCreateUser(['rng register self']); + $this->setCurrentUser($user1); + $this->createUserRoleRules([], []); + + $this->view->displayHandlers->get('default')->overrideOption('fields', [ + 'rng_event_register' => [ + 'table' => 'entity_test', + 'field' => 'rng_event_register', + 'id' => 'rng_event_register', + 'plugin_id' => 'rng_event_register', + 'entity_type' => 'entity_test', + ], + ]); + $this->view->save(); + + $this->view->preview(); + $expected = ''; + $actual = $this->view->style_plugin->getField(0, 'rng_event_register'); + $this->assertEquals($expected, $actual); + } + +}