1 Reply Latest reply on Sep 19, 2009 9:02 AM by Nick Belaevski

    PLS Help - a4j:CommandButton call converters when submit a d

    Tim Nguyen Newbie

      In my application, I have to disable a rich:calendar component using Java script. This calendar component has a converter attached to it. When I submit the form using a4j:commandButton, even though the component is disabled, it still called the converter which causes errors on my apps.

      I tested with h:commandButton and it works fine. JSF h:commmandButton does not call converter when it submits a disabled component.

      Why a4j:commandButton behaves differently? Is this a Richfaces bug? Is there anyway I can work around this issue? I very appreciate your help!!

      Here is my test code example. In this example, I use h:commandButton as well as a4j:commandButton. First, enter something in rich:calendar's input date. Then click on Disable button to call a javascript to disable the rich calendar. Then click on either h_commandButton or a4j_commandButton. Notice that when a4j_commandButton is clicked, it calls the dateTimeConverter while h_commandButton does not.

      <a4j:form id="test123">
       <rich:calendar id="dateCalendarId" enableManualInput="true" datePattern="dd/MM/yyyy" value="#{testBean.dateValue}">
       <f:converter converterId="dateTimeConverter"/>
       </rich:calendar>
      
      <h:commandButton value="h_CommandButton" actionListener="#{testBean.submitValue}" />
      
      <a4j:commandButton value="a4j_CommandButton" actionListener="#{testBean.submitValue1}" />
      </a4j:form>
      
      <h:commandButton onclick="disableMe(true);" value="Disable"/>
      <h:commandButton onclick="disableMe(false);" value="Enable"/>
      
      <script type="text/javascript">
      //<![CDATA[
       function disableMe(flag) { document.getElementById('test123:dateCalendarIdInputDate').disabled=flag;}
      //]]>
      </script>
      </ui:composition>
      


      Here is a simple backing Bean:
      @Name("testBean")
      public class TestConverterBean {
      
       private Object dateValue;
       public Object getDateValue() { return this.dateValue; }
       public void setDateValue(Object dateValue) { this.dateValue = dateValue;}
      
       public void submitValue(final ActionEvent event) { }
       public void submitValue1(final ActionEvent event) { }
      }
      


      Not only rich:calendar, I tested on inputText with converter --> same result:

      <a4j:form id="test123">
       <h:inputText id="inputTextId" value="#{testBean.value}">
       <f:converter converterId="myConverter"/>
       </h:inputText><br/>
      
       <h:commandButton value="h_CommandButton" actionListener="#{testBean.submitValue}" />
      
       <a4j:commandButton value="a4j_CommandButton" actionListener="#{testBean.submitValue1}" />
      </a4j:form>
      
      <h:commandButton onclick="disableMe(true);" value="Disable"/>
      <h:commandButton onclick="disableMe(false);" value="Enable"/>
      
      <script type="text/javascript">
      //<![CDATA[
       function disableMe(flag) {
      document.getElementById('test123:inputTextId').disabled=flag;
       }
      //]]>
       </script>
      </ui:composition>
      


      And here is a simple converter:
      @Name("myConverter")
      @org.jboss.seam.annotations.faces.Converter
      @BypassInterceptors
      public class MyConverter implements Converter {
      
      public Object getAsObject(@SuppressWarnings("unused") FacesContext fc, @SuppressWarnings("unused") UIComponent uiComp, String string) {
       return string + " test123";
       }
      
       public String getAsString(@SuppressWarnings("unused") FacesContext fc, @SuppressWarnings("unused") UIComponent uiComp, Object obj) {
       return obj.toString();
       }
      }