You are here

addtoany.install in AddToAny Share Buttons 8

Install, update and uninstall functions for the AddToAny module.

File

addtoany.install
View source
<?php

/**
 * @file
 * Install, update and uninstall functions for the AddToAny module.
 */
use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\node\Entity\NodeType;

/**
 * Implements hook_install().
 */
function addtoany_install() {

  // Build a structured list of node bundles and view modes that have AddToAny
  // enabled by default.
  $node_enable_by_default = [
    'article' => [
      'default',
      'teaser',
    ],
    'page' => [
      'default',
      'teaser',
    ],
  ];

  // Get the config entity storage handler.
  $storage = \Drupal::entityTypeManager()
    ->getStorage('entity_view_display');
  foreach ($node_enable_by_default as $bundle => $viewmodes) {

    // Set a default weight per node type.
    $display_weight = $bundle == 'article' ? 5 : 101;
    foreach ($viewmodes as $viewmode) {

      // Get the config entity for this bundle and view mode.
      $display = $storage
        ->load('node.' . $bundle . '.' . $viewmode);

      // Enable the AddToAny extra field and save the config.
      if (!empty($display)) {
        $display
          ->setComponent('addtoany', [
          'weight' => $display_weight,
        ])
          ->save();
      }
    }
  }
}

/**
 * Migrate global placement settings to settings per view mode.
 */
function addtoany_update_8101(&$sandbox) {
  $config_factory = \Drupal::configFactory();

  // Gather the settings we need to migrate.
  $addtoany_settings = $config_factory
    ->getEditable('addtoany.settings');
  $node_types = $addtoany_settings
    ->getOriginal('nodetypes');
  $display_in_teasers = $addtoany_settings
    ->getOriginal('display_in_teasers');
  $display_in_nodecont = $addtoany_settings
    ->getOriginal('display_in_nodecont');
  $display_weight = $addtoany_settings
    ->getOriginal('display_weight');
  $new_display_weight = $display_weight;

  // The entity display repository stores which view modes are enabled.
  $entity_display_repository = \Drupal::getContainer()
    ->get('entity_display.repository');

  // Check if AddToAny is currently shown on at least one node type.
  if (!empty($node_types) && $display_in_nodecont) {

    // Loop over the AddToAny-enabled node types.
    foreach ($node_types as $bundle) {

      // Get enabled view modes.
      $view_modes = $entity_display_repository
        ->getViewModeOptionsByBundle('node', $bundle);

      // If the teaser view mode is enabled but the old settings excluded it,
      // take it out.
      if (!empty($view_modes['teaser']) && $display_in_teasers == FALSE) {
        unset($view_modes['teaser']);
      }

      // Check if the old default weight was set.
      if ($display_weight == 10) {

        // Set the new default weight per node type.
        $new_display_weight = $bundle == 'article' ? 5 : 101;
      }

      // Loop over the view modes and apply new settings to match the old.
      foreach ($view_modes as $view_mode => $view_mode_info) {
        $display = EntityViewDisplay::load('node.' . $bundle . '.' . $view_mode);
        $display
          ->setComponent('addtoany', [
          'weight' => $new_display_weight,
        ])
          ->save();
      }
    }
  }

  // Convert Display Suite fields to regular "extra fields".
  if (\Drupal::moduleHandler()
    ->moduleExists('ds')) {

    // The DsField implementation only supported node entities.
    $all_node_types = NodeType::loadMultiple();
    foreach ($all_node_types as $node_type) {

      // Get enabled view modes.
      $view_modes = $entity_display_repository
        ->getViewModeOptionsByBundle('node', $node_type
        ->id());

      // Loop over the view modes and apply new settings to match the old.
      foreach ($view_modes as $view_mode => $view_mode_info) {

        // Get the entity view display config entity.
        $display = EntityViewDisplay::load('node.' . $node_type
          ->id() . '.' . $view_mode);

        // Check if this view mode uses Display Suite fields and if the Display
        // Suite AddToAny field ("addtoany_field") was enabled.
        $ds_fields = $display
          ->getThirdPartySetting('ds', 'fields');
        if (!empty($ds_fields) && isset($ds_fields['addtoany_field'])) {

          // Remove the DS field, add the extra field.
          unset($ds_fields['addtoany_field']);
          $display
            ->setComponent('addtoany');

          // Keep the rest of the DS fields.
          $display
            ->setThirdPartySetting('ds', 'fields', $ds_fields);

          // Find where the DS field was placed and put the AddToAny extra field
          // in its place.
          $ds_regions = $display
            ->getThirdPartySetting('ds', 'regions');
          foreach ($ds_regions as $label => $ds_region_fields) {
            $key = array_search('addtoany_field', $ds_region_fields);
            if ($key !== FALSE) {
              $ds_regions[$label][$key] = 'addtoany';
            }
          }

          // Apply the altered region settings.
          $display
            ->setThirdPartySetting('ds', 'regions', $ds_regions);

          // Save the view mode.
          $display
            ->save();
        }
      }
    }
  }

  // Finally, clean up no longer used settings.
  $addtoany_settings
    ->clear('nodetypes')
    ->clear('display_in_teasers')
    ->clear('display_in_nodecont')
    ->clear('display_weight')
    ->save();
}

Functions

Namesort descending Description
addtoany_install Implements hook_install().
addtoany_update_8101 Migrate global placement settings to settings per view mode.