contacts_events-8.x-1.x-dev/modules/teams/contacts_events_teams.install
modules/teams/contacts_events_teams.install
<?php
/**
* @file
* Install, update and uninstall functions for the Contacts Events Teams module.
*/
use Drupal\contacts_dbs\Entity\DBSWorkforce;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\entity\BundleFieldDefinition;
use Drupal\views\Entity\View;
use Symfony\Component\Yaml\Yaml;
/**
* Implements hook_install().
*
* Update entity form display with correct field group.
* Add dbs_workforce field to teams if contacts_dbs was already installed.
*/
function contacts_events_teams_install() {
/** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $display */
$display = EntityFormDisplay::load('contacts_event.default.default');
if ($display && $field_group = $display->getThirdPartySetting('field_group', 'group_booking_settings')) {
$field_group['children'][] = 'has_teams';
$display->setThirdPartySetting('field_group', 'group_booking_settings', $field_group);
$display->save();
}
if (\Drupal::moduleHandler()->moduleExists('contacts_dbs')) {
_contacts_events_teams_install_dbs_workforce_field();
}
_contacts_events_teams_install_team_email_override_fields();
}
/**
* Implements hook_modules_installed().
*
* Add dbs_workforce field to teams if contacts_dbs is being installed.
*/
function contacts_events_teams_modules_installed($modules) {
if (in_array('contacts_dbs', $modules)) {
_contacts_events_teams_install_dbs_workforce_field();
}
}
/**
* Helper function to install field definition for dbs_contacts workforce field.
*/
function _contacts_events_teams_install_dbs_workforce_field() {
$field = BaseFieldDefinition::create('list_string')
->setName('dbs_workforce')
->setTargetEntityTypeId('c_events_team')
->setLabel(new TranslatableMarkup('DBS Workforce'))
->setDefaultValue(NULL)
->setSetting('allowed_values_function', [DBSWorkforce::class, 'getOptions'])
->setDisplayConfigurable('form', TRUE)
->setDisplayOptions('form', [
'type' => 'options_select',
'weight' => 9,
])
->setDisplayConfigurable('view', TRUE)
->setDisplayOptions('view', [
'region' => 'hidden',
]);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('dbs_workforce', 'c_events_team', 'contacts_events_teams', $field);
}
/**
* Helper function to install field definitions for team email override fields.
*/
function _contacts_events_teams_install_team_email_override_fields() {
// Note: this is the only base field, the others are bundle fields.
$fields['team_email_override'] = BaseFieldDefinition::create('boolean')
->setName('team_email_override')
->setLabel(new TranslatableMarkup('Override team emails'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_request_team_enabled')
->setLabel(new TranslatableMarkup('Enable application request (with team)?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_b_man'] = BundleFieldDefinition::create('boolean')
->setName('application_request_team_b_man')
->setLabel(new TranslatableMarkup('Do not send to the booking manager'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_subject'] = BundleFieldDefinition::create('string')
->setName('application_request_team_subject')
->setLabel(new TranslatableMarkup('Application request subject (with team)'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_body'] = BundleFieldDefinition::create('text_long')
->setName('application_request_team_body')
->setLabel(new TranslatableMarkup('Application request email (with team)'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_accepted_enabled')
->setLabel(new TranslatableMarkup('Enable application accepted?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_subject'] = BundleFieldDefinition::create('string')
->setName('application_accepted_subject')
->setLabel(new TranslatableMarkup('Application accepted subject'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_body'] = BundleFieldDefinition::create('text_long')
->setName('application_accepted_body')
->setLabel(new TranslatableMarkup('Application accepted email'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_submitted_enabled')
->setLabel(new TranslatableMarkup('Enable application submitted?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_subject'] = BundleFieldDefinition::create('string')
->setName('application_submitted_subject')
->setLabel(new TranslatableMarkup('Application submitted subject'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_body'] = BundleFieldDefinition::create('text_long')
->setName('application_submitted_body')
->setLabel(new TranslatableMarkup('Application submitted email'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
foreach ($fields as $field_name => $field) {
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition($field_name, 'c_events_team', 'contacts_events_teams', $field);
}
}
/**
* Fix the Ticket::$team storage definition.
*/
function contacts_events_teams_update_8001() {
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $repository */
$repository = \Drupal::service('entity.last_installed_schema.repository');
$definitions = $repository->getLastInstalledFieldStorageDefinitions('contacts_ticket');
$definitions['team']->setSetting('target_type', 'c_events_team');
$repository->setLastInstalledFieldStorageDefinitions('contacts_ticket', $definitions);
}
/**
* Adds dbs_workforce field to teams if contacts_dbs was already installed.
*/
function contacts_events_teams_update_8002() {
if (\Drupal::moduleHandler()->moduleExists('contacts_dbs')) {
_contacts_events_teams_install_dbs_workforce_field();
}
}
/**
* Copy the has_teams field values to settings field.
*/
function contacts_events_teams_update_8003(&$sandbox) {
/** @var \Drupal\Core\Entity\EntityStorageInterface $storage */
$storage = \Drupal::service('entity_type.manager')->getStorage('contacts_event');
// Set up the batch by retrieving all of the event IDs.
if (!isset($sandbox['progress'])) {
$sandbox['ids'] = $storage->getQuery()->accessCheck(FALSE)->execute();
$sandbox['max'] = count($sandbox['ids']);
$sandbox['progress'] = 0;
}
// Try to update 25 events entities at a time.
$ids = array_slice($sandbox['ids'], $sandbox['progress'], 25);
/** @var \Drupal\contacts_events\Entity\EventInterface $event */
foreach ($storage->loadMultiple($ids) as $event) {
if ($event->hasField('has_teams')) {
$event->setSetting('teams.enabled', $event->get('has_teams')->value);
$event->save();
}
$sandbox['progress']++;
}
// Try to update the percentage but avoid division by zero.
$sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
// Show a status update for the current progress.
return new TranslatableMarkup(
'Updated the has_teams field for @progress out of @max events.',
['@progress' => $sandbox['progress'], '@max' => $sandbox['max']]
);
}
/**
* Remove the has_teams field storage definition.
*
* @see contacts_events_teams_entity_base_field_info()
*
* @todo Run this update after has_teams data has been moved.
*/
function _contacts_events_teams_update_0000() {
/** @var \Drupal\Core\Entity\EntityFieldManager $entity_field_manager */
$entity_field_manager = \Drupal::service('entity_field.manager');
$fields = $entity_field_manager->getFieldStorageDefinitions('contacts_event');
if (isset($fields['has_teams'])) {
\Drupal::entityDefinitionUpdateManager()
->uninstallFieldStorageDefinition($fields['has_teams']);
}
}
/**
* Install team email override fields.
*/
function contacts_events_teams_update_8004(&$sandbox) {
_contacts_events_teams_install_team_email_override_fields();
}
/**
* Install user team application view.
*/
function contacts_events_teams_update_8005(&$sandbox) {
$message = NULL;
// Only create if the redirect view doesn't exist and views is enabled.
if (\Drupal::moduleHandler()->moduleExists('views') && !View::load('contacts_events_teams_user_team_applications')) {
$config_path = drupal_get_path('module', 'contacts_events_teams') . '/config/install/views.view.contacts_events_teams_user_team_applications.yml';
$data = Yaml::parse(file_get_contents($config_path));
\Drupal::configFactory()->getEditable('views.view.contacts_events_teams_user_team_applications')->setData($data)->save(TRUE);
$message = 'The new User Team Applications view has been created.';
}
else {
$message = 'Not creating a User Team Applications view since it already exists.';
}
return $message;
}
/**
* Adds the disable_automatic_emails field to teams.
*/
function contacts_events_teams_update_8006() {
$field = BaseFieldDefinition::create('boolean')
->setLabel(new TranslatableMarkup('Disable automatic emails for this team'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('disable_automatic_emails', 'c_events_team', 'contacts_events_teams', $field);
}
