You are here

public static function CKEditor5::validatePair in Drupal 10

Validates a Text Editor + Text Format pair.

Drupal is designed to only verify schema conformity (and validation) of individual config entities. The Text Editor module layers a tightly coupled Editor entity on top of the Filter module's FilterFormat config entity. This inextricable coupling is clearly visible in EditorInterface: \Drupal\editor\EditorInterface::getFilterFormat(). They are always paired. Because not every text editor is guaranteed to be compatible with every text format, the pair must be validated.

Parameters

\Drupal\editor\EditorInterface $text_editor: The paired text editor to validate.

\Drupal\filter\FilterFormatInterface $text_format: The paired text format to validate.

bool $all_compatibility_problems: Get all compatibility problems (default) or only fundamental ones.

Return value

\Symfony\Component\Validator\ConstraintViolationListInterface The validation constraint violations.

Throws

\InvalidArgumentException Thrown when the text editor is not configured to use CKEditor 5.

See also

\Drupal\editor\EditorInterface::getFilterFormat()

ckeditor5.pair.schema.yml

20 calls to CKEditor5::validatePair()
CKEditor5::validateConfigurationForm in core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
CKEditor5::validateSwitchingToCKEditor5 in core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
Validate callback to inform the user of CKEditor 5 compatibility problems.
CKEditor5CKEditor4Compatibility::setUp in core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php
CKEditor5DialogTest::testCKEditor5FocusInTooltipsInDialog in core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5DialogTest.php
Tests if CKEditor 5 tooltips can be interacted with in dialogs.
CKEditor5IntegrationTest::setUp in core/modules/quickedit/tests/src/FunctionalJavascript/CKEditor5IntegrationTest.php

... See full list

File

core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php, line 212

Class

CKEditor5
Defines a CKEditor 5-based text editor for Drupal.

Namespace

Drupal\ckeditor5\Plugin\Editor

Code

public static function validatePair(EditorInterface $text_editor, FilterFormatInterface $text_format, bool $all_compatibility_problems = TRUE) : ConstraintViolationListInterface {
  if ($text_editor
    ->getEditor() !== 'ckeditor5') {
    throw new \InvalidArgumentException('This text editor is not configured to use CKEditor 5.');
  }
  $typed_config_manager = \Drupal::getContainer()
    ->get('config.typed');
  $typed_config = $typed_config_manager
    ->createFromNameAndData('ckeditor5_valid_pair__format_and_editor', [
    // A mix of:
    // - editor.editor.*.settings — note that "settings" is top-level in
    //   editor.editor.*, and so it is here, so all validation constraints
    //   will continue to work fine.
    'settings' => $text_editor
      ->toArray()['settings'],
    // - filter.format.*.filters — note that "filters" is top-level in
    //   filter.format.*, and so it is here, so all validation constraints
    //   will continue to work fine.
    'filters' => $text_format
      ->toArray()['filters'],
    // - editor.editor.*.image_upload — note that "image_upload" is
    //   top-level in editor.editor.*, and so it is here, so all validation
    //   constraints will continue to work fine.
    'image_upload' => $text_editor
      ->toArray()['image_upload'],
  ]);
  $violations = $typed_config
    ->validate();

  // Only consider validation constraint violations covering the pair, so not
  // irrelevant details such as a PrimitiveTypeConstraint in filter settings,
  // which do not affect CKEditor 5 anyway.
  foreach ($violations as $i => $violation) {
    assert($violation instanceof ConstraintViolation);
    if (explode('.', $violation
      ->getPropertyPath())[0] === 'filters' && is_a($violation
      ->getConstraint(), PrimitiveTypeConstraint::class)) {
      $violations
        ->remove($i);
    }
  }
  if (!$all_compatibility_problems) {
    foreach ($violations as $i => $violation) {

      // Remove all violations that are not fundamental — these are at the
      // root (property path '').
      if ($violation
        ->getPropertyPath() !== '') {
        $violations
          ->remove($i);
      }
    }
  }
  return $violations;
}