From 456ffe821f310bd37348fe9dba3c6c827f59d209 Mon Sep 17 00:00:00 2001 From: Owen Bush <ojb@ukhhf.co.uk> Date: Thu, 28 Feb 2019 08:09:03 -0700 Subject: [PATCH] Added the add form for an event series. --- recurring_events.info.yml | 5 ++ recurring_events.permissions.yml | 25 +++++++++ recurring_events.routing.yml | 55 ++++++++++++++++++ src/Entity/EventSeries.php | 2 +- src/EventSeriesAccessControlHandler.php | 50 +++++++++++++++++ src/Form/EventSeriesForm.php | 75 +++++++++++++++++++++++++ 6 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 recurring_events.info.yml create mode 100644 recurring_events.permissions.yml create mode 100644 recurring_events.routing.yml create mode 100644 src/EventSeriesAccessControlHandler.php create mode 100644 src/Form/EventSeriesForm.php diff --git a/recurring_events.info.yml b/recurring_events.info.yml new file mode 100644 index 00000000..088a9e9f --- /dev/null +++ b/recurring_events.info.yml @@ -0,0 +1,5 @@ +name: 'Recurring Events' +type: module +description: 'Events and Registration Management Module' +core: 8.x +package: 'Recurring Events' diff --git a/recurring_events.permissions.yml b/recurring_events.permissions.yml new file mode 100644 index 00000000..88013bd0 --- /dev/null +++ b/recurring_events.permissions.yml @@ -0,0 +1,25 @@ +# Event Series Entities. +add eventseries entity: + title: 'Add eventseries entity' + description: 'Create new event series entities' +view eventseries entity: + title: 'View eventseries entity' + description: 'View existing event series entities' +edit eventseries entity: + title: 'Edit eventseries entity' + description: 'Modify existing event series entities' +delete eventseries entity: + title: 'Delete eventseries entity' + description: 'Delete existing event series entities' +clone eventseries entity: + title: 'Clone eventseries entity' + description: 'Clone existing event series entities' + +# Event Series Administration. +administer eventseries: + title: 'Administer eventseries' + description: 'Promote, change ownership, edit revisions, and perform other tasks for eventseries.' + restrict access: true +access eventseries overview: + title: 'Access the eventseries overview page' + description: 'View the admin table view of eventseries' \ No newline at end of file diff --git a/recurring_events.routing.yml b/recurring_events.routing.yml new file mode 100644 index 00000000..27494745 --- /dev/null +++ b/recurring_events.routing.yml @@ -0,0 +1,55 @@ +# Add an EventSeries. +entity.eventseries.add_form: + path: '/events/series/add' + defaults: + # Calls the form.add controller, defined in the event entity. + _entity_form: eventseries.add + _title: 'Add Event' + requirements: + _entity_create_access: 'eventseries' + _access_event: 'create' + options: + _admin_route: TRUE + +# Edit an EventSeries. +entity.eventseries.edit_form: + path: '/events/series/{eventseries}/edit' + defaults: + _entity_form: eventseries.edit + _title: 'Edit Event Series' + requirements: + _entity_access: 'eventseries.edit' + _access_event: 'update' + options: + _admin_route: TRUE + +# Delete an EventSeries. +entity.eventseries.delete_form: + path: '/events/series/{eventseries}/delete' + defaults: + _entity_form: eventseries.delete + _title: 'Delete Event' + requirements: + _entity_access: 'eventseries.delete' + _access_event: 'delete' + options: + _admin_route: TRUE + +# Clone an EventSeries. +entity.eventseries.clone_form: + path: '/events/series/{eventseries}/clone' + defaults: + _entity_form: eventseries.clone + _title_callback: '\Drupal\recurring_events\Controller\EventSeriesController::getCloneTitle' + requirements: + _entity_access: 'eventseries.clone' + _access_event: 'clone' + options: + _admin_route: TRUE + +# Event Series table list route. +entity.eventseries.collection: + path: '/admin/content/events/series' + requirements: + # Checks for permission directly. + _permission: 'access eventseries overview' \ No newline at end of file diff --git a/src/Entity/EventSeries.php b/src/Entity/EventSeries.php index 0fb7333e..12550e4c 100644 --- a/src/Entity/EventSeries.php +++ b/src/Entity/EventSeries.php @@ -401,7 +401,7 @@ class EventSeries extends EditorialContentEntityBase implements EventSeriesInter ->setLabel(t('Events in this Series')) ->setDescription(t('The events in this series.')) ->setRevisionable(FALSE) - ->setSetting('target_type', 'eventinstance') + ->setSetting('target_type', 'node') ->setTranslatable(FALSE) ->setDisplayOptions('view', [ 'label' => 'above', diff --git a/src/EventSeriesAccessControlHandler.php b/src/EventSeriesAccessControlHandler.php new file mode 100644 index 00000000..d686a8ec --- /dev/null +++ b/src/EventSeriesAccessControlHandler.php @@ -0,0 +1,50 @@ +<?php + +namespace Drupal\recurring_events; + +use Drupal\Core\Access\AccessResult; +use Drupal\Core\Entity\EntityAccessControlHandler; +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Session\AccountInterface; + +/** + * Access controller for the eventseries entity. + * + * @see \Drupal\recurring_events\Entity\EventSeries. + */ +class EventSeriesAccessControlHandler extends EntityAccessControlHandler { + + /** + * {@inheritdoc} + * + * Link the activities to the permissions. checkAccess is called with the + * $operation as defined in the routing.yml file. + */ + protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { + switch ($operation) { + case 'view': + return AccessResult::allowedIfHasPermission($account, 'view eventseries entity'); + + case 'edit': + return AccessResult::allowedIfHasPermission($account, 'edit eventseries entity'); + + case 'delete': + return AccessResult::allowedIfHasPermission($account, 'delete eventseries entity'); + + case 'clone': + return AccessResult::allowedIfHasPermission($account, 'clone eventseries entity'); + } + return AccessResult::allowed(); + } + + /** + * {@inheritdoc} + * + * Separate from the checkAccess because the entity does not yet exist, it + * will be created during the 'add' process. + */ + protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { + return AccessResult::allowedIfHasPermission($account, 'add eventseries entity'); + } + +} diff --git a/src/Form/EventSeriesForm.php b/src/Form/EventSeriesForm.php new file mode 100644 index 00000000..cbef12e7 --- /dev/null +++ b/src/Form/EventSeriesForm.php @@ -0,0 +1,75 @@ +<?php + +namespace Drupal\recurring_events\Form; + +use Drupal\Core\Entity\ContentEntityForm; +use Drupal\Core\Form\FormStateInterface; + +/** + * Form controller for the eventseries entity edit forms. + * + * @ingroup recurring_events + */ +class EventSeriesForm extends ContentEntityForm { + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + $form = parent::buildForm($form, $form_state); + + /* @var $entity \Drupal\recurring_events\Entity\EventSeries */ + $entity = $this->entity; + + $form['advanced']['#attributes']['class'][] = 'entity-meta'; + + $form['meta'] = [ + '#type' => 'details', + '#group' => 'advanced', + '#weight' => -10, + '#title' => $this->t('Status'), + '#attributes' => ['class' => ['entity-meta__header']], + '#tree' => TRUE, + '#access' => \Drupal::currentUser()->hasPermission('administer eventseries'), + ]; + $form['meta']['published'] = [ + '#type' => 'item', + '#markup' => $entity->isPublished() ? $this->t('Published') : $this->t('Not published'), + '#access' => !$entity->isNew(), + '#wrapper_attributes' => ['class' => ['entity-meta__title']], + ]; + $form['meta']['changed'] = [ + '#type' => 'item', + '#title' => $this->t('Last saved'), + '#markup' => !$entity->isNew() ? format_date($entity->getChangedTime(), 'short') : $this->t('Not saved yet'), + '#wrapper_attributes' => ['class' => ['entity-meta__last-saved']], + ]; + $form['meta']['author'] = [ + '#type' => 'item', + '#title' => $this->t('Author'), + '#markup' => $entity->getOwner()->getUsername(), + '#wrapper_attributes' => ['class' => ['entity-meta__author']], + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $form_state->setRedirect('entity.eventseries.collection'); + + $entity = $this->getEntity(); + $entity->save(); + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + // TODO: Add validation. + parent::validateForm($form, $form_state); + } + +} -- GitLab