You are here

public function UniqueFieldsConstraintValidator::validate in Salesforce Suite 8.3

Same name and namespace in other branches
  1. 8.4 modules/salesforce_mapping/src/Plugin/Validation/Constraint/UniqueFieldsConstraintValidator.php \Drupal\salesforce_mapping\Plugin\Validation\Constraint\UniqueFieldsConstraintValidator::validate()
  2. 5.0.x modules/salesforce_mapping/src/Plugin/Validation/Constraint/UniqueFieldsConstraintValidator.php \Drupal\salesforce_mapping\Plugin\Validation\Constraint\UniqueFieldsConstraintValidator::validate()

File

modules/salesforce_mapping/src/Plugin/Validation/Constraint/UniqueFieldsConstraintValidator.php, line 16

Class

UniqueFieldsConstraintValidator
Validates that a set of fields are unique for the given entity type.

Namespace

Drupal\salesforce_mapping\Plugin\Validation\Constraint

Code

public function validate($entity, Constraint $constraint) {
  $entity_type = $entity
    ->getEntityType();
  $id_key = $entity_type
    ->getKey('id');
  $query = \Drupal::entityQuery($entity_type
    ->id())
    ->condition($id_key, (int) $entity
    ->id(), '<>')
    ->range(0, 1);
  foreach ($constraint->fields as $field) {
    $field_name = $field;
    $property = '';
    if (strpos($field_name, '.')) {
      list($field_name, $property) = explode('.', $field_name, 2);
    }
    else {
      $property = $entity->{$field}
        ->getFieldDefinition()
        ->getMainPropertyName();
    }
    $value = $entity->{$field_name}->{$property};
    $query
      ->condition($field, $value);
  }
  if ($id = $query
    ->execute()) {
    $id = reset($id);
    $entity = \Drupal::entityTypeManager()
      ->getStorage($entity_type
      ->id())
      ->load($id);
    $url = $entity
      ->toUrl();
    $message_replacements = [
      '@entity_type' => $entity_type
        ->getLowercaseLabel(),
      ':url' => $url
        ->toString(),
      '@label' => $entity
        ->label(),
    ];
    $this->context
      ->addViolation($constraint->message, $message_replacements);
  }
}