Добавлена ​​панель обратной связи, но не все сообщения - PullRequest
1 голос
/ 06 ноября 2011

У меня есть некоторая базовая форма, когда вы вводите электронную почту, старый пароль, новый пароль и повторяете новый проход для изменения вашего профиля.То, что я пытаюсь достичь, это отображать сообщение обратной связи, когда проход неправильный.Кусок кода выглядит следующим образом:

public class EditProfileForm extends Form<Void>
{
private static final long serialVersionUID = 1L;

// El-cheapo model for form
private final ValueMap properties = new ValueMap();

private ModalWindow modalWindow;

@SpringBean
UserManager userManager;

@SpringBean
Validator validator;

private User user;

private static final String EMAIL = "mp-email";
private static final String OLD_PASS = "mp-oldpass";
private static final String NEW_PASS = "mp-newpass";
private static final String NEW_PASS_REPEAT = "mp-newpassrepeat";

private static final String ERROR_WRONG_PASS = "Wrong pass";
private static final String ERROR_PASS_DIFF = "Pass diff";
private static final String ERROR_EMAIL_INVALID = "Wrong email";
private static final String ERROR_EMAIL_EXISTS = "Email used";

public EditProfileForm( String id, final ModalWindow modalWindow,final User u )
{
    super( id );
    this.user = u;
    this.modalWindow = modalWindow;

    add( new TextField<String>( EMAIL, new PropertyModel<String>( properties, EMAIL ) ).setRequired(true).setOutputMarkupId(true) );
    add( new PasswordTextField( OLD_PASS, new PropertyModel<String>( properties, OLD_PASS ) ).setOutputMarkupId(true) );
    add( new PasswordTextField( NEW_PASS, new PropertyModel<String>( properties, NEW_PASS ) ).setOutputMarkupId(true) );
    add( new PasswordTextField( NEW_PASS_REPEAT, new PropertyModel<String>( properties, NEW_PASS_REPEAT ) ).setOutputMarkupId(true) );

    final FeedbackPanel feedbackPanel = new FeedbackPanel( "feedback" );
    feedbackPanel.setOutputMarkupId( true );
    //feedbackPanel.setMaxMessages( 5 );

    add( feedbackPanel );

    AjaxSubmitLink closeBtn = new AjaxCloseCancelBtn( "close-x", this );
    AjaxSubmitLink cancelBtn = new AjaxCloseCancelBtn( "cancel", this );

    add( new AjaxSubmitLink( "save", this )
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit( AjaxRequestTarget target, Form<?> form )
        {
            if ( !user.getCryptedPassword().equals( CypherUtil.encodeMd5( getOldPassword() ) ) )
            {
                error( ERROR_WRONG_PASS );
            }
            else if ( !getNewPassword().equals( getNewPasswordRepeat() ) )
            {
                error( ERROR_PASS_DIFF );
            }
            else if ( !validator.validateEmailFormat( getEmail() ) )
            {
                error( ERROR_EMAIL_INVALID );
            }
            else if ( validator.emailExists( getEmail() ) )
            {
                error( ERROR_EMAIL_EXISTS );
            } else 
            {
                //save user data
            }
        }

        @Override
        protected void onError( AjaxRequestTarget target, Form<?> form )
        {
            target.add( feedbackPanel );
        }
    } );

    add( closeBtn );
    add( cancelBtn );
}

/**
 * @return
 */
private String getEmail()
{
    return properties.getString( EMAIL );
}

/**
 * @return
 */
private String getOldPassword()
{
    return properties.getString( OLD_PASS );
}

/**
 * @return
 */
private String getNewPassword()
{
    return properties.getString( NEW_PASS );
}

/**
 * @return
 */
private String getNewPasswordRepeat()
{
    return properties.getString( NEW_PASS_REPEAT );
}

}

Теперь, когда я оставляю эти формы пустыми, я получаю хорошее сообщение с сообщением о том, что поля обязательны для заполнения.Между тем, когда я набираю неверный пароль, электронная почта или что-то еще, что у меня ничего не получилось, и мой журнал сервера оставляет сообщение типа:

WARNING: Component-targetted feedback message was left unrendered. 
This could be because you are missing a FeedbackPanel on the page.  
Message: [FeedbackMessage message = "Wrong pass", reporter = save, level = ERROR]

Форма находится на веб-странице, которая является всплывающим:

public class ProfilePopup extends WebPage
{
private static final long serialVersionUID = 2929269801026361184L;

public ProfilePopup(final ModalWindow modal, final User user) 
{
    add( new EditProfileForm("profileModifyForm", modal, user).setOutputMarkupId(true) );
}
}

и HTML, размещение обратной связи вне формы тоже не помогло:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body class="stats-popup-body">
<div class="stats-popup" id="car-info-edit-popup">
    <p class="popup_title"> Edytuj Profilu </p>
    <form wicket:id="profileModifyForm" class="stats-popup-form">           
        <div>
            <label class="popup_field_label">Email:</label>
            <input type="text" wicket:id="mp-email" />
        </div>
        <div class="clear9"></div>
        <div>
            <label class="popup_field_label">Stare hasło:</label> 
            <input type="password" name="E-mail" title="E-mail1" id="E-mail2" wicket:id="mp-oldpass" />
        </div>
        <div>
            <label class="popup_field_label">Nowe hasło:</label>
            <input type="password" wicket:id="mp-newpass" />
        </div>
        <div>
            <label class="popup_field_label">Powtórz nowe hasło:</label>
            <input type="password" wicket:id="mp-newpassrepeat" />
        </div>
        <span wicket:id="feedback"></span>
        <div class="button-box-bottom">
            <input class="btn btn_save" style="margin-right: 9px;"
                wicket:id="save" type="button" value="Zapisz"
                onmousemove="this.className='btn btn_save btn_hover'"
                onmouseout="this.className='btn btn_save'" /> 
            <input
                class="btn btn_cancel" wicket:id="cancel"
                value="Anuluj" type="button" 
                onmousemove="this.className='btn btn_cancel btn_hover'"
                onmouseout="this.className='btn btn_cancel'" />
        </div>
        <div class="stats-popup-close-x" wicket:id="close-x"></div>
    </form>
</div>
</body>
</html>

1 Ответ

11 голосов
/ 06 ноября 2011

Неправильно выполнять проверку входных данных в onSubmit, потому что, как только вы попадете туда, (недопустимый) вход достиг моделей. Как вы уже испытали, onSubmit вызывается после завершения фазы проверки, поэтому ввод будет считаться действительным, и, следовательно, Form.onError не будет вызываться.

Используйте взамен FormValidator (добавьте IFormValidator к Form в своем конструкторе), если вам требуется выполнить не очень простые проверки или проверки, включающие ввод двух или более компонентов. Помните, что пользовательский ввод не достиг моделей компонента в FormValidator.validate(), поэтому вам нужно будет использовать Component.getConvertedInput(), чтобы подтвердить ввод.

Если ваши проверки включают только один компонент и работают только над его входом, рекомендуется вместо этого использовать IValidator.

Также обратите внимание, что Wicket предоставляет валидаторы, которые выполняют некоторые валидации, которые вы хотели бы выполнить: EqualPasswordInputValidator и EmailAddressValidator могут быть вам полезны.

Например:

emailField.add(EmailAddressValidator.getInstance());
form.add(new EqualPasswordInputValidator(passwordField, passwordRepeatField));

Посмотрите на эту (несколько устаревшую) вики-страницу для получения информации о FormValidators: Проверка связанных полей

...