Skip to content

Commit eae446b

Browse files
committed
#1249 Fix advanced enrichment validation
1 parent 2bf6340 commit eae446b

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

modules/admin/forms/Document/Enrichment.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,15 @@ private function createValueFormElement($enrichmentValue, $enrichmentKey = null,
174174
// vom Benutzer nicht verändert wurde)
175175
$elementValue = $element->getValue();
176176
$isValidValue = false;
177-
if (! ($elementValue === false)) {
178-
$isValidValue = $element->isValid($value);
177+
if ($elementValue !== false) {
178+
$isValidValue = $element->isValid($value); // TODO always needed because of side effects
179+
if ($enrichmentType->getFormElementName() === 'Select') {
180+
$values = $enrichmentType->getValues();
181+
$isValidValue = in_array($value, $values);
182+
if ($isValidValue) {
183+
$element->removeDecorator('Errors');
184+
}
185+
}
179186

180187
// der Aufruf der isValid-Methode hat einen Seiteneffekt, der bei Select-Elementen
181188
// zum Ersetzen des Index durch den tatsächlichen Wert führt
@@ -195,6 +202,23 @@ private function createValueFormElement($enrichmentValue, $enrichmentKey = null,
195202
}
196203
}
197204
}
205+
} else {
206+
/* TODO show error message immediately if value cannot be saved (strict validation)
207+
The message does not disappear right if another value is selected. The
208+
Javascript in validation.js does not support 'errors', just 'datahint'.
209+
*/
210+
if ($enrichmentType->getFormElementName() === 'Select') {
211+
$values = $enrichmentType->getValues();
212+
if (! in_array($value, $values)) {
213+
$this->getElement(self::ELEMENT_VALUE)->markAsError();
214+
$element->setAttrib('data-opusValidationError', 'true'); // wird vom JavaScript-Code ausgewertet
215+
}
216+
} else {
217+
if (! $element->isValid($value)) {
218+
$this->getElement(self::ELEMENT_VALUE)->markAsError();
219+
$element->setAttrib('data-opusValidationError', 'true'); // wird vom JavaScript-Code ausgewertet
220+
}
221+
}
198222
}
199223
}
200224

@@ -261,7 +285,7 @@ public function updateModel($enrichment)
261285
// keine Behandlung von Enrichments, die noch nicht in der Datenbank gespeichert sind,
262286
// (nach dem Hinzufügen von Enrichments über Hinzufügen-Button)
263287
if (! in_array($enrichment->getValue(), $enrichmentType->getValues())) {
264-
if ($enrichmentValue === 0) {
288+
if ((int) $enrichmentValue === 0) {
265289
return; // keine Änderung des Enrichment-Werts
266290
}
267291

public/layouts/opus4/js/validation.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -277,25 +277,31 @@ $(document).ready(function () {
277277
* darauf hinweist, dass der aktuelle Formularwert gegen die Typkonfiguration des Enrichment-Keys verstößt,
278278
* ausgeblendet werden, wenn der Formularwert geändert wird. Wird der Wert auf den ursprünglichen Formularwert
279279
* zurückgesetzt, so soll der Hinweistext wieder eingeblendet werden (ohne Interaktion mit dem Server).
280+
*
281+
* TODO Fehlermeldungen bei der strikten Validierung sollen sich genauso verhalten.
280282
*/
281283
$("input[data-opusValidationError='true'], select[data-opusValidationError='true']").on('input', function (event) {
282284
var element = $(this);
283-
var errorMessage = element.next(".datahint");
284-
if (errorMessage) {
285-
var oldValue = errorMessage.data('errorValue');
285+
var messageElement = element.next(".datahint");
286+
var errorMessage = element.next(".errors");
287+
if (errorMessage.length ) {
288+
messageElement = errorMessage;
289+
}
290+
if (messageElement) {
291+
var oldValue = messageElement.data('errorValue');
286292
if (typeof oldValue === 'undefined' && (typeof event.target.defaultValue !== 'undefined')) {
287293
// Input-Element wird das erste Mal behandelt (beim Select-Element brauchen wir den Ursprungswert nicht speichern)
288-
errorMessage.data('errorValue', event.target.defaultValue);
294+
messageElement.data('errorValue', event.target.defaultValue);
289295
}
290296

291-
if (errorMessage.is(":visible")) {
292-
errorMessage.hide();
297+
if (messageElement.is(":visible")) {
298+
messageElement.hide();
293299
} else {
294-
if (element.val() === errorMessage.data('errorValue') ||
295-
((typeof errorMessage.data('errorValue') === 'undefined') && element.val() === '0')) {
300+
if (element.val() === messageElement.data('errorValue') ||
301+
((typeof messageElement.data('errorValue') === 'undefined') && element.val() === '0')) {
296302
// beim Zurücksetzen auf den Ursprungswert Fehlermeldung wieder einblenden
297303
// Sonderbehandlung für Select-Element: dort steht der Ursprungswert in der Auswahlliste immer an Position 0
298-
errorMessage.show();
304+
messageElement.show();
299305
}
300306
}
301307
}

0 commit comments

Comments
 (0)