og-8.x-1.x-dev/og.install
og.install
<?php
/**
* @file
* Install, update, and uninstall functions for the Organic groups module.
*/
declare(strict_types=1);
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
/**
* Implements hook_uninstall().
*/
function og_uninstall() {
\Drupal::queue('og_orphaned_group_content')->deleteQueue();
\Drupal::queue('og_orphaned_group_content_cron')->deleteQueue();
}
/**
* Add a base field to store the group bundle in memberships.
*/
function og_update_8001(&$sandbox) {
$storage = \Drupal::entityTypeManager()->getStorage('og_membership');
if (!isset($sandbox['total'])) {
$storage_definition = BaseFieldDefinition::create('string')
->setLabel(new TranslatableMarkup('Group bundle ID'))
->setDescription(new TranslatableMarkup('The bundle ID of the group.'));
\Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('entity_bundle', 'og_membership', 'og', $storage_definition);
$sandbox['#finished'] = 0;
$sandbox['batch_size'] = 500;
$sandbox['current'] = 0;
$sandbox['total'] = $storage->getQuery()->accessCheck(FALSE)->count()->execute();
if (!$sandbox['total']) {
$sandbox['#finished'] = 1;
return new TranslatableMarkup('No OG memberships found.');
}
}
// Update the existing memberships to include the group bundle ID.
$membership_ids = $storage->getQuery()->accessCheck(FALSE)
->range($sandbox['current'], $sandbox['batch_size'])
->sort('id')
->execute();
/** @var \Drupal\og\Entity\OgMembership $membership */
foreach ($storage->loadMultiple($membership_ids) as $membership) {
$group = $membership->getGroup();
if (!empty($group)) {
$membership->set('entity_bundle', $group->bundle());
$membership->save();
}
else {
// The membership is for a group that no longer exists. We cannot no
// longer retrieve the group bundle ID so the membership cannot be
// updated. Delete the membership since it is invalid, and inform the
// user.
\Drupal::logger('og')->warning('Deleted orphaned membership with ID @id since the group it refers to no longer exists.', [
'@id' => $membership->id(),
]);
$membership->delete();
}
}
$sandbox['current'] += $sandbox['batch_size'];
if ($sandbox['current'] >= $sandbox['total']) {
$sandbox['current'] = $sandbox['total'];
}
$sandbox['#finished'] = $sandbox['current'] / $sandbox['total'];
$message = new TranslatableMarkup('Processed @current of @total memberships (@percentage% complete)', [
'@current' => $sandbox['current'],
'@total' => $sandbox['total'],
'@percentage' => number_format($sandbox['#finished'] * 100, 2),
]);
return $message;
}
/**
* Add uuid field to OgMembership.
*/
function og_update_8002() {
$manager = \Drupal::entityDefinitionUpdateManager();
$entity_type = $manager->getEntityType('og_membership');
$entity_keys = $entity_type->getKeys();
$entity_keys['uuid'] = 'uuid';
$entity_type->set('entity_keys', $entity_keys);
$manager->updateEntityType($entity_type);
$manager->updateFieldStorageDefinition($manager->getFieldStorageDefinition('uuid', 'og_membership'));
}
/**
* Add auto_add_group_owner_membership configuration to og.settings config.
*/
function og_update_8003(&$sandbox) {
$config = \Drupal::configFactory()->getEditable('og.settings');
// This setting defaults to TRUE for backwards compatibility.
$config->set('auto_add_group_owner_membership', TRUE);
$config->save(TRUE);
}
/**
* Replaces the missing og_complex widget with a valid alternative.
*
* Using entity_reference_autocomplete to avoid memory issues with long lists
* of groups.
*/
function og_update_10001() {
$displays = \Drupal::entityTypeManager()
->getStorage('entity_form_display')
->loadMultiple();
foreach ($displays as $display) {
$needs_save = FALSE;
foreach ($display->getComponents() as $field_name => $component) {
if (!empty($component['type']) && $component['type'] === 'og_complex') {
$component['type'] = 'entity_reference_autocomplete';
$display->setComponent($field_name, $component);
$needs_save = TRUE;
\Drupal::logger('og')->notice("Updated widget for @field in @display from og_complex to entity_reference_autocomplete.", [
'@field' => $field_name,
'@display' => $display->id(),
]);
}
}
if ($needs_save) {
$display->save();
}
}
}
