You are here

function addtoany_update_8101 in AddToAny Share Buttons 8

Migrate global placement settings to settings per view mode.

File

./addtoany.install, line 41
Install, update and uninstall functions for the AddToAny module.

Code

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();
}