localgov_alert_banner-1.8.5/localgov_alert_banner.install
localgov_alert_banner.install
<?php
/**
* @file
* LocalGov Alert Banner install file.
*/
declare(strict_types=1);
use Drupal\Core\Cache\Cache;
use Drupal\Core\Config\Config;
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\user\Entity\Role;
use Drupal\user\RoleInterface;
use Symfony\Component\Yaml\Yaml;
/**
* Implements hook_install().
*/
function localgov_alert_banner_install($is_syncing): void {
// Don't run this if syncing.
if ($is_syncing) {
return;
}
// Configure scheduled transitions if enabled.
if (\Drupal::moduleHandler()->moduleExists('scheduled_transitions')) {
localgov_alert_banner_configure_scheduled_transitions();
}
localgov_alert_banner_set_default_permissions();
}
/**
* Update alert banner entity definition to include the token on the entity.
*/
function localgov_alert_banner_update_8801(): void {
$field_storage_definition = BaseFieldDefinition::create('string')
->setSetting('max_length', 64)
->setDisplayConfigurable('form', FALSE)
->setDisplayConfigurable('view', FALSE);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('token', 'localgov_alert_banner', 'localgov_alert_banner', $field_storage_definition);
}
/**
* Add visibility field to existing alert banners.
*/
function localgov_alert_banner_update_8901(): void {
// Enable dependent condition_field module.
\Drupal::service('module_installer')->install(['condition_field']);
$config_directory = new FileStorage(__DIR__ . '/config/install');
// Add visibility field storage.
$field_storage = $config_directory->read('field.storage.localgov_alert_banner.visibility');
if ($field_storage && !FieldStorageConfig::loadByName('localgov_alert_banner', 'visibility')) {
FieldStorageConfig::create($field_storage)->save();
}
// Fetch all configured localgov_alert_banner bundles.
$alert_banner_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('localgov_alert_banner');
foreach ($alert_banner_bundles as $bundle => $info) {
// Add visibility field to bundle.
$field_record = $config_directory->read('field.field.localgov_alert_banner.localgov_alert_banner.visibility');
if ($field_record && !FieldConfig::loadByName('localgov_alert_banner', $bundle, 'visibility')) {
$field_record['bundle'] = $bundle;
FieldConfig::create($field_record)->save();
}
// Add visibility field to the bundles entity form.
$form_display = \Drupal::entityTypeManager()
->getStorage('entity_form_display')
->load('localgov_alert_banner.' . $bundle . '.default');
if ($form_display) {
$form_display->setComponent('visibility', [
'region' => 'content',
'settings' => [],
'third_party_settings' => [],
'type' => 'condition_field_default',
'weight' => 5,
]);
$form_display->save();
}
}
}
/**
* Add workflow and configure scheduled transitions if enabled.
*/
function localgov_alert_banner_update_9001(): void {
// Add localgov_alert_banner workflow config.
$workflows_workflow_localgov_alert_banner = <<<EOY
langcode: en
status: true
dependencies:
config:
- localgov_alert_banner.localgov_alert_banner_type.localgov_alert_banner
module:
- content_moderation
id: localgov_alert_banners
label: 'Alert banners'
type: content_moderation
type_settings:
states:
draft:
published: false
default_revision: false
label: Draft
weight: 0
published:
label: Published
published: true
default_revision: true
weight: 1
unpublished:
label: Unpublished
published: false
default_revision: true
weight: 2
transitions:
create_new_draft:
label: 'Create New Draft'
to: draft
weight: 0
from:
- draft
- published
- unpublished
publish:
label: Publish
to: published
weight: 1
from:
- draft
- published
- unpublished
unpublish:
label: Unpublish
to: unpublished
weight: 2
from:
- draft
- published
- unpublished
entity_types:
localgov_alert_banner:
- localgov_alert_banner
default_moderation_state: unpublished
EOY;
$workflow = \Drupal::service('config.factory')->getEditable('workflows.workflow.localgov_alert_banners');
assert($workflow instanceof Config);
if ($workflow->isNew()) {
$workflow->setData(Yaml::parse($workflows_workflow_localgov_alert_banner));
$workflow->save();
}
// Hide content moderation field on alert banner display.
$alert_banner_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('localgov_alert_banner');
foreach ($alert_banner_bundles as $bundle => $info) {
$form_display = \Drupal::entityTypeManager()
->getStorage('entity_view_display')
->load('localgov_alert_banner.' . $bundle . '.default');
if ($form_display) {
$form_display->setComponent('content_moderation_control', [
'region' => 'hidden',
]);
$form_display->save();
}
}
// Check Scheduled Transitions module is enabled.
$moduleHandler = \Drupal::service('module_handler');
if ($moduleHandler->moduleExists('scheduled_transitions')) {
// Configure scheduled transitions for alert banners.
$scheduled_transitions_config = \Drupal::service('config.factory')->getEditable('scheduled_transitions.settings');
$bundles = [];
foreach ($alert_banner_bundles as $bundle => $info) {
$bundles[] = [
'entity_type' => 'localgov_alert_banner',
'bundle' => $bundle,
];
}
$scheduled_transitions_config->set('bundles', $bundles);
$scheduled_transitions_config->save();
Cache::invalidateTags([
'scheduled_transition_settings',
'config:scheduled_transitions.settings',
]);
// Add scheduling permissions to the emergency publisher user.
$permissions = [];
foreach ($alert_banner_bundles as $bundle => $info) {
$permissions = array_merge($permissions, [
'add scheduled transitions localgov_alert_banner ' . $bundle,
'reschedule scheduled transitions localgov_alert_banner ' . $bundle,
'view scheduled transitions localgov_alert_banner ' . $bundle,
]);
}
user_role_grant_permissions('emergency_publisher', $permissions);
}
}
/**
* Add view alert banner permission to anonymous and authenticated users.
*/
function localgov_alert_banner_update_9002(): void {
user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, ['view all localgov alert banner entities']);
user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['view all localgov alert banner entities']);
// Also grant permissions on individual types.
$alert_banner_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('localgov_alert_banner');
foreach ($alert_banner_bundles as $bundle => $info) {
user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, ['view localgov alert banner ' . $bundle . ' entities']);
user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['view localgov alert banner ' . $bundle . ' entities']);
}
}
/**
* Assign additional permissions to Emergency publisher role.
*
* Give emergency publisher permissions to access the alert banner manage screen
* from the toolbar.
*/
function localgov_alert_banner_update_10002(): void {
$module_handler = \Drupal::service('module_handler');
$perms[] = 'view the administration theme';
if ($module_handler->moduleExists('node')) {
$perms[] = 'access content overview';
}
if ($module_handler->moduleExists('toolbar')) {
$perms[] = 'access toolbar';
}
// Add and revoke permissions if emergency publisher exists.
if (Role::load('emergency_publisher') instanceof RoleInterface) {
user_role_grant_permissions('emergency_publisher', $perms);
user_role_revoke_permissions('emergency_publisher', ['access administration pages']);
}
}
