Hi Yohan,

I prefer to use my own cancel button(using get instead of post)
inspired(read copied/cheated/learnt) from the chenillekit's button.

@Import(library = "cancel-form.js")
public class Cancel implements ClientElement
{
   /**
    * JavaScript id to be used. If id is not supplied, it will be auto-generated
    */
   @Parameter(value = "prop:componentResources.id", defaultPrefix =
BindingConstants.LITERAL)
   private String clientId;

   /**
    * Text to be displayed on the button. It is used at the content of the
    * <button> tag
    */
   @Parameter(value = "Cancel", defaultPrefix =
BindingConstants.LITERAL, required = true, allowNull = false)
   private String value;

   /**
    * Zone to update
    */
   @Parameter(defaultPrefix = BindingConstants.LITERAL)
   private String zone;

   @Inject
   private ComponentResources componentResources;

   @Inject
   private JavaScriptSupport javaScriptSupport;

   private String assignedClientId;

   @Parameter
   private Object[] context;

   public String getClientId()
   {
      return assignedClientId;
   }

   void setupRender()
   {
      assignedClientId = javaScriptSupport.allocateClientId(clientId);
   }

   boolean beginRender(MarkupWriter writer)
   {
      writer.element("button", "type", "button", "id", getClientId());
      writer.write(value);
      writer.end();

      addJavaScript();

      return false;
   }

   private void addJavaScript()
   {
      JSONObject params = new JSONObject();
      params.put("zone", zone);
      params.put("elementId", getClientId());
      params.put("url", getCancelURL());
      javaScriptSupport.addInitializerCall("cancelForm", params);
   }

   private String getCancelURL()
   {
      return componentResources.createEventLink("cancel",
context).toAbsoluteURI();
   }

}

Tapestry.Initializer.cancelForm = function(params)
{
   var element = $(params.elementId);

   Event.observe(element, "click", function(event)
   {
      event.preventDefault();
      var form = $(element).up("form");

      if($T(form).zoneId)
      {
         var zoneManager = Tapestry.findZoneManager(form);
         if(zoneManager != null)
         {
            zoneManager.updateFromURL(params.url);
            return;
         }
      }

      // Not within a form
      window.location.href = params.url;

   });
};

Tapestry.Initializer.cancelForm = function(params)
{
   var element = $(params.elementId);

   Event.observe(element, "click", function(event)
   {
      event.preventDefault();
      var form = $(element).up("form");

      if($T(form).zoneId)
      {
         var zoneManager = Tapestry.findZoneManager(form);
         if(zoneManager != null)
         {
            zoneManager.updateFromURL(params.url);
            return;
         }
      }

      // Not within a form
      window.location.href = params.url;

   });
};

Hope it helps


On Tue, Sep 6, 2011 at 10:30 AM, Steve Eynon
<steve.ey...@alienfactory.co.uk> wrote:
> Yay! I'm happy I'm not the only one who's noticed this!
>
> [T5.3-beta-1] Submit buttons with t:mode="cancel" do not submit the form
> http://tapestry.markmail.org/message/5yrkjtm2nfevear5
>
> I to, would like someone in the know to confirm whether this is
> desired behaviour (I'm thinking it's not, but then again, I'm also
> pretty stoopid).
>
> But, err, I don't know what the workaround is.
>
> For those who want the "Canceled" event to fire in T5.3, remove the
> t:mode="cancel" attribute (so the form submits!), ensure your cancel
> button has t:id="cancel" and add the following to your Module:
>
> public static void
> contributeFactoryDefaults(MappedConfiguration<String, Object>
> configuration) {
>        // remove "cancel" from the list of reserved names
>        configuration.override(InternalSymbols.PRE_SELECTED_FORM_NAMES,
> "reset,submit,select,id,method,action,onsubmit");
> }
>
> The downside being you can now only have one Cancel button per form
> and, as in T5.2.6, you either have to turn off client side validation
> for the whole form:
>
> <t:form t:clientValidation="false" ...
>
> or for the whole application:
>
> public static void
> contributeApplicationDefaults(MappedConfiguration<String, String>
> configuration) {
>        configuration.add(SymbolConstants.FORM_CLIENT_LOGIC_ENABLED, "false");
> }
>
> Steve.
>
>
> On 6 September 2011 12:15, Yohan Yudanara <yohan.yudan...@gmail.com> wrote:
>> oo sorry, I forgot to mention.
>> I'm using Tapestry 5.2.6
>>
>> On Tue, Sep 6, 2011 at 11:13 AM, Yohan Yudanara 
>> <yohan.yudan...@gmail.com>wrote:
>>
>>> Hi..
>>>
>>> I want to use submit button which can bypass client validation.
>>> Having read this documentation:
>>> http://tapestry.apache.org/current/tapestry-core/ref/org/apache/tapestry5/corelib/components/Submit.html,
>>> I was trying to use Submit component with mode="cancel" like this:
>>>
>>> <t:form t:id="form">
>>>         <t:textfield t:id="testField" t:value="testField"
>>> t:validate="required" />
>>>         <t:submit value="normal submit"/>
>>>         <t:submit mode="cancel" value="cancel submit"/>
>>> </t:form>
>>>
>>> But, when I click "cancel submit", nothing happen (form is not submitted to
>>> server).
>>> If I click "normal submit" after "cancel submit", the form is submitted to
>>> server without client validation.
>>>
>>> Why do I should click two buttons ( "cancel"  and then "normal" submit) to
>>> bypass client validation?
>>> Is it a bug?
>>> "Cancel submit" supposed to directly submit form to server, isn't it?
>>> Is there a simple workaround for this?
>>>
>>> Thanks in advance,
>>>
>>> Best regards,
>>> Yohan Yudanara
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>



-- 
Regards

Taha Hafeez Siddiqi (tawus)
http://tawus.wordpress.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to