You are here

salesforce_mapping_ui.module in Salesforce Suite 5.0.x

Same filename and directory in other branches
  1. 8.4 modules/salesforce_mapping_ui/salesforce_mapping_ui.module

Manages Salesforce object and Drupal entity mappings.

File

modules/salesforce_mapping_ui/salesforce_mapping_ui.module
View source
<?php

/**
 * @file
 * Manages Salesforce object and Drupal entity mappings.
 */
use Drupal\Core\Entity\EntityInterface;
use Drupal\salesforce_mapping_ui\SalesforceMappingList;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingAddForm;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingEditForm;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingDisableForm;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingDeleteForm;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingEnableForm;
use Drupal\salesforce_mapping_ui\Form\SalesforceMappingFieldsForm;
use Drupal\salesforce_mapping_ui\MappedObjectList;
use Drupal\salesforce_mapping_ui\Form\MappedObjectForm;

/**
 * Implements hook_entity_type_alter().
 */
function salesforce_mapping_ui_entity_type_alter(array &$entity_types) {

  // There's no good way to add a link template based on existing mapping
  // definitions while we're building entity type definitions. We can't load
  // existing mappings, because to do that we need to load entity types which
  // creates an infinite recursion. So, we set the link template on any
  // mappable entity, and hide it for any entity types that don't have
  // mappings.
  foreach ($entity_types as $entity_type_id => $entity_type) {
    if ($entity_type_id == 'salesforce_mapping' || $entity_type_id == 'salesforce_mapped_object') {
      continue;
    }
    if ($entity_type
      ->hasViewBuilderClass() && $entity_type
      ->hasLinkTemplate('canonical')) {
      $entity_type
        ->setLinkTemplate('salesforce', "/{$entity_type_id}/{{$entity_type_id}}/salesforce");
    }
  }

  // Set our UI classes for SalesforceMappingEntity.
  $entity_types['salesforce_mapping']
    ->setHandlerClass('list_builder', SalesforceMappingList::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('add', SalesforceMappingAddForm::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('edit', SalesforceMappingEditForm::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('disable', SalesforceMappingDisableForm::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('delete', SalesforceMappingDeleteForm::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('enable', SalesforceMappingEnableForm::class);
  $entity_types['salesforce_mapping']
    ->setFormClass('fields', SalesforceMappingFieldsForm::class);
  $entity_types['salesforce_mapping']
    ->setLinkTemplate('add-form', '/admin/structure/salesforce/mappings/add');
  $entity_types['salesforce_mapping']
    ->setLinkTemplate('edit-form', '/admin/structure/salesforce/mappings/manage/{salesforce_mapping}');
  $entity_types['salesforce_mapping']
    ->setLinkTemplate('delete-form', '/admin/structure/salesforce/mappings/manage/{salesforce_mapping}/delete');

  // Set UI classes for MappedObject.
  $entity_types['salesforce_mapped_object']
    ->setHandlerClass('list_builder', MappedObjectList::class);
  $entity_types['salesforce_mapped_object']
    ->setFormClass('add', MappedObjectForm::class);
  $entity_types['salesforce_mapped_object']
    ->setFormClass('edit', MappedObjectForm::class);
  $entity_types['salesforce_mapped_object']
    ->setFormClass('delete', MappedObjectForm::class);
  $entity_types['salesforce_mapped_object']
    ->setFormClass('default', MappedObjectForm::class);
  $entity_types['salesforce_mapped_object']
    ->setLinkTemplate('add-form', '/admin/content/salesforce/add');
  $entity_types['salesforce_mapped_object']
    ->setLinkTemplate('edit-form', '/admin/content/salesforce/{salesforce_mapped_object}/edit');
  $entity_types['salesforce_mapped_object']
    ->setLinkTemplate('delete-form', '/admin/content/salesforce/{salesforce_mapped_object}/delete');
  $entity_types['salesforce_mapped_object']
    ->setLinkTemplate('canonical', '/admin/content/salesforce/{salesforce_mapped_object}');
}

/**
 * Implements hook_local_actions_alter().
 */
function salesforce_mapping_ui_menu_local_actions_alter(&$local_actions) {
  foreach (\Drupal::entityTypeManager()
    ->getDefinitions() as $entity_type_id => $entity_type) {
    if (\Drupal::entityTypeManager()
      ->getStorage('salesforce_mapping')
      ->loadByDrupal($entity_type_id)) {
      $local_actions['salesforce_mapped_object.add_action']['appears_on'][] = "entity.{$entity_type_id}.salesforce";
    }
  }
}

/**
 * Implements hook_entity_operation().
 */
function salesforce_mapping_ui_entity_operation(EntityInterface $entity) {
  $operations = [];
  if (\Drupal::entityTypeManager()
    ->getStorage('salesforce_mapping')
    ->loadByEntity($entity)) {
    $operations['salesforce'] = [
      'title' => t('Salesforce'),
      'weight' => 200,
      'url' => $entity
        ->toUrl('salesforce'),
    ];
  }
  return $operations;
}

/**
 * Implements hook_entity_extra_field_info().
 */
function salesforce_mapping_ui_entity_extra_field_info() {

  // Include Salesforce data for mapped entities.
  // @TODO: these don't actually show up on the entity view. Have to implement hook_entity_view as well?
  $extra = [];
  $mappings = \Drupal::service('entity_type.manager')
    ->getStorage('salesforce_mapping')
    ->loadPushMappings();
  foreach ($mappings as $mapping) {
    $extra[$mapping->drupal_entity_type][$mapping->drupal_bundle] = [
      'display' => [
        'salesforce_id' => [
          'label' => t('Salesforce Id'),
          'description' => t('ID of a linked Salesforce object.'),
          'weight' => 0,
        ],
        'salesforce_last_sync' => [
          'label' => t('Salesforce last sync'),
          'description' => t('Timestamp for the latest sync with Salesforce.'),
          'weight' => 0,
        ],
      ],
    ];
  }
  return $extra;
}