You are here

public function EntityConstraintViolationList::filterByFields in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Entity/EntityConstraintViolationList.php \Drupal\Core\Entity\EntityConstraintViolationList::filterByFields()

Filters this violation list by the given fields.

The returned object just has violations attached to the provided fields.

When violations should be displayed for a sub-set of visible fields only, this method may be used to filter the set of visible violations first.

Parameters

string[] $field_names: The names of the fields to filter violations for.

Return value

$this

Overrides EntityConstraintViolationListInterface::filterByFields

1 call to EntityConstraintViolationList::filterByFields()
EntityConstraintViolationList::filterByFieldAccess in core/lib/Drupal/Core/Entity/EntityConstraintViolationList.php
Filters this violation list to apply for accessible fields only.

File

core/lib/Drupal/Core/Entity/EntityConstraintViolationList.php, line 120

Class

EntityConstraintViolationList
Implements an entity constraint violation list.

Namespace

Drupal\Core\Entity

Code

public function filterByFields(array $field_names) {
  $this
    ->groupViolationOffsets();
  $new_violations = [];
  foreach (array_intersect_key($this->violationOffsetsByField, array_flip($field_names)) as $field_name => $offsets) {
    foreach ($offsets as $offset) {
      $violation = $this
        ->get($offset);

      // Take care of composite field violations and re-map them to some
      // covered field if necessary.
      if ($violation
        ->getConstraint() instanceof CompositeConstraintBase) {
        $covered_fields = $violation
          ->getConstraint()
          ->coversFields();

        // Keep the composite field if it covers some remaining field and put
        // a violation on some other covered field instead.
        if ($remaining_fields = array_diff($covered_fields, $field_names)) {
          $message_params = [
            '%field_name' => $field_name,
          ];
          $violation = new ConstraintViolation($this
            ->t('The validation failed because the value conflicts with the value in %field_name, which you cannot access.', $message_params), 'The validation failed because the value conflicts with the value in %field_name, which you cannot access.', $message_params, $violation
            ->getRoot(), reset($remaining_fields), $violation
            ->getInvalidValue(), $violation
            ->getPlural(), $violation
            ->getCode(), $violation
            ->getConstraint(), $violation
            ->getCause());
          $new_violations[] = $violation;
        }
      }
      $this
        ->remove($offset);
    }
  }
  foreach ($new_violations as $violation) {
    $this
      ->add($violation);
  }
  return $this;
}