Skip to content

Commit

Permalink
Added views "register" link fields
Browse files Browse the repository at this point in the history
Added register for event views link field for all event entity types.
Added tests for Views register links

Fixed dpi#78
  • Loading branch information
dpi committed Sep 3, 2016
1 parent 2d9dd03 commit aa90ccc
Show file tree
Hide file tree
Showing 6 changed files with 319 additions and 0 deletions.
10 changes: 10 additions & 0 deletions config/schema/rng.views.schema.yml
Original file line number Diff line number Diff line change
@@ -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'
30 changes: 30 additions & 0 deletions rng.views.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

/**
* @file
* Provide views data for RNG.
*/

/**
* Implements hook_views_data_alter().
*/
function rng_views_data_alter(&$data) {
$entity_type_manager = \Drupal::entityTypeManager();
$event_manager = \Drupal::service('rng.event_manager');

$event_types = $event_manager->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;
}
73 changes: 73 additions & 0 deletions src/Plugin/views/field/LinkRegister.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace Drupal\rng\Plugin\views\field;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\views\Plugin\views\field\LinkBase;
use Drupal\views\ResultRow;
use Drupal\rng\Entity\RegistrationType;

/**
* Field handler to present a link to register for an event.
*
* @ViewsField("rng_event_register")
*/
class LinkRegister extends LinkBase {

/**
* {@inheritdoc}
*/
protected function defineOptions() {
$options = parent::defineOptions();
$options['registration_type'] = ['default' => ''];
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');
}

}
7 changes: 7 additions & 0 deletions tests/modules/rng_test_views/rng_test_views.info.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: 'RNG test views'
type: module
description: 'Provides views for RNG Views tests.'
dependencies:
- rng
- views
core: '8.x'
33 changes: 33 additions & 0 deletions tests/modules/rng_test_views/test_views/views.view.test_rng.yml
Original file line number Diff line number Diff line change
@@ -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: { }
166 changes: 166 additions & 0 deletions tests/src/Kernel/Views/RngViewsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
<?php

namespace Drupal\Tests\rng\Kernel\Views;

use Drupal\Core\Link;
use Drupal\rng\Tests\RNGTestTrait;
use Drupal\simpletest\UserCreationTrait;
use Drupal\views\Tests\ViewTestData;
use Drupal\views\Views;
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;

/**
* Tests RNG field plugins.
*
* @group rng
*/
class RngViewsTest extends ViewsKernelTestBase {

use RNGTestTrait;
use UserCreationTrait {
createUser as drupalCreateUser;
}

/**
* {@inheritdoc}
*
*/
public static $modules = ['user', 'courier', 'unlimited_number', 'rng_test_views', 'rng', 'entity_test', 'field', 'dynamic_entity_reference', 'text'];

/**
* {@inheritdoc}
*/
public static $testViews = ['test_rng'];

/**
* The RNG event manager.
*
* @var \Drupal\rng\EventManagerInterface
*/
protected $eventManager;

/**
* A registration type for testing.
*
* @var \Drupal\rng\RegistrationTypeInterface
*/
protected $registrationType;

/**
* A view for testing.
*
* @var \Drupal\views\ViewExecutable
*/
protected $view;

/**
* @inheritdoc
*/
protected function setUp($import_test_views = TRUE) {
parent::setUp($import_test_views);

$this->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);
}

}

0 comments on commit aa90ccc

Please sign in to comment.