Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • project/salesforce
  • issue/salesforce-2975914
  • issue/salesforce-3168388
  • issue/salesforce-3169218
  • issue/salesforce-3072830
  • issue/salesforce-3170030
  • issue/salesforce-3170137
  • issue/salesforce-3173210
  • issue/salesforce-3177326
  • issue/salesforce-3181364
  • issue/salesforce-3279290
  • issue/salesforce-3203287
  • issue/salesforce-3204383
  • issue/salesforce-3204704
  • issue/salesforce-3217061
  • issue/salesforce-3217586
  • issue/salesforce-3102133
  • issue/salesforce-3210809
  • issue/salesforce-3221747
  • issue/salesforce-3222661
  • issue/salesforce-3222940
  • issue/salesforce-3226511
  • issue/salesforce-3226070
  • issue/salesforce-3222683
  • issue/salesforce-3120102
  • issue/salesforce-3231850
  • issue/salesforce-3281008
  • issue/salesforce-3213468
  • issue/salesforce-3247923
  • issue/salesforce-3255740
  • issue/salesforce-3257058
  • issue/salesforce-3276564
  • issue/salesforce-3284336
  • issue/salesforce-3310785
  • issue/salesforce-3312317
  • issue/salesforce-3312979
  • issue/salesforce-3320557
  • issue/salesforce-3340664
  • issue/salesforce-3358568
  • issue/salesforce-3404815
  • issue/salesforce-3400562
  • issue/salesforce-3400903
  • issue/salesforce-3400897
  • issue/salesforce-3405570
  • issue/salesforce-3349963
  • issue/salesforce-3389025
  • issue/salesforce-3154024
  • issue/salesforce-3395912
  • issue/salesforce-3396890
  • issue/salesforce-3398897
  • issue/salesforce-3408393
  • issue/salesforce-3410886
  • issue/salesforce-3411280
  • issue/salesforce-3414401
  • issue/salesforce-3414659
  • issue/salesforce-3415336
  • issue/salesforce-3415242
  • issue/salesforce-3417891
  • issue/salesforce-3417994
  • issue/salesforce-3419551
  • issue/salesforce-3419804
  • issue/salesforce-3382005
  • issue/salesforce-3418124
  • issue/salesforce-3427415
  • issue/salesforce-3427904
  • issue/salesforce-3428593
  • issue/salesforce-3443380
  • issue/salesforce-3443506
  • issue/salesforce-3439625
  • issue/salesforce-3442186
  • issue/salesforce-3445088
  • issue/salesforce-3432569
  • issue/salesforce-3449141
  • issue/salesforce-3449163
  • issue/salesforce-3460395
  • issue/salesforce-3472489
  • issue/salesforce-3472706
  • issue/salesforce-3460502
  • issue/salesforce-3477260
  • issue/salesforce-3209120
  • issue/salesforce-3491809
  • issue/salesforce-3495316
  • issue/salesforce-3492972
  • issue/salesforce-3497252
  • issue/salesforce-3502753
  • issue/salesforce-3503227
  • issue/salesforce-3511455
  • issue/salesforce-3512519
  • issue/salesforce-3514383
89 results
Show changes
Commits on Source (9)
Showing
with 158 additions and 44 deletions
name: Salesforce Address
type: module
description: A custom Address Field Widget for Salesforce compatibility.
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
package: Salesforce
dependencies:
- address:address
name: Salesforce Example
type: module
description: Salesforce Examples
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
package: Salesforce
dependencies:
- salesforce:salesforce_push
......
name: Salesforce JWT Auth Provider
type: module
description: Provides key-based Salesforce authentication.
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
package: Salesforce
configure: salesforce.auth_config
dependencies:
......
......@@ -177,6 +177,7 @@ class SalesforceJWTPlugin extends SalesforceAuthProviderPluginBase {
$response = $this->httpClient->retrieveResponse(new Uri($this->getLoginUrl() . static::AUTH_TOKEN_PATH), $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
$token = $this->parseAccessTokenResponse($response);
$this->storage->storeAccessToken($this->service(), $token);
$this->refreshIdentity($token);
return $token;
}
......@@ -184,7 +185,9 @@ class SalesforceJWTPlugin extends SalesforceAuthProviderPluginBase {
* {@inheritDoc}
*/
public function refreshAccessToken(TokenInterface $token) {
return $this->requestAccessToken($this->generateAssertion());
$token = $this->requestAccessToken($this->generateAssertion());
$this->refreshIdentity($token);
return $token;
}
/**
......
name: Salesforce Logger
type: module
description: Consolidated logging for Salesforce Log events.
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
package: Salesforce
configure: salesforce_logger.settings
dependencies:
......
......@@ -2,7 +2,7 @@ name: Salesforce Mapping
type: module
description: Map Drupal entities to Salesforce objects.
package: Salesforce
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
dependencies:
- salesforce:salesforce
- dynamic_entity_reference:dynamic_entity_reference
......
......@@ -565,7 +565,7 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt
* {@inheritdoc}
*/
public function getLastDeleteTime() {
return $this->pull_info['last_delete_timestamp'] ? $this->pull_info['last_delete_timestamp'] : NULL;
return $this->pull_info['last_delete_timestamp'] ?? NULL;
}
/**
......@@ -579,7 +579,7 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt
* {@inheritdoc}
*/
public function getLastPullTime() {
return $this->pull_info['last_pull_timestamp'] ? $this->pull_info['last_pull_timestamp'] : NULL;
return $this->pull_info['last_pull_timestamp'] ?? NULL;
}
/**
......
......@@ -2,6 +2,7 @@
namespace Drupal\salesforce_mapping\Plugin\SalesforceMappingField;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
......@@ -90,11 +91,14 @@ abstract class PropertiesBase extends SalesforceMappingFieldPluginBase {
->objectDescribe($mapping->getSalesforceObjectType());
$field_definition = $describe->getField($this->config('salesforce_field'));
if ($field_definition['type'] == 'multipicklist') {
$values = [];
foreach ($entity->get($this->config('drupal_field_value')) as $value) {
$values[] = $this->getStringValue($entity, $value);
$data = $this->getDataValue($entity, $this->config('drupal_field_value'));
if (!empty($data)) {
$strings = [];
foreach ($data as $item) {
$strings[] = $item->getString();
}
return implode(';', $strings);
}
return implode(';', $values);
}
else {
return $this->getStringValue($entity, $this->config('drupal_field_value'));
......@@ -211,8 +215,30 @@ abstract class PropertiesBase extends SalesforceMappingFieldPluginBase {
*/
protected function getStringValue(EntityInterface $entity, $drupal_field_value) {
try {
return $this->dataFetcher()->fetchDataByPropertyPath($entity->getTypedData(), $drupal_field_value)
->getString();
$data = $this->getDataValue($entity, $drupal_field_value);
return empty($data) ? NULL : $data->getString();
}
catch (\Exception $e) {
return NULL;
}
}
/**
* Another helper Method to check for and retrieve field data.
*
* Same as getStringValue(), but returns the typed data prior to stringifying.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity to search the Typed Data for.
* @param string $drupal_field_value
* The Typed Data property to get.
*
* @return \Drupal\Core\TypedData\TypedDataInterface|NULL
* The array representation of the Typed Data property value.
*/
protected function getDataValue(EntityInterface $entity, $drupal_field_value) {
try {
return $this->dataFetcher()->fetchDataByPropertyPath($entity->getTypedData(), $drupal_field_value);
}
catch (\Exception $e) {
return NULL;
......
......@@ -51,7 +51,7 @@ class RelatedProperties extends SalesforceMappingFieldPluginBase {
* {@inheritdoc}
*/
public function value(EntityInterface $entity, SalesforceMappingInterface $mapping) {
list($field_name, $referenced_field_name) = explode(':', $this->config('drupal_field_value'), 2);
[$field_name, $referenced_field_name] = explode(':', $this->config('drupal_field_value'), 2);
// Since we're not setting hard restrictions around bundles/fields, we may
// have a field that doesn't exist for the given bundle/entity. In that
// case, calling get() on an entity with a non-existent field argument
......@@ -80,7 +80,9 @@ class RelatedProperties extends SalesforceMappingFieldPluginBase {
if ($field_definition['type'] == 'multipicklist') {
$values = [];
foreach ($field as $ref_entity) {
$values[] = $ref_entity->entity->get($referenced_field_name)->value;
if (!$ref_entity->entity->get($referenced_field_name)->isEmpty()) {
$values[] = $ref_entity->entity->get($referenced_field_name)->value;
}
}
return implode(';', $values);
}
......@@ -101,7 +103,7 @@ class RelatedProperties extends SalesforceMappingFieldPluginBase {
$definition['config_dependencies']['config'] = [];
$field_name = $this->config('drupal_field_value');
if (strpos($field_name, ':')) {
list($field_name, $dummy) = explode(':', $field_name, 2);
[$field_name, $dummy] = explode(':', $field_name, 2);
}
// Add reference field.
if ($field = FieldConfig::loadByName($this->mapping->getDrupalEntityType(), $this->mapping->getDrupalBundle(), $field_name)) {
......
......@@ -41,7 +41,7 @@ class UniqueFieldsConstraintValidator extends ConstraintValidator {
->load($id);
$url = $entity->toUrl();
$message_replacements = [
'@entity_type' => $entity_type->getLowercaseLabel(),
'@entity_type' => $entity_type->getSingularLabel(),
':url' => $url->toString(),
'@label' => $entity->label(),
];
......
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_salesforce_test_multi
- node.type.salesforce_mapping_test_content
module:
- options
id: node.salesforce_mapping_test_content.field_salesforce_test_multi
field_name: field_salesforce_test_multi
entity_type: node
bundle: salesforce_mapping_test_content
label: 'Salesforce Test Multi'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings: { }
field_type: list_string
langcode: en
status: true
dependencies:
module:
- node
- options
id: node.field_salesforce_test_multi
field_name: field_salesforce_test_multi
entity_type: node
type: list_string
settings:
allowed_values:
-
value: 'Value 1'
label: 'Value 1'
-
value: 'Value 2'
label: 'Value 2'
-
value: 'Value 3'
label: 'Value 3'
allowed_values_function: ''
module: options
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
langcode: en
status: true
dependencies: { }
name: 'Salesforce Mapping Test Content Type'
type: salesforce_mapping_test_content
description: ''
......
......@@ -6,12 +6,15 @@ dependencies:
- field.field.node.salesforce_mapping_test_content.field_salesforce_test_date
- field.field.node.salesforce_mapping_test_content.field_salesforce_test_email
- field.field.node.salesforce_mapping_test_content.field_salesforce_test_link
- field.field.node.salesforce_mapping_test_content.field_salesforce_test_multi
- field.field.node.salesforce_mapping_test_content.field_salesforce_test_reference
- field.storage.node.field_salesforce_test_link
- field.storage.node.field_salesforce_test_reference
- node.type.salesforce_mapping_test_content
module:
- link
- salesforce_pull
- salesforce_push
id: test_mapping
label: 'Test Mapping'
weight: 0
......@@ -38,49 +41,64 @@ field_mappings:
drupal_field_value: 'SALESFORCE TEST'
salesforce_field: FirstName
direction: drupal_sf
id: 8
description: ''
id: 0
-
drupal_field_type: DrupalConstant
drupal_field_value: title
direction: sf_drupal
description: ''
drupal_constant: 'SALESFORCE TEST'
id: 9
id: 1
-
drupal_field_type: properties
drupal_field_value: field_salesforce_test_email
salesforce_field: Email
direction: sync
id: 10
description: ''
id: 2
-
drupal_field_type: properties
drupal_field_value: field_salesforce_test_date
drupal_field_value: field_salesforce_test_date.value
salesforce_field: Birthdate
direction: sync
id: 11
description: ''
id: 3
-
drupal_field_type: properties
drupal_field_value: field_salesforce_test_bool
salesforce_field: d5__Do_Not_Mail__c
direction: sync
id: 12
description: ''
id: 4
-
drupal_field_type: properties_extended
drupal_field_value: field_salesforce_test_link.uri
salesforce_field: Description
direction: sync
id: 13
description: ''
id: 5
-
drupal_field_type: RelatedIDs
drupal_field_value: field_salesforce_test_reference
salesforce_field: ReportsToId
direction: sync
id: 14
description: ''
id: 6
-
drupal_field_type: record_type
drupal_field_value: Contact_Type_1
salesforce_field: RecordTypeId
direction: drupal_sf
id: 15
description: ''
id: 7
-
drupal_field_type: properties
drupal_field_value: field_salesforce_test_multi
salesforce_field: d5__Multipicklist_Test__c
direction: sync
description: ''
id: 8
push_limit: 0
push_retries: 3
push_frequency: 0
......
......@@ -7,6 +7,10 @@ dependencies:
- datetime
- link
- node
- options
- user
- salesforce_mapping
- salesforce_push
- salesforce_pull
- salesforce_test_rest_client
- taxonomy
......@@ -4,6 +4,7 @@ namespace Drupal\Tests\salesforce_mapping\Functional;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\Node;
use Drupal\salesforce_mapping\Entity\MappedObject;
use Drupal\salesforce_mapping\Entity\SalesforceMapping;
......@@ -32,8 +33,12 @@ class PushParamsTest extends BrowserTestBase {
*/
public static $modules = [
'typed_data',
'options',
'dynamic_entity_reference',
'salesforce',
'salesforce_mapping',
'salesforce_push',
'salesforce_pull',
'salesforce_mapping_test',
];
......@@ -54,12 +59,11 @@ class PushParamsTest extends BrowserTestBase {
$entity1->save();
// Mapped Object to be used for RelatedIDs push params property.
$mappedObject = MappedObject::create([
'drupal_entity' => $entity1,
'salesforce_mapping' => $mapping,
'salesforce_id' => '0123456789ABCDEFGH',
'salesforce_link' => NULL,
]);
$mappedObject = \Drupal::entityTypeManager()
->getStorage('salesforce_mapped_object')
->loadByEntityAndMapping($entity1, $mapping);
$mappedObject->set('salesforce_id', '0123456789ABCDEFGH');
$mappedObject->save();
// Entity 2 to be mapped to Salesforce.
......@@ -71,6 +75,7 @@ class PushParamsTest extends BrowserTestBase {
'field_salesforce_test_email' => 'test2@example.com',
'field_salesforce_test_link' => 'https://example.com',
'field_salesforce_test_reference' => $entity1,
'field_salesforce_test_multi' => [['value' => 'Value 1'], ['value' => 'Value 2'], ['value' => 'Value 3']],
]);
$entity2->save();
......@@ -81,11 +86,12 @@ class PushParamsTest extends BrowserTestBase {
$expected = [
'FirstName' => 'SALESFORCE TEST',
'Email' => 'test2@example.com',
'Birthdate' => $expectedDate->format(DateTime::ISO8601),
'Birthdate' => $expectedDate->format('Y-m-d\TH:i:sO'),
'd5__Do_Not_Mail__c' => TRUE,
'ReportsToId' => '0123456789ABCDEFGH',
'RecordTypeId' => '012i0000001B15mAAC',
'Description' => 'https://example.com',
'd5__Multipicklist_Test__c' => 'Value 1;Value 2;Value 3'
];
$actual = $pushParams->getParams();
ksort($actual);
......@@ -108,12 +114,11 @@ class PushParamsTest extends BrowserTestBase {
$entity1->save();
// Mapped Object to be used for RelatedIDs push params property.
$mappedObject = MappedObject::create([
'drupal_entity' => $entity1,
'salesforce_mapping' => $mapping,
'salesforce_id' => '0123456789ABCDEFGH',
'salesforce_link' => NULL,
]);
$mappedObject = \Drupal::entityTypeManager()
->getStorage('salesforce_mapped_object')
->loadByEntityAndMapping($entity1, $mapping);
$mappedObject->set('salesforce_id', '0123456789ABCDEFGH');
$mappedObject->save();
// Entity 2 to be mapped to Salesforce.
......@@ -125,6 +130,7 @@ class PushParamsTest extends BrowserTestBase {
'field_salesforce_test_email' => 'test2@example.com',
'field_salesforce_test_link' => 'https://example.com',
'field_salesforce_test_reference' => $entity1,
'field_salesforce_test_multi' => ['Value 1', 'Value 2', 'Value 3'],
]);
$entity2->save();
......@@ -133,11 +139,12 @@ class PushParamsTest extends BrowserTestBase {
$expected = [
'FirstName' => 'SALESFORCE TEST',
'Email' => 'test2@example.com',
'Birthdate' => '',
'Birthdate' => null,
'd5__Do_Not_Mail__c' => TRUE,
'ReportsToId' => '0123456789ABCDEFGH',
'RecordTypeId' => '012i0000001B15mAAC',
'Description' => 'https://example.com',
'd5__Multipicklist_Test__c' => 'Value 1;Value 2;Value 3'
];
$actual = $pushParams->getParams();
ksort($actual);
......
......@@ -2,7 +2,7 @@ name: Salesforce Mapping UI
type: module
description: User interface for managing Salesforce mappings.
package: Salesforce
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
configure: entity.salesforce_mapping.list
dependencies:
- salesforce:salesforce_mapping
salesforce_mapping.entities:
class: \Drupal\Core\Menu\LocalTaskDefault
deriver: \Drupal\salesforce_mapping_ui\Plugin\Derivative\SalesforceMappingLocalTask
salesforce_mapped_object.admin:
title: Salesforce
base_route: system.admin_content
......
name: Salesforce OAuth user-agent Provider
type: module
description: Provides user-agent-based Salesforce OAuth authentication.
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
package: Salesforce
configure: salesforce.auth_config
dependencies:
......
......@@ -2,6 +2,6 @@ name: Salesforce Pull
type: module
description: Imports objects from Salesforce based on mappings defined in Salesforce Mapping.
package: Salesforce
core_version_requirement: ^8.7.7 || ^9
core_version_requirement: ^8.7.7 || 9.0.*
dependencies:
- salesforce:salesforce_mapping