Wicket IFormValidator - пометить несколько FormComponents как недействительные - PullRequest
0 голосов
/ 22 мая 2019

У меня есть IFormValidator, который проверяет, являются ли значения нескольких FormComponents связными.

Теперь, если проверка не пройдена, я бы хотел выделить все связанные с FormComponents и соответствующиеТеги HTML label, как это происходит с валидаторами, которые отвечают только за один компонент FormComponent (например, StringValidator).

Моя первая попытка была вызвать FormComponent#invalid() для всех связанных компонентов FormComponent, но это непохоже, не сработает, так как он просто вызывает FormComponent#onInvalid(), который по умолчанию ничего не делает.

Второе, что я пробовал, вызывал FormComponent#error(String) для каждого компонента, но это, конечно, генерирует дополнительное сообщение об ошибкедля каждого FormComponent, который не является желаемым поведением.Но, по крайней мере, он выделяет отдельные недействительные FormComponents.

Каков будет правильный способ сделать это?Есть ли простой способ, который я пропускаю, так как метод IFormValidator#getDependentFormComponents(), который я должен реализовать, уже сообщает Validator, какие FormComponents будут недействительными в результате неудачной проверки?

Вотупрощенный пример того, что я пробовал с Wicket 8.3:

wicketForm.add(new IFormValidator() {

        @Override
        public FormComponent<?>[] getDependentFormComponents() {
            return new FormComponent<?>[] {formComponent1, formComponent2, formComponent3};
        }

        @Override
        public void validate(Form<?> form) {
            if (/*values of formComponent1-3 are not coherent*/) {
                form.error("<error message>");

                /* No highlighting at all */
                formComponent1.invalid();
                formComponent2.invalid();
                formComponent3.invalid();

                /* Highlighting works, but obviously produces same error message multiple times */
                formComponent1.error("<error message>");
                formComponent2.error("<error message>");
                formComponent3.error("<error message>");
            }
        }
    }
);

1 Ответ

0 голосов
/ 22 мая 2019

FormComponent считается недействительным только при вызове его #error() методов - см. org.apache.wicket.markup.html.form.FormComponent#isValid().

Если вы хотите показать только сообщение об ошибке обратной связи формы, вам нужно создать экземпляр своей FeedbackPanelas:

new FencedFeedbackPanel("id", new ComponentFeedbackMessageFilter(form));

Таким образом, он будет отображать сообщения обратной связи только формы.

Вы можете использовать сообщения обратной связи компонентов формы, чтобы показать их конкретные ошибки рядом с соответствующим HTMLэлемент формы (input, select и т. д.)

...