diff --git a/modules/salesforce_mapping/salesforce_mapping.module b/modules/salesforce_mapping/salesforce_mapping.module index 938c6ddc493b15e3dc7c98da5910543aa74a5a0f..5a987a598e1778eda0d2bed1047c6d06f1f9073e 100644 --- a/modules/salesforce_mapping/salesforce_mapping.module +++ b/modules/salesforce_mapping/salesforce_mapping.module @@ -316,8 +316,9 @@ function salesforce_mapping_entity_view(array &$build, EntityInterface $entity, /** * Implements hook_field_extra_fields(). */ -function salesforce_mapping_field_extra_fields() { +function salesforce_mapping_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 = salesforce_mapping_load_multiple(); foreach ($mappings as $mapping) { @@ -345,57 +346,28 @@ function salesforce_mapping_field_extra_fields() { * Ensures drupal entity has an update timestamp. */ function salesforce_mapping_entity_update(EntityInterface $entity) { - // @TODO: update this. it is broked. - return; - // Check if mapping exists. - - if (!salesforce_mapping_load_by_drupal($entity->getEntityTypeId())) { - return; - } - $sf_mapped_object = salesforce_mapped_object_load_by_entity($entity); - if ($sf_mapped_object) { - // Triggering the sf mapping's save callback updates its timestamp. - $sf_mapped_object->entity_updated = $entity->changed; - $sf_mapped_object->save(); + // Check for mappings (much faster than looking for mapped objects.) + try { + salesforce_mapping_load_by_drupal($entity->getEntityTypeId()); } -} - -/** - * Get the Salesforce fieldmap types array. - * - * @see hook_salesforce_mapping_fieldmap_type() - * @see hook_salesforce_mapping_fieldmap_type_alter() - * - * @param string $fieldmap_type - * The fieldmap type, e.g. property, for which the info shall be returned, or - * NULL to return an array with info about all types. - */ -function salesforce_mapping_get_fieldmap_types($fieldmap_type = NULL) { - // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static_fast; - if (!isset($drupal_static_fast)) { - $drupal_static_fast['salesforce_fieldmap_type'] = & drupal_static(__FUNCTION__); + catch (Exception $e) { + return; } - $salesforce_fieldmap_type = & $drupal_static_fast['salesforce_fieldmap_type']; - - if (empty($salesforce_fieldmap_type)) { - if ($cache = cache()->get('salesforce:fieldmap_type')) { - $salesforce_fieldmap_type = $cache->data; - } - else { - $salesforce_fieldmap_type = module_invoke_all('salesforce_mapping_fieldmap_type'); - // Let other modules alter the fieldmap type. - drupal_alter('salesforce_fieldmap_type', $salesforce_fieldmap_type); - cache()->set('salesforce:fieldmap_type', $salesforce_fieldmap_type, CacheBackendInterface::CACHE_PERMANENT, ['salesforce' => TRUE]); - - } + // If mappings, check for mapped objects. + try { + $mapped_objects = salesforce_mapped_object_load_by_drupal($entity->getEntityTypeId(), $entity->id()); + dpm($mapped_objects); } - - if (empty($fieldmap_type)) { - return $salesforce_fieldmap_type; + catch (Exception $e) { + return; } - elseif (isset($salesforce_fieldmap_type[$fieldmap_type])) { - return $salesforce_fieldmap_type[$fieldmap_type]; + foreach ($mapped_objects as $mapped_object) { + // Resaving the object should update the timestamp. + // NB: we are purposefully not creating a new revision here. + $mapped_object + ->set('entity_updated', REQUEST_TIME) + ->save(); } } + diff --git a/modules/salesforce_mapping/src/Entity/MappedObject.php b/modules/salesforce_mapping/src/Entity/MappedObject.php index 0a34d02582ac3868e9c3fe3166d02df0d2162df1..5c3a64a0cb5ef6f248e8de25faf59b37e461d740 100644 --- a/modules/salesforce_mapping/src/Entity/MappedObject.php +++ b/modules/salesforce_mapping/src/Entity/MappedObject.php @@ -68,6 +68,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject } public function save() { + $this->changed = REQUEST_TIME; if ($this->isNew()) { $this->created = REQUEST_TIME; } @@ -290,6 +291,9 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject if ($result instanceof SFID) { $this->set('salesforce_id', (string)$result); } + + // @TODO setNewRevision not chainable, per https://www.drupal.org/node/2839075 + $this->setNewRevision(TRUE); $this ->set('last_sync_action', 'push_' . $action) ->set('last_sync_status', TRUE) @@ -302,6 +306,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject $client = \Drupal::service('salesforce.client'); $mapping = $this->salesforce_mapping->entity; $client->objectDelete($mapping->getSalesforceObjectType(), $this->sfid()); + $this->setNewRevision(TRUE); $this ->set('last_sync_action', 'push_delete') ->set('last_sync_status', TRUE) diff --git a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php index a5b7420bae216be849ffd7f2e067cda2642c8280..fac7ff32916f4df40a32aa596721e4609f78906a 100644 --- a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php +++ b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php @@ -161,6 +161,10 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt $this->fieldManager = \Drupal::service('plugin.manager.salesforce_mapping_field'); } + public function __get($key) { + return $this->$key; + } + /** * Save the entity. * diff --git a/modules/salesforce_mapping/src/Form/MappedObjectForm.php b/modules/salesforce_mapping/src/Form/MappedObjectForm.php index 1466e4ac697d835fac05168a2c870cd4da826f96..4c3c9d27587cd43cc6df78d1cb4275013f78a27a 100644 --- a/modules/salesforce_mapping/src/Form/MappedObjectForm.php +++ b/modules/salesforce_mapping/src/Form/MappedObjectForm.php @@ -67,6 +67,15 @@ class MappedObjectForm extends ContentEntityForm { // Include the parent entity on the form. $form = parent::buildForm($form, $form_state); $url_params = \Drupal::routeMatch()->getParameters(); + $drupal_entity = $this->getDrupalEntityFromUrl(); + // Allow exception to bubble up here, because we shouldn't have got here if + // there isn't a mapping. + + $mappings = salesforce_mapping_load_by_drupal($drupal_entity->getEntityTypeId()); + $options = array_keys($mappings) + ['_none']; + // Filter options based on drupal entity type. + $form['salesforce_mapping']['widget']['#options'] = array_intersect_key($form['salesforce_mapping']['widget']['#options'], array_flip($options)); + $form['salesforce_mapping']['widget']['#reqiured'] = TRUE; $form['actions']['push'] = [ '#type' => 'submit', @@ -140,9 +149,9 @@ class MappedObjectForm extends ContentEntityForm { } // Pull from SF. - $mapped_object - ->pull() - ->save(); + $mapped_object->pull(); + $mapped_object->setNewRevision(TRUE); + $mapped_object->save(); // @TODO: more verbose feedback for successful pull. drupal_set_message('Pull successful.');