You are here

public function CKEditor5ElementConstraintValidator::validate in Drupal 10

Throws

\Symfony\Component\Validator\Exception\UnexpectedTypeException Thrown when the given constraint is not supported by this validator.

File

core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php, line 24

Class

CKEditor5ElementConstraintValidator
CKEditor 5 element validator.

Namespace

Drupal\ckeditor5\Plugin\Validation\Constraint

Code

public function validate($element, $constraint) {
  if (!$constraint instanceof CKEditor5ElementConstraint) {
    throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\CKEditor5Element');
  }
  $parsed = HTMLRestrictions::fromString($element);
  if ($parsed
    ->allowsNothing() || count($parsed
    ->getAllowedElements()) > 1 || $element !== $parsed
    ->toCKEditor5ElementsArray()[0]) {
    $this->context
      ->buildViolation($constraint->message)
      ->setParameter('%provided_element', $element)
      ->addViolation();
  }

  // The optional "requiredAttributes" constraint property allows more
  // detailed validation.
  if (isset($constraint->requiredAttributes)) {
    $allowed_elements = $parsed
      ->getAllowedElements();
    $tag = array_keys($allowed_elements)[0];
    $attribute_restrictions = $allowed_elements[$tag];
    assert(is_array($constraint->requiredAttributes));
    foreach ($constraint->requiredAttributes as $required_attribute) {

      // Validate attributeName.
      $required_attribute_name = $required_attribute['attributeName'];
      if (!is_array($attribute_restrictions) || !isset($attribute_restrictions[$required_attribute_name])) {
        $this->context
          ->buildViolation($constraint->missingRequiredAttributeMessage)
          ->setParameter('@provided_element', $element)
          ->setParameter('@required_attribute_name', $required_attribute_name)
          ->addViolation();
        continue;
      }
      $attribute_values = $attribute_restrictions[$required_attribute_name];

      // Validate minAttributeValueCount if specified.
      if (isset($required_attribute['minAttributeValueCount'])) {
        $min_attribute_value_count = $required_attribute['minAttributeValueCount'];
        if (!is_array($attribute_values) || count($attribute_values) < $min_attribute_value_count) {
          $this->context
            ->buildViolation($constraint->requiredAttributeMinValuesMessage)
            ->setParameter('@provided_element', $element)
            ->setParameter('@required_attribute_name', $required_attribute_name)
            ->setParameter('@min_attribute_value_count', $min_attribute_value_count)
            ->addViolation();
          continue;
        }
      }
    }
  }
}