#magnolia
#magnolia
Вопрос:
У нас есть следующие требования.
Поле 1: comboBoxField, и оно является обязательным.
Поле 2: поле comboBoxField
Случай 1. Если редактор выбирает значение поля 1 «value1», то поле 2 является обязательным
Случай 2: если редактор выбирает значение поля 1 «value2», то поле 2 является необязательным.
Как выполнить эту проверку либо в форме / проверке поля перед действием фиксации.
Или как мы проверяем действие фиксации.
Любая зацепка мне очень поможет. Я надолго застрял в этой проблеме.
Я пробовал использовать перекрестные поля, динамические поля, переключаемые и составные поля, как предложено в документации, но я получил исключения нулевого указателя. Если вы знаете решение, пожалуйста, поделитесь также фрагментом кода.
Ответ №1:
Я также страдал от этого типа проверки. Проблема заключается в изоляции полей. Я не смог найти способ проверки одного поля в зависимости от значения другого поля.
В любом случае я нашел обходное решение. Я объединяю два зависимых поля со сложным полем и создаю для него средство проверки.
Вот мой код для Magnolia 5.7 и валидатора vaadin (это устаревшая 7-я версия, тем не менее, логика будет такой же с 8-й версией).
public class CompanyRequiredFieldsValidator implements Validator {
private final ConfiguredFieldValidatorDefinition definition;
public CompanyRequiredFieldsValidator(ConfiguredFieldValidatorDefinition definition) {
this.definition = definition;
}
@Override
public void validate(Object value) throws InvalidValueException {
Optional<String> companyName = getString(value, "companyName");
if (companyName.isPresent()) {
getString(value, "companyAddress")
.orElseThrow(() -> new InvalidValueException(definition.getErrorMessage()));
}
}
private Optional<String> getString(Object value, String property) {
return Optional.of(value)
.filter(Item.class::isInstance).map(Item.class::cast)
.map(_v -> _v.getItemProperty(property))
.map(Property::getValue)
.filter(String.class::isInstance).map(String.class::cast)
.filter(StringUtils::isNotEmpty);
}
}
Для сложных полей проверенное значение имеет com.vaadin.v7.data.Тип элемента, поэтому из него можно получить все свойства.
Единственная проблема в том, что в сообщении об ошибке не выделяется внутреннее поле, а только целое комплексное поле.
Комментарии:
1. спасибо за решение. Мы попробовали другой подход. Когда пользователь нажимает на кнопку сохранения в пользовательском интерфейсе, мы обрабатываем проверки, считывая данные формы просмотра этих полей и показывая им предупреждающее сообщение с соответствующим сообщением.