Skip to content

Commit da4f899

Browse files
author
Dominic Tubach
committed
Add support for the $limitValidation keyword
The `$limitValidation` keyword allows limited validation under specified conditions. See https://github.com/systopia/opis-json-schema-ext?tab=readme-ov-file#limit-validation
1 parent 553a1b1 commit da4f899

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/Form/AbstractJsonFormsForm.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,13 @@ protected function buildJsonFormsForm(
113113

114114
$definition = DefinitionFactory::createDefinition($uiSchema, $jsonSchema);
115115
$form = $this->formArrayFactory->createFormArray($definition, $formState);
116-
// @phpstan-ignore-next-line
116+
117+
if (TRUE === $formState->get('$limitValidationUsed')) {
118+
// Disable HTML form validation.
119+
// @phpstan-ignore offsetAccess.nonOffsetAccessible
120+
$form['#attributes']['novalidate'] = TRUE;
121+
}
122+
117123
$form['#attributes']['class'][] = 'json-forms';
118124

119125
$form['#attached']['library'][] = 'json_forms/disable_buttons_on_ajax';
@@ -128,6 +134,13 @@ protected function buildJsonFormsForm(
128134
*/
129135
public function validateForm(array &$form, FormStateInterface $formState): void {
130136
if ($formState->isSubmitted() || $formState->isValidationEnforced()) {
137+
if (TRUE === $formState->get('$limitValidationUsed')) {
138+
// We cannot use Drupal validation errors if the form uses limited
139+
// validation. They might contain errors that with the submitted data
140+
// would be ignored. (Avoiding Drupal validation is not possible on form
141+
// submit.)
142+
$formState->clearErrors();
143+
}
131144
parent::validateForm($form, $formState);
132145
FormCallbackExecutor::executePreSchemaValidationCallbacks($formState);
133146
$validationResult = $this->formValidator->validate(

src/Form/FormArrayFactory.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public function __construct(ConcreteFormArrayFactoryInterface ...$formArrayFacto
4040
}
4141

4242
public function createFormArray(DefinitionInterface $definition, FormStateInterface $formState): array {
43+
if (NULL !== $definition->getKeywordValue('$limitValidation')) {
44+
$formState->set('$limitValidationUsed', TRUE);
45+
}
46+
4347
foreach ($this->formArrayFactories as $factory) {
4448
if ($factory->supportsDefinition($definition)) {
4549
$form = $factory->createFormArray($definition, $formState, $this);

0 commit comments

Comments
 (0)