Problem with IFormsubmitting

View: New views
7 Messages — Rating Filter:   Alert me  

Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi!

I need to accomplish the following:
1. receive ajax onchange event from a formcomponent
2. receive "defaultformprocesing=false" style submit
3. repaint an area; I this is why I need the form to be really
submitted (=rawinput but not validated).

I have built a custom component FormSubmittingDropDownChoice.

The problem is that even if I press another submit component (button,
for example), the form allways assumes the formSubmitting component to
be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
is so simple that if FormSubmittingDropDownChoice has a value, it is
the submitting component.

Is there a workaround or fix? How could I achieve similar
functionality in a working manner? This works well if I click the
FormSubmittingDropDownChoice, otherwise it does not :(

package com.tustor.wicket.common.reusables.formcomponents;

public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
implements IFormSubmittingComponent {

  public FormSubmittingDropDownChoice(String id, various constructor options) {
    super(id, choices, renderer);
  }
  /**
   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
   */
  public boolean getDefaultFormProcessing() {
    return false;
  }

  /**
   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
   */
  public void onSubmit() {
    // override
  }

  /**
   * wicket-ajax:
   *
   * if (submitButton != null) {
   *   s += Wicket.Form.encode(submitButton) + "=1";
   * }
   *
   * @see org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
   */
  @Override
  public String[] getInputAsArray() {
    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
  }

  /**
   * @see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
   */
  @Override
  public String getModelValue() {
    String value = super.getModelValue();
    if ("1".equals(value)) {
      throw new IllegalStateException("1 not supported because of
javaScript wicket-ajax:submitForm: function(form, submitButton)");
    }
    return value;
  }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi!

Maybe this is the solution:

                        String url = getRequest().getParameter(getHiddenFieldId());
                        if (!Strings.isEmpty(url))
                        {
                                dispatchEvent(getPage(), url);
                        }


??

Attach a change listener with ajax form submit?

**
Martin

2009/11/3 Martin Makundi <martin.makundi@...>:

> Hi!
>
> I need to accomplish the following:
> 1. receive ajax onchange event from a formcomponent
> 2. receive "defaultformprocesing=false" style submit
> 3. repaint an area; I this is why I need the form to be really
> submitted (=rawinput but not validated).
>
> I have built a custom component FormSubmittingDropDownChoice.
>
> The problem is that even if I press another submit component (button,
> for example), the form allways assumes the formSubmitting component to
> be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
> is so simple that if FormSubmittingDropDownChoice has a value, it is
> the submitting component.
>
> Is there a workaround or fix? How could I achieve similar
> functionality in a working manner? This works well if I click the
> FormSubmittingDropDownChoice, otherwise it does not :(
>
> package com.tustor.wicket.common.reusables.formcomponents;
>
> public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
> implements IFormSubmittingComponent {
>
>  public FormSubmittingDropDownChoice(String id, various constructor options) {
>    super(id, choices, renderer);
>  }
>  /**
>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
>   */
>  public boolean getDefaultFormProcessing() {
>    return false;
>  }
>
>  /**
>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
>   */
>  public void onSubmit() {
>    // override
>  }
>
>  /**
>   * wicket-ajax:
>   *
>   * if (submitButton != null) {
>   *   s += Wicket.Form.encode(submitButton) + "=1";
>   * }
>   *
>   * @see org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
>   */
>  @Override
>  public String[] getInputAsArray() {
>    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
>  }
>
>  /**
>   * @see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
>   */
>  @Override
>  public String getModelValue() {
>    String value = super.getModelValue();
>    if ("1".equals(value)) {
>      throw new IllegalStateException("1 not supported because of
> javaScript wicket-ajax:submitForm: function(form, submitButton)");
>    }
>    return value;
>  }
> }
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi!

I hope I found a solution usin IOnChangeListener.

Please try this out and let me know if it works for you. Maybe it
should be incorporated into Wicket?

public abstract class FormSubmitAjaxChangeListenerCallDecorator
implements IAjaxCallDecorator {
  private final static Method hiddenFieldGetter;

  static {
    try {
      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
      hiddenFieldGetter.setAccessible(true);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
   */
  public CharSequence decorateOnFailureScript(
      CharSequence arg0) {
    return arg0;
  }

  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
   */
  public CharSequence decorateOnSuccessScript(
      CharSequence arg0) {
    return arg0;
  }

  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
   */
  public CharSequence decorateScript(CharSequence arg0) {
    Form<?> root = getForm().getRootForm();
    String hiddenFieldId;
    try {
      hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
      return new AppendingStringBuffer("document.getElementById('").append(
          hiddenFieldId).append("').value='").append(getChangeListenerUrl()).append(
          "';").append(arg0);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * @return Form<?>
   */
  public abstract Form<?> getForm();

  /**
   * @return CharSequence
   */
  public abstract CharSequence getChangeListenerUrl();
}


public abstract class AjaxFormSubmittingChangeListenerCheckBox extends
CheckBox {
  /**
   * @param id
   * @param model
   */
  public AjaxFormSubmittingChangeListenerCheckBox(String id,
IModel<Boolean> model) {
    super(id, model);
    add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) {
      @Override
      protected void onError(AjaxRequestTarget target) {
        AjaxFormSubmittingChangeListenerCheckBox.this.onError(target);
      }

      @Override
      protected void onSubmit(AjaxRequestTarget target) {
        AjaxFormSubmittingChangeListenerCheckBox.this.onSubmit(target);
      }

      /**
       * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getAjaxCallDecorator()
       */
      @Override
      protected IAjaxCallDecorator getAjaxCallDecorator() {
        return new FormSubmitAjaxChangeListenerCallDecorator() {
          @Override
          public CharSequence getChangeListenerUrl() {
            return urlFor(IOnChangeListener.INTERFACE);
          }

          @Override
          public Form<?> getForm() {
            return AjaxFormSubmittingChangeListenerCheckBox.this.getForm();
          }

        };
      }
    });
  }

  /**
   * @param target
   */
  protected abstract void onSubmit(AjaxRequestTarget target);

  /**
   * @param target
   */
  protected void onError(AjaxRequestTarget target) {
    onSubmit(target);
  }

  /**
   * @param id
   */
  public AjaxFormSubmittingChangeListenerCheckBox(String id) {
    this(id, null);
  }
}


2009/11/3 Martin Makundi <martin.makundi@...>:

> Hi!
>
> Maybe this is the solution:
>
>                        String url = getRequest().getParameter(getHiddenFieldId());
>                        if (!Strings.isEmpty(url))
>                        {
>                                dispatchEvent(getPage(), url);
>                        }
>
>
> ??
>
> Attach a change listener with ajax form submit?
>
> **
> Martin
>
> 2009/11/3 Martin Makundi <martin.makundi@...>:
>> Hi!
>>
>> I need to accomplish the following:
>> 1. receive ajax onchange event from a formcomponent
>> 2. receive "defaultformprocesing=false" style submit
>> 3. repaint an area; I this is why I need the form to be really
>> submitted (=rawinput but not validated).
>>
>> I have built a custom component FormSubmittingDropDownChoice.
>>
>> The problem is that even if I press another submit component (button,
>> for example), the form allways assumes the formSubmitting component to
>> be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
>> is so simple that if FormSubmittingDropDownChoice has a value, it is
>> the submitting component.
>>
>> Is there a workaround or fix? How could I achieve similar
>> functionality in a working manner? This works well if I click the
>> FormSubmittingDropDownChoice, otherwise it does not :(
>>
>> package com.tustor.wicket.common.reusables.formcomponents;
>>
>> public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
>> implements IFormSubmittingComponent {
>>
>>  public FormSubmittingDropDownChoice(String id, various constructor options) {
>>    super(id, choices, renderer);
>>  }
>>  /**
>>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
>>   */
>>  public boolean getDefaultFormProcessing() {
>>    return false;
>>  }
>>
>>  /**
>>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
>>   */
>>  public void onSubmit() {
>>    // override
>>  }
>>
>>  /**
>>   * wicket-ajax:
>>   *
>>   * if (submitButton != null) {
>>   *   s += Wicket.Form.encode(submitButton) + "=1";
>>   * }
>>   *
>>   * @see org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
>>   */
>>  @Override
>>  public String[] getInputAsArray() {
>>    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
>>  }
>>
>>  /**
>>   * @see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
>>   */
>>  @Override
>>  public String getModelValue() {
>>    String value = super.getModelValue();
>>    if ("1".equals(value)) {
>>      throw new IllegalStateException("1 not supported because of
>> javaScript wicket-ajax:submitForm: function(form, submitButton)");
>>    }
>>    return value;
>>  }
>> }
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi!

One finishing touch is needed. The hidden field should be cleared
after ajax submit. It seems to work now.. feel free to critisize.

public abstract class FormSubmitAjaxChangeListenerCallDecorator
implements IAjaxCallDecorator {
  private final static Method hiddenFieldGetter;

  static {
    try {
      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
      hiddenFieldGetter.setAccessible(true);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
   */
  public CharSequence decorateOnFailureScript(
      CharSequence arg0) {
    return getSetHiddenFieldValue("").append(arg0);
  }

  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
   */
  public CharSequence decorateOnSuccessScript(
      CharSequence arg0) {
    return getSetHiddenFieldValue("").append(arg0);
  }

  /**
   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
   */
  public CharSequence decorateScript(CharSequence arg0) {
    return getSetHiddenFieldValue(getChangeListenerUrl()).append(arg0);
  }

  /**
   * @param hiddenFieldId
   * @param value
   * @return
   */
  private AppendingStringBuffer getSetHiddenFieldValue(CharSequence value) {
    try {
      Form<?> root = getForm().getRootForm();
      String hiddenFieldId;
      hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
      return new AppendingStringBuffer("document.getElementById('").append(
          hiddenFieldId).append("').value='").append(value).append(
          "';");
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * @return Form<?>
   */
  public abstract Form<?> getForm();

  /**
   * @return CharSequence
   */
  public abstract CharSequence getChangeListenerUrl();
}

**
Martin

2009/11/3 Martin Makundi <martin.makundi@...>:

> Hi!
>
> I hope I found a solution usin IOnChangeListener.
>
> Please try this out and let me know if it works for you. Maybe it
> should be incorporated into Wicket?
>
> public abstract class FormSubmitAjaxChangeListenerCallDecorator
> implements IAjaxCallDecorator {
>  private final static Method hiddenFieldGetter;
>
>  static {
>    try {
>      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
>      hiddenFieldGetter.setAccessible(true);
>    } catch (Exception e) {
>      throw new RuntimeException(e);
>    }
>  }
>  /**
>   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateOnFailureScript(
>      CharSequence arg0) {
>    return arg0;
>  }
>
>  /**
>   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateOnSuccessScript(
>      CharSequence arg0) {
>    return arg0;
>  }
>
>  /**
>   * @see org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateScript(CharSequence arg0) {
>    Form<?> root = getForm().getRootForm();
>    String hiddenFieldId;
>    try {
>      hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
>      return new AppendingStringBuffer("document.getElementById('").append(
>          hiddenFieldId).append("').value='").append(getChangeListenerUrl()).append(
>          "';").append(arg0);
>    } catch (Exception e) {
>      throw new RuntimeException(e);
>    }
>  }
>
>  /**
>   * @return Form<?>
>   */
>  public abstract Form<?> getForm();
>
>  /**
>   * @return CharSequence
>   */
>  public abstract CharSequence getChangeListenerUrl();
> }
>
>
> public abstract class AjaxFormSubmittingChangeListenerCheckBox extends
> CheckBox {
>  /**
>   * @param id
>   * @param model
>   */
>  public AjaxFormSubmittingChangeListenerCheckBox(String id,
> IModel<Boolean> model) {
>    super(id, model);
>    add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) {
>      @Override
>      protected void onError(AjaxRequestTarget target) {
>        AjaxFormSubmittingChangeListenerCheckBox.this.onError(target);
>      }
>
>      @Override
>      protected void onSubmit(AjaxRequestTarget target) {
>        AjaxFormSubmittingChangeListenerCheckBox.this.onSubmit(target);
>      }
>
>      /**
>       * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getAjaxCallDecorator()
>       */
>      @Override
>      protected IAjaxCallDecorator getAjaxCallDecorator() {
>        return new FormSubmitAjaxChangeListenerCallDecorator() {
>          @Override
>          public CharSequence getChangeListenerUrl() {
>            return urlFor(IOnChangeListener.INTERFACE);
>          }
>
>          @Override
>          public Form<?> getForm() {
>            return AjaxFormSubmittingChangeListenerCheckBox.this.getForm();
>          }
>
>        };
>      }
>    });
>  }
>
>  /**
>   * @param target
>   */
>  protected abstract void onSubmit(AjaxRequestTarget target);
>
>  /**
>   * @param target
>   */
>  protected void onError(AjaxRequestTarget target) {
>    onSubmit(target);
>  }
>
>  /**
>   * @param id
>   */
>  public AjaxFormSubmittingChangeListenerCheckBox(String id) {
>    this(id, null);
>  }
> }
>
>
> 2009/11/3 Martin Makundi <martin.makundi@...>:
>> Hi!
>>
>> Maybe this is the solution:
>>
>>                        String url = getRequest().getParameter(getHiddenFieldId());
>>                        if (!Strings.isEmpty(url))
>>                        {
>>                                dispatchEvent(getPage(), url);
>>                        }
>>
>>
>> ??
>>
>> Attach a change listener with ajax form submit?
>>
>> **
>> Martin
>>
>> 2009/11/3 Martin Makundi <martin.makundi@...>:
>>> Hi!
>>>
>>> I need to accomplish the following:
>>> 1. receive ajax onchange event from a formcomponent
>>> 2. receive "defaultformprocesing=false" style submit
>>> 3. repaint an area; I this is why I need the form to be really
>>> submitted (=rawinput but not validated).
>>>
>>> I have built a custom component FormSubmittingDropDownChoice.
>>>
>>> The problem is that even if I press another submit component (button,
>>> for example), the form allways assumes the formSubmitting component to
>>> be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
>>> is so simple that if FormSubmittingDropDownChoice has a value, it is
>>> the submitting component.
>>>
>>> Is there a workaround or fix? How could I achieve similar
>>> functionality in a working manner? This works well if I click the
>>> FormSubmittingDropDownChoice, otherwise it does not :(
>>>
>>> package com.tustor.wicket.common.reusables.formcomponents;
>>>
>>> public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
>>> implements IFormSubmittingComponent {
>>>
>>>  public FormSubmittingDropDownChoice(String id, various constructor options) {
>>>    super(id, choices, renderer);
>>>  }
>>>  /**
>>>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
>>>   */
>>>  public boolean getDefaultFormProcessing() {
>>>    return false;
>>>  }
>>>
>>>  /**
>>>   * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
>>>   */
>>>  public void onSubmit() {
>>>    // override
>>>  }
>>>
>>>  /**
>>>   * wicket-ajax:
>>>   *
>>>   * if (submitButton != null) {
>>>   *   s += Wicket.Form.encode(submitButton) + "=1";
>>>   * }
>>>   *
>>>   * @see org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
>>>   */
>>>  @Override
>>>  public String[] getInputAsArray() {
>>>    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
>>>  }
>>>
>>>  /**
>>>   * @see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
>>>   */
>>>  @Override
>>>  public String getModelValue() {
>>>    String value = super.getModelValue();
>>>    if ("1".equals(value)) {
>>>      throw new IllegalStateException("1 not supported because of
>>> javaScript wicket-ajax:submitForm: function(form, submitButton)");
>>>    }
>>>    return value;
>>>  }
>>> }
>>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Problem with IFormsubmitting

by jthomerson :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

The power of this list is amazing - it seems you just had an entire thread
with yourself and answered your own question.  SYNERGY!  :)

But seriously, did you have any remaining questions on this that we could
assist with?


--
Jeremy Thomerson
http://www.wickettraining.com



On Tue, Nov 3, 2009 at 12:22 PM, Martin Makundi <
martin.makundi@...> wrote:

> Hi!
>
> One finishing touch is needed. The hidden field should be cleared
> after ajax submit. It seems to work now.. feel free to critisize.
>
> public abstract class FormSubmitAjaxChangeListenerCallDecorator
> implements IAjaxCallDecorator {
>  private final static Method hiddenFieldGetter;
>
>  static {
>    try {
>      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
>      hiddenFieldGetter.setAccessible(true);
>    } catch (Exception e) {
>      throw new RuntimeException(e);
>    }
>  }
>  /**
>   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateOnFailureScript(
>      CharSequence arg0) {
>     return getSetHiddenFieldValue("").append(arg0);
>   }
>
>  /**
>   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateOnSuccessScript(
>      CharSequence arg0) {
>     return getSetHiddenFieldValue("").append(arg0);
>   }
>
>  /**
>   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
>   */
>  public CharSequence decorateScript(CharSequence arg0) {
>     return getSetHiddenFieldValue(getChangeListenerUrl()).append(arg0);
>  }
>
>  /**
>   * @param hiddenFieldId
>   * @param value
>   * @return
>   */
>  private AppendingStringBuffer getSetHiddenFieldValue(CharSequence value) {
>    try {
>       Form<?> root = getForm().getRootForm();
>      String hiddenFieldId;
>       hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
>      return new AppendingStringBuffer("document.getElementById('").append(
>           hiddenFieldId).append("').value='").append(value).append(
>          "';");
>     } catch (Exception e) {
>      throw new RuntimeException(e);
>    }
>  }
>
>  /**
>   * @return Form<?>
>   */
>  public abstract Form<?> getForm();
>
>  /**
>   * @return CharSequence
>   */
>  public abstract CharSequence getChangeListenerUrl();
> }
>
> **
> Martin
>
> 2009/11/3 Martin Makundi <martin.makundi@...>:
> > Hi!
> >
> > I hope I found a solution usin IOnChangeListener.
> >
> > Please try this out and let me know if it works for you. Maybe it
> > should be incorporated into Wicket?
> >
> > public abstract class FormSubmitAjaxChangeListenerCallDecorator
> > implements IAjaxCallDecorator {
> >  private final static Method hiddenFieldGetter;
> >
> >  static {
> >    try {
> >      hiddenFieldGetter =
> Form.class.getDeclaredMethod("getHiddenFieldId");
> >      hiddenFieldGetter.setAccessible(true);
> >    } catch (Exception e) {
> >      throw new RuntimeException(e);
> >    }
> >  }
> >  /**
> >   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
> >   */
> >  public CharSequence decorateOnFailureScript(
> >      CharSequence arg0) {
> >    return arg0;
> >  }
> >
> >  /**
> >   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
> >   */
> >  public CharSequence decorateOnSuccessScript(
> >      CharSequence arg0) {
> >    return arg0;
> >  }
> >
> >  /**
> >   * @see
> org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
> >   */
> >  public CharSequence decorateScript(CharSequence arg0) {
> >    Form<?> root = getForm().getRootForm();
> >    String hiddenFieldId;
> >    try {
> >      hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
> >      return new
> AppendingStringBuffer("document.getElementById('").append(
> >
>  hiddenFieldId).append("').value='").append(getChangeListenerUrl()).append(
> >          "';").append(arg0);
> >    } catch (Exception e) {
> >      throw new RuntimeException(e);
> >    }
> >  }
> >
> >  /**
> >   * @return Form<?>
> >   */
> >  public abstract Form<?> getForm();
> >
> >  /**
> >   * @return CharSequence
> >   */
> >  public abstract CharSequence getChangeListenerUrl();
> > }
> >
> >
> > public abstract class AjaxFormSubmittingChangeListenerCheckBox extends
> > CheckBox {
> >  /**
> >   * @param id
> >   * @param model
> >   */
> >  public AjaxFormSubmittingChangeListenerCheckBox(String id,
> > IModel<Boolean> model) {
> >    super(id, model);
> >    add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) {
> >      @Override
> >      protected void onError(AjaxRequestTarget target) {
> >        AjaxFormSubmittingChangeListenerCheckBox.this.onError(target);
> >      }
> >
> >      @Override
> >      protected void onSubmit(AjaxRequestTarget target) {
> >        AjaxFormSubmittingChangeListenerCheckBox.this.onSubmit(target);
> >      }
> >
> >      /**
> >       * @see
> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getAjaxCallDecorator()
> >       */
> >      @Override
> >      protected IAjaxCallDecorator getAjaxCallDecorator() {
> >        return new FormSubmitAjaxChangeListenerCallDecorator() {
> >          @Override
> >          public CharSequence getChangeListenerUrl() {
> >            return urlFor(IOnChangeListener.INTERFACE);
> >          }
> >
> >          @Override
> >          public Form<?> getForm() {
> >            return
> AjaxFormSubmittingChangeListenerCheckBox.this.getForm();
> >          }
> >
> >        };
> >      }
> >    });
> >  }
> >
> >  /**
> >   * @param target
> >   */
> >  protected abstract void onSubmit(AjaxRequestTarget target);
> >
> >  /**
> >   * @param target
> >   */
> >  protected void onError(AjaxRequestTarget target) {
> >    onSubmit(target);
> >  }
> >
> >  /**
> >   * @param id
> >   */
> >  public AjaxFormSubmittingChangeListenerCheckBox(String id) {
> >    this(id, null);
> >  }
> > }
> >
> >
> > 2009/11/3 Martin Makundi <martin.makundi@...>:
> >> Hi!
> >>
> >> Maybe this is the solution:
> >>
> >>                        String url =
> getRequest().getParameter(getHiddenFieldId());
> >>                        if (!Strings.isEmpty(url))
> >>                        {
> >>                                dispatchEvent(getPage(), url);
> >>                        }
> >>
> >>
> >> ??
> >>
> >> Attach a change listener with ajax form submit?
> >>
> >> **
> >> Martin
> >>
> >> 2009/11/3 Martin Makundi <martin.makundi@...>:
> >>> Hi!
> >>>
> >>> I need to accomplish the following:
> >>> 1. receive ajax onchange event from a formcomponent
> >>> 2. receive "defaultformprocesing=false" style submit
> >>> 3. repaint an area; I this is why I need the form to be really
> >>> submitted (=rawinput but not validated).
> >>>
> >>> I have built a custom component FormSubmittingDropDownChoice.
> >>>
> >>> The problem is that even if I press another submit component (button,
> >>> for example), the form allways assumes the formSubmitting component to
> >>> be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
> >>> is so simple that if FormSubmittingDropDownChoice has a value, it is
> >>> the submitting component.
> >>>
> >>> Is there a workaround or fix? How could I achieve similar
> >>> functionality in a working manner? This works well if I click the
> >>> FormSubmittingDropDownChoice, otherwise it does not :(
> >>>
> >>> package com.tustor.wicket.common.reusables.formcomponents;
> >>>
> >>> public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
> >>> implements IFormSubmittingComponent {
> >>>
> >>>  public FormSubmittingDropDownChoice(String id, various constructor
> options) {
> >>>    super(id, choices, renderer);
> >>>  }
> >>>  /**
> >>>   * @see
> org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
> >>>   */
> >>>  public boolean getDefaultFormProcessing() {
> >>>    return false;
> >>>  }
> >>>
> >>>  /**
> >>>   * @see
> org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
> >>>   */
> >>>  public void onSubmit() {
> >>>    // override
> >>>  }
> >>>
> >>>  /**
> >>>   * wicket-ajax:
> >>>   *
> >>>   * if (submitButton != null) {
> >>>   *   s += Wicket.Form.encode(submitButton) + "=1";
> >>>   * }
> >>>   *
> >>>   * @see
> org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
> >>>   */
> >>>  @Override
> >>>  public String[] getInputAsArray() {
> >>>    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
> >>>  }
> >>>
> >>>  /**
> >>>   * @see
> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
> >>>   */
> >>>  @Override
> >>>  public String getModelValue() {
> >>>    String value = super.getModelValue();
> >>>    if ("1".equals(value)) {
> >>>      throw new IllegalStateException("1 not supported because of
> >>> javaScript wicket-ajax:submitForm: function(form, submitButton)");
> >>>    }
> >>>    return value;
> >>>  }
> >>> }
> >>>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>

Re: Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Tnx. I would like to ask (myself?) whether it could be formulated
simply into a behavior that can be attached into any formcomponent.
Probably. I will work on this next.

Ofcourse if more people try the code in their applications we will
soon learn if it breaks something.

**
Martin

2009/11/4 Jeremy Thomerson <jeremy@...>:

> The power of this list is amazing - it seems you just had an entire thread
> with yourself and answered your own question.  SYNERGY!  :)
>
> But seriously, did you have any remaining questions on this that we could
> assist with?
>
>
> --
> Jeremy Thomerson
> http://www.wickettraining.com
>
>
>
> On Tue, Nov 3, 2009 at 12:22 PM, Martin Makundi <
> martin.makundi@...> wrote:
>
>> Hi!
>>
>> One finishing touch is needed. The hidden field should be cleared
>> after ajax submit. It seems to work now.. feel free to critisize.
>>
>> public abstract class FormSubmitAjaxChangeListenerCallDecorator
>> implements IAjaxCallDecorator {
>>  private final static Method hiddenFieldGetter;
>>
>>  static {
>>    try {
>>      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
>>      hiddenFieldGetter.setAccessible(true);
>>    } catch (Exception e) {
>>      throw new RuntimeException(e);
>>    }
>>  }
>>  /**
>>   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
>>   */
>>  public CharSequence decorateOnFailureScript(
>>      CharSequence arg0) {
>>     return getSetHiddenFieldValue("").append(arg0);
>>   }
>>
>>  /**
>>   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
>>   */
>>  public CharSequence decorateOnSuccessScript(
>>      CharSequence arg0) {
>>     return getSetHiddenFieldValue("").append(arg0);
>>   }
>>
>>  /**
>>   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
>>   */
>>  public CharSequence decorateScript(CharSequence arg0) {
>>     return getSetHiddenFieldValue(getChangeListenerUrl()).append(arg0);
>>  }
>>
>>  /**
>>   * @param hiddenFieldId
>>   * @param value
>>   * @return
>>   */
>>  private AppendingStringBuffer getSetHiddenFieldValue(CharSequence value) {
>>    try {
>>       Form<?> root = getForm().getRootForm();
>>      String hiddenFieldId;
>>       hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
>>      return new AppendingStringBuffer("document.getElementById('").append(
>>           hiddenFieldId).append("').value='").append(value).append(
>>          "';");
>>     } catch (Exception e) {
>>      throw new RuntimeException(e);
>>    }
>>  }
>>
>>  /**
>>   * @return Form<?>
>>   */
>>  public abstract Form<?> getForm();
>>
>>  /**
>>   * @return CharSequence
>>   */
>>  public abstract CharSequence getChangeListenerUrl();
>> }
>>
>> **
>> Martin
>>
>> 2009/11/3 Martin Makundi <martin.makundi@...>:
>> > Hi!
>> >
>> > I hope I found a solution usin IOnChangeListener.
>> >
>> > Please try this out and let me know if it works for you. Maybe it
>> > should be incorporated into Wicket?
>> >
>> > public abstract class FormSubmitAjaxChangeListenerCallDecorator
>> > implements IAjaxCallDecorator {
>> >  private final static Method hiddenFieldGetter;
>> >
>> >  static {
>> >    try {
>> >      hiddenFieldGetter =
>> Form.class.getDeclaredMethod("getHiddenFieldId");
>> >      hiddenFieldGetter.setAccessible(true);
>> >    } catch (Exception e) {
>> >      throw new RuntimeException(e);
>> >    }
>> >  }
>> >  /**
>> >   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnFailureScript(java.lang.CharSequence)
>> >   */
>> >  public CharSequence decorateOnFailureScript(
>> >      CharSequence arg0) {
>> >    return arg0;
>> >  }
>> >
>> >  /**
>> >   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateOnSuccessScript(java.lang.CharSequence)
>> >   */
>> >  public CharSequence decorateOnSuccessScript(
>> >      CharSequence arg0) {
>> >    return arg0;
>> >  }
>> >
>> >  /**
>> >   * @see
>> org.apache.wicket.ajax.IAjaxCallDecorator#decorateScript(java.lang.CharSequence)
>> >   */
>> >  public CharSequence decorateScript(CharSequence arg0) {
>> >    Form<?> root = getForm().getRootForm();
>> >    String hiddenFieldId;
>> >    try {
>> >      hiddenFieldId = (String) hiddenFieldGetter.invoke(root);
>> >      return new
>> AppendingStringBuffer("document.getElementById('").append(
>> >
>>  hiddenFieldId).append("').value='").append(getChangeListenerUrl()).append(
>> >          "';").append(arg0);
>> >    } catch (Exception e) {
>> >      throw new RuntimeException(e);
>> >    }
>> >  }
>> >
>> >  /**
>> >   * @return Form<?>
>> >   */
>> >  public abstract Form<?> getForm();
>> >
>> >  /**
>> >   * @return CharSequence
>> >   */
>> >  public abstract CharSequence getChangeListenerUrl();
>> > }
>> >
>> >
>> > public abstract class AjaxFormSubmittingChangeListenerCheckBox extends
>> > CheckBox {
>> >  /**
>> >   * @param id
>> >   * @param model
>> >   */
>> >  public AjaxFormSubmittingChangeListenerCheckBox(String id,
>> > IModel<Boolean> model) {
>> >    super(id, model);
>> >    add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) {
>> >      @Override
>> >      protected void onError(AjaxRequestTarget target) {
>> >        AjaxFormSubmittingChangeListenerCheckBox.this.onError(target);
>> >      }
>> >
>> >      @Override
>> >      protected void onSubmit(AjaxRequestTarget target) {
>> >        AjaxFormSubmittingChangeListenerCheckBox.this.onSubmit(target);
>> >      }
>> >
>> >      /**
>> >       * @see
>> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getAjaxCallDecorator()
>> >       */
>> >      @Override
>> >      protected IAjaxCallDecorator getAjaxCallDecorator() {
>> >        return new FormSubmitAjaxChangeListenerCallDecorator() {
>> >          @Override
>> >          public CharSequence getChangeListenerUrl() {
>> >            return urlFor(IOnChangeListener.INTERFACE);
>> >          }
>> >
>> >          @Override
>> >          public Form<?> getForm() {
>> >            return
>> AjaxFormSubmittingChangeListenerCheckBox.this.getForm();
>> >          }
>> >
>> >        };
>> >      }
>> >    });
>> >  }
>> >
>> >  /**
>> >   * @param target
>> >   */
>> >  protected abstract void onSubmit(AjaxRequestTarget target);
>> >
>> >  /**
>> >   * @param target
>> >   */
>> >  protected void onError(AjaxRequestTarget target) {
>> >    onSubmit(target);
>> >  }
>> >
>> >  /**
>> >   * @param id
>> >   */
>> >  public AjaxFormSubmittingChangeListenerCheckBox(String id) {
>> >    this(id, null);
>> >  }
>> > }
>> >
>> >
>> > 2009/11/3 Martin Makundi <martin.makundi@...>:
>> >> Hi!
>> >>
>> >> Maybe this is the solution:
>> >>
>> >>                        String url =
>> getRequest().getParameter(getHiddenFieldId());
>> >>                        if (!Strings.isEmpty(url))
>> >>                        {
>> >>                                dispatchEvent(getPage(), url);
>> >>                        }
>> >>
>> >>
>> >> ??
>> >>
>> >> Attach a change listener with ajax form submit?
>> >>
>> >> **
>> >> Martin
>> >>
>> >> 2009/11/3 Martin Makundi <martin.makundi@...>:
>> >>> Hi!
>> >>>
>> >>> I need to accomplish the following:
>> >>> 1. receive ajax onchange event from a formcomponent
>> >>> 2. receive "defaultformprocesing=false" style submit
>> >>> 3. repaint an area; I this is why I need the form to be really
>> >>> submitted (=rawinput but not validated).
>> >>>
>> >>> I have built a custom component FormSubmittingDropDownChoice.
>> >>>
>> >>> The problem is that even if I press another submit component (button,
>> >>> for example), the form allways assumes the formSubmitting component to
>> >>> be FormSubmittingDropDownChoice. Why? Because the findSubmittingButton
>> >>> is so simple that if FormSubmittingDropDownChoice has a value, it is
>> >>> the submitting component.
>> >>>
>> >>> Is there a workaround or fix? How could I achieve similar
>> >>> functionality in a working manner? This works well if I click the
>> >>> FormSubmittingDropDownChoice, otherwise it does not :(
>> >>>
>> >>> package com.tustor.wicket.common.reusables.formcomponents;
>> >>>
>> >>> public class FormSubmittingDropDownChoice<T> extends DropDownChoice<T>
>> >>> implements IFormSubmittingComponent {
>> >>>
>> >>>  public FormSubmittingDropDownChoice(String id, various constructor
>> options) {
>> >>>    super(id, choices, renderer);
>> >>>  }
>> >>>  /**
>> >>>   * @see
>> org.apache.wicket.markup.html.form.IFormSubmittingComponent#getDefaultFormProcessing()
>> >>>   */
>> >>>  public boolean getDefaultFormProcessing() {
>> >>>    return false;
>> >>>  }
>> >>>
>> >>>  /**
>> >>>   * @see
>> org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
>> >>>   */
>> >>>  public void onSubmit() {
>> >>>    // override
>> >>>  }
>> >>>
>> >>>  /**
>> >>>   * wicket-ajax:
>> >>>   *
>> >>>   * if (submitButton != null) {
>> >>>   *   s += Wicket.Form.encode(submitButton) + "=1";
>> >>>   * }
>> >>>   *
>> >>>   * @see
>> org.apache.wicket.markup.html.form.FormComponent#getInputAsArray()
>> >>>   */
>> >>>  @Override
>> >>>  public String[] getInputAsArray() {
>> >>>    return MarkupUtils.filterSubmitIndicator(super.getInputAsArray());
>> >>>  }
>> >>>
>> >>>  /**
>> >>>   * @see
>> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getModelValue()
>> >>>   */
>> >>>  @Override
>> >>>  public String getModelValue() {
>> >>>    String value = super.getModelValue();
>> >>>    if ("1".equals(value)) {
>> >>>      throw new IllegalStateException("1 not supported because of
>> >>> javaScript wicket-ajax:submitForm: function(form, submitButton)");
>> >>>    }
>> >>>    return value;
>> >>>  }
>> >>> }
>> >>>
>> >>
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Problem with IFormsubmitting

by MartinM :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi!

The proposed solution does not work with Modal Windows!!
* http://osdir.com/ml/users-wicket.apache.org/2009-11/msg00076.html

Modal windws have a fake parent form:

<form style="border-width: 0px; margin: 0px; padding: 0px;
background-color: transparent; position: static;">

.. and ofcourse it does not have a hidden input field...

.. so the solution gets a bit nastier...

.. we must fake the hidden field value into the request ... ?

Is there another less pervasive way to do this? Maybe alter wicket a bit ;) ?

The solution here is implementation specific and probably works with jetty only:


public abstract class
AjaxFormSubmittingChangeListenerDropDownChoice<T> extends
DropDownChoice<T> {
  private final static Method hiddenFieldGetter;
  static {
    try {
      hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId");
      hiddenFieldGetter.setAccessible(true);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  /** Initialize */ {
    add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) {

      @Override
      protected void onError(AjaxRequestTarget target) {
        AjaxFormSubmittingChangeListenerDropDownChoice.this.onError(target);
      }

      @Override
      protected void onSubmit(AjaxRequestTarget target) {
        AjaxFormSubmittingChangeListenerDropDownChoice.this.onSubmit(target);
      }

      /**
       * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onEvent(org.apache.wicket.ajax.AjaxRequestTarget)
       */
      @Override
      protected void onEvent(AjaxRequestTarget target) {
        org.mortbay.util.MultiMap parameters =
((org.mortbay.jetty.Request) ((WebRequest)
getRequest()).getHttpServletRequest()).getParameters();
        parameters.put(getHiddenFieldId(AjaxFormSubmittingChangeListenerDropDownChoice.this.getForm()),
            AjaxFormSubmittingChangeListenerDropDownChoice.this.urlFor(IOnChangeListener.INTERFACE));
        super.onEvent(target);
      }

      /**
       * @param form
       * @return String
       */
      private String getHiddenFieldId(Form<?> form) {
        try {
          Form<?> root = form.getRootForm();
          return (String) hiddenFieldGetter.invoke(root);
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }

    });
  }
}


**
Martin

> 2009/11/4 Jeremy Thomerson <jeremy@...>:
>> The power of this list is amazing - it seems you just had an entire thread
>> with yourself and answered your own question.  SYNERGY!  :)
>>
>> But seriously, did you have any remaining questions on this that we could
>> assist with?
>>
>>
>> --
>> Jeremy Thomerson
>> http://www.wickettraining.com
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...