Magnolia — Проверка перекрестных полей

#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. спасибо за решение. Мы попробовали другой подход. Когда пользователь нажимает на кнопку сохранения в пользовательском интерфейсе, мы обрабатываем проверки, считывая данные формы просмотра этих полей и показывая им предупреждающее сообщение с соответствующим сообщением.