133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
| <?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();
 | |
| }
 |