contacts_events-8.x-1.x-dev/modules/teams/c_events_team_app.page.inc
modules/teams/c_events_team_app.page.inc
<?php
/**
* @file
* Contains c_events_team_app.page.inc.
*
* Page callback for Team application entities.
*/
use Drupal\Core\Field\FieldItemList;
use Drupal\Core\Form\FormState;
use Drupal\Core\Render\Element;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\field\Entity\FieldConfig;
use Drupal\state_machine\Form\StateTransitionForm;
/**
* Prepares variables for Team application templates.
*
* Default template: c_events_team_app.html.twig.
*
* Rather than rendering all the fields on the entity, this will prepare
* variables containing information about the applicant, the questions and
* references.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the user information and any
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_c_events_team_app(array &$variables) {
$variables['#attached']['library'][] = 'contacts_events_teams/manage_application';
// Fetch TeamApplication Entity Object.
/** @var \Drupal\contacts_events_teams\Entity\TeamApplication $app */
$app = $variables['elements']['#c_events_team_app'];
/** @var \Drupal\contacts_events\Entity\TicketInterface|null $ticket */
$ticket = $app->getTicket();
$applicant = $app->getOwner();
/** @var \Drupal\profile\Entity\ProfileInterface $profile */
$profile = $applicant->profile_crm_indiv->entity;
// Build up different sections of the team application display.
// application_summary: a brief summary of the application
// applicant_details: information on the applicant
// questions: team app questions and their answers
// references: reference details
// other_applications: other applications
// log: Application status log.
// footer: Items to display below the tabs.
$variables['application_summary'] = [
'event' => ['#markup' => new TranslatableMarkup('Unknown event')],
'team' => $app->getTeam() ? $app->getTeam()->get('name')->view(['label' => 'inline']) : new TranslatableMarkup('Team has been deleted'),
'submitted' => $app->get('created')->view(['label' => 'inline']),
'booking_link' => [],
'status' => $app->state->view([
'label' => 'inline',
'type' => 'list_default',
]),
'dbs_status' => '',
];
if ($ticket) {
$variables['application_summary']['event'] = $ticket->getEvent()->get('title')->view([
'label' => 'inline',
]);
$variables['application_summary']['booking_link'] = $ticket->getOrderItem()->get('order_id')->view(['label' => 'inline']);
}
// Override titles to make sense in team application context.
$variables['application_summary']['event']['#title'] = new TranslatableMarkup('Event');
$variables['application_summary']['submitted']['#title'] = new TranslatableMarkup('Submitted');
// Only override team title if a team is present. The team might be missing
// if it's been deleted, in which case the team key won't be an array but
// a string "Team has been deleted", which is set above.
if ($app->getTeam()) {
$variables['application_summary']['team']['#title'] = new TranslatableMarkup('Team');
}
$variables['applicant_details'] = [
'id' => $app->user_id->view([
'label' => 'inline',
'type' => 'entity_reference_entity_id',
]),
'dob' => [],
'email' => [],
'name' => $app->user_id->entity->label(),
];
if ($ticket) {
$variables['applicant_details']['dob'] = $ticket->date_of_birth->view([
'label' => 'inline',
'settings' => ['format_type' => 'html_date'],
]);
$variables['applicant_details']['ticket'] = $ticket->email->view(['label' => 'inline']);
$variables['applicant_details']['name'] = $ticket->name->view(['label' => 'hidden']);
}
if ($profile) {
if ($profile->hasField('crm_address')) {
$variables['applicant_details']['address'] = $profile->crm_address->view(['label' => 'hidden']);
}
if ($profile->hasField('crm_gender')) {
$variables['applicant_details']['gender'] = $profile->crm_gender->view(['label' => 'inline']);
}
if ($profile->hasField('crm_photo')) {
$variables['applicant_details']['image'] = $profile->crm_photo->view([
'label' => 'hidden',
'settings' => ['image_style' => 'contacts_small'],
]);
}
}
// Replace title for ID.
$variables['applicant_details']['id']['#title'] = new TranslatableMarkup('User ID');
$references = [];
// Don't want all fields from the application, only those that represent
// questions which will be the config fields rather than the base fields.
// Exclude references - these will be put in the reference tab.
foreach (Element::children($variables['elements']) as $key) {
if (isset($variables['elements'][$key]['#items']) && $variables['elements'][$key]['#items'] instanceof FieldItemList) {
/** @var \Drupal\Core\Field\FieldItemList $list */
$list = $variables['elements'][$key]['#items'];
if ($list->getFieldDefinition()->getType() == 'entity_reference' && $list->getFieldDefinition()->getSetting('target_type') == 'contacts_reference') {
$references[] = [
'reference' => $list->entity,
// Include the field as context for preprocess later.
'field' => $list->getFieldDefinition(),
];
}
elseif ($list->getFieldDefinition() instanceof FieldConfig) {
$variables['questions'][$key] = $variables['elements'][$key];
}
}
}
if ($app->access('update')) {
$variables['questions']['edit'] = [
'#type' => 'link',
'#title' => new TranslatableMarkup('Edit Application'),
'#attributes' => ['class' => ['button']],
'#url' => $app->toUrl('edit-form'),
'#weight' => 100,
];
}
// Other team applications for this user.
$storage = \Drupal::entityTypeManager()->getStorage('c_events_team_app');
$query = $storage->getQuery();
$query->accessCheck(TRUE);
$query->condition('user_id', $applicant->id());
$query->condition('id', $app->id(), '<>');
/** @var \Drupal\contacts_events_teams\Entity\TeamApplication[] $other_applications */
$other_applications = $storage->loadMultiple($query->execute());
$variables['other_applications'] = [
'#header' => [
new TranslatableMarkup('Event'),
new TranslatableMarkup('Date'),
new TranslatableMarkup('Team'),
new TranslatableMarkup('Status'),
'',
],
'#type' => 'table',
'#empty' => new TranslatableMarkup('No other applications'),
];
/** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */
$date_formatter = \Drupal::service('date.formatter');
foreach ($other_applications as $other_application) {
/** @var \Drupal\contacts_events\Entity\EventInterface $event */
$event = $other_application->get('event')->entity;
$variables['other_applications']['#rows'][$other_application->id()] = [
'event' => $event->label(),
'date' => $date_formatter->format($event->get('date')->start_date->getTimestamp(), 'short'),
'team' => $other_application->getTeam() ? $other_application->getTeam()->label() : new TranslatableMarkup('Team has been deleted'),
'status' => $other_application->get('state')->first()->getLabel(),
'link' => $other_application->toLink(new TranslatableMarkup('View')),
];
}
if (count($references)) {
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('contacts_reference');
foreach ($references as $reference_array) {
/** @var \Drupal\contacts_references\Entity\Reference $reference */
$reference = $reference_array['reference'];
$variables['references'][$reference->id()] = $view_builder->view($reference);
$variables['references'][$reference->id()]['#team_app_field'] = $reference_array['field'];
}
}
// Checkout for dbs integration.
// @todo Should we check if the module is enabled as well?
if ($app->getTeam() && $app->getTeam()->hasField('dbs_workforce') && $workforce = $app->getTeam()->get('dbs_workforce')->value) {
/** @var \Drupal\contacts_dbs\DBSManager $dbs_manager */
$dbs_manager = \Drupal::service('contacts_dbs.dbs_manager');
/** @var \Drupal\contacts_dbs\DBSStatusStorage $dbs_storage */
$dbs_storage = \Drupal::entityTypeManager()->getStorage('dbs_status');
$dbs_statuses = $dbs_manager->getAllDbs($app->getOwnerId(), $workforce);
$variables['dbs'] = [
'#header' => [
new TranslatableMarkup('Status'),
new TranslatableMarkup('Date'),
new TranslatableMarkup('Workforce'),
new TranslatableMarkup('Updated by'),
],
'#type' => 'table',
'#empty' => new TranslatableMarkup('No DBS history'),
];
if ($dbs_statuses) {
/** @var \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager */
$entity_field_manager = \Drupal::service('entity_field.manager');
$definitions = $entity_field_manager->getFieldStorageDefinitions('dbs_status');
$status_options = options_allowed_values($definitions['status']);
foreach ($dbs_statuses as $dbs_status) {
foreach ($dbs_storage->revisionIds($dbs_status) as $revision_id) {
/** @var \Drupal\contacts_dbs\Entity\DBSStatusInterface $revision */
$revision = $dbs_storage->loadRevision($revision_id);
$variables['dbs']['#rows'][$revision->getRevisionId()] = [
'status' => $status_options[$revision->get('status')->value],
'date' => $date_formatter->format($revision->getRevisionCreationTime(), 'short'),
'workforce' => $revision->get('workforce')->entity->label(),
'updated' => $revision->getRevisionUser() ? $revision->getRevisionUser()
->label() : '',
// Include the raw timestamp as hidden property for sorting.
'#date' => $revision->getChangedTime(),
];
}
}
// Sort the rows by created date descending.
usort($variables['dbs']['#rows'], function ($a, $b) {
return $b['#date'] <=> $a['#date'];
});
// Set the status in the summary.
$variables['application_summary']['dbs_status'] = [
'#type' => 'item',
'#title' => new TranslatableMarkup('DBS Status'),
'#markup' => $variables['dbs']['#rows'][0]['status'],
];
}
}
$variables['log'] = $variables['elements']['status_log'];
// Render state transition form as team leaders dont have entity update
// permission.
// @see \Drupal\state_machine\Plugin\Field\FieldFormatter\StateTransitionFormFormatter::viewElements
$state_form = $variables['elements']['state'];
/** @var \Drupal\state_machine\Form\StateTransitionFormInterface $form_object */
$form_object = \Drupal::classResolver()->getInstanceFromDefinition(StateTransitionForm::class);
$form_object->setEntity($app);
$form_object->setFieldName('state');
$form_state = new FormState();
$state_form = \Drupal::formBuilder()->buildForm($form_object, $form_state);
$variables['footer']['state'] = $state_form;
}
