function CKEditor5ElementConstraintValidator::validate

Same name and namespace in other branches
  1. 10 core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php \Drupal\ckeditor5\Plugin\Validation\Constraint\CKEditor5ElementConstraintValidator::validate()
  2. 11.x core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php \Drupal\ckeditor5\Plugin\Validation\Constraint\CKEditor5ElementConstraintValidator::validate()

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;
                }
            }
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.