You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Jakob Schwendner <ja...@publicimage.eu.com> on 2004/05/18 08:39:57 UTC

disabling widgets in CForms

Hi,

Is there a way to disable groups of widgets in CForms?

My application:

Payment:
(x) Invoice
( ) Credit Card

CC Number
CC Expiry

There is a choice between invoice or CC payment. In case the user
selects Invoice payment the CC Number and CC expiry field should
not get validated and at best not even be displayed. 
Is there any preferred way to do this in CForms?

thanks for any suggestions.


Jakob Schwendner
------
Public Image
Creative Strategy & Production 
for Print, Online & Broadcast Media

Re: disabling widgets in CForms

Posted by Jan Hoskens <jh...@schaubroeck.be>.
Just noticed that I forgot the javascript. This has to be included (in your header, or include it as woody-lib.js):

function woody_checkboxGroup(checkboxGroup, length){
for (var i = 0; i < length; i++) {
var gr = document.getElementById(checkboxGroup + "_items_" + i);
if (gr.style.display == "none")
{
gr.style.display = "block";
}
else
{
gr.style.display = "none";
}
} 
}

  ----- Original Message ----- 
  From: Jan Hoskens 
  To: users@cocoon.apache.org 
  Sent: Tuesday, May 18, 2004 9:02 AM
  Subject: Re: disabling widgets in CForms


  A while ago I created an extra template in my woody (cforms) to show/not show a group of widgets if a checkbox is clicked. It may give you something to begin with:

  This template goes in your woody/cform stylesheet or create your own stylesheet and let this stylesheet include the other woody/cform stylesheets

  <!--
      wi:group of type checkboxGroup: changes display settings to none resp. block if previous was resp. block or none, thus flipping its display state
    -->
    <xsl:template match="wi:group[wi:styling/@type='checkboxGroup']">
      
       <xsl:variable name="value" select="wi:state/wi:*/wi:value"/>
      
   <!-- copy the "state-widget" attribute for use in for-each -->
      <xsl:variable name="state-widget" select="wi:state/wi:*/@id"/>

      <xsl:variable name="id" select="generate-id()"/>
          <xsl:apply-templates select="wi:label/node()"/>
    <xsl:apply-templates select="text()"/>
          <input type="checkbox" name="{$state-widget}" onchange=" woody_checkboxGroup('{$id}',  {count(wi:items/*)})">
     <xsl:if test="$value = 'true'">
      <xsl:attribute name="checked">true</xsl:attribute>
     </xsl:if>
    </input>
          <xsl:if test="wi:items/*//wi:validation-message">
            <span style="color:red; font-weight: bold">&#160;!&#160;</span>
          </xsl:if>

        <!-- a div for each of the items -->
        <xsl:for-each select="wi:items/wi:*">
          <div id="{$id}_items_{position() - 1}">
     <xsl:if test="not($value = @displayWhen)">
      <xsl:attribute name="style">display:none</xsl:attribute>
     </xsl:if>
            <xsl:apply-templates select="."/>
          </div>
        </xsl:for-each>
    </xsl:template>

  Use this to show the checkbox (template):

  <wi:group>
      <wi:styling type="checkboxGroup"/>
      <wt:widget-label id="state"/>
      <wi:state>
        <wt:widget-label id="state"/>: <wt:widget id="state"/>
      </wi:state>
      <wi:items>
         <wi:group displayWhen="false">        
          <wi:items>
           Name:  <wt:widget id="name"/>
          </wi:items>
         </wi:group>
     </wi:items>
   </wi:group>

  definition:

    <wd:booleanfield id="state">
     <wd:label>Do you want to give your name?</wd:label>
    </wd:booleanfield>
    <wd:field id="name">
     <wd:datatype base="string"/>
    </wd:field>

  This should give you a textbox asking if you want to give your name, if checked a textfield should appear.

  Note however, that this is just one way, you may accomplish the same by using javascript!

  Kind Regards,
  Jan

    ----- Original Message ----- 
    From: Jakob Schwendner 
    To: users@cocoon.apache.org 
    Sent: Tuesday, May 18, 2004 8:39 AM
    Subject: disabling widgets in CForms


    Hi,

    Is there a way to disable groups of widgets in CForms?

    My application:

    Payment:
    (x) Invoice
    ( ) Credit Card

    CC Number
    CC Expiry

    There is a choice between invoice or CC payment. In case the user
    selects Invoice payment the CC Number and CC expiry field should
    not get validated and at best not even be displayed. 
    Is there any preferred way to do this in CForms?

    thanks for any suggestions.


    Jakob Schwendner
    ------
    Public Image
    Creative Strategy & Production 
    for Print, Online & Broadcast Media

Re: disabling widgets in CForms

Posted by Jan Hoskens <jh...@schaubroeck.be>.
A while ago I created an extra template in my woody (cforms) to show/not show a group of widgets if a checkbox is clicked. It may give you something to begin with:

This template goes in your woody/cform stylesheet or create your own stylesheet and let this stylesheet include the other woody/cform stylesheets

<!--
    wi:group of type checkboxGroup: changes display settings to none resp. block if previous was resp. block or none, thus flipping its display state
  -->
  <xsl:template match="wi:group[wi:styling/@type='checkboxGroup']">
    
     <xsl:variable name="value" select="wi:state/wi:*/wi:value"/>
    
 <!-- copy the "state-widget" attribute for use in for-each -->
    <xsl:variable name="state-widget" select="wi:state/wi:*/@id"/>

    <xsl:variable name="id" select="generate-id()"/>
        <xsl:apply-templates select="wi:label/node()"/>
  <xsl:apply-templates select="text()"/>
        <input type="checkbox" name="{$state-widget}" onchange=" woody_checkboxGroup('{$id}',  {count(wi:items/*)})">
   <xsl:if test="$value = 'true'">
    <xsl:attribute name="checked">true</xsl:attribute>
   </xsl:if>
  </input>
        <xsl:if test="wi:items/*//wi:validation-message">
          <span style="color:red; font-weight: bold">&#160;!&#160;</span>
        </xsl:if>

      <!-- a div for each of the items -->
      <xsl:for-each select="wi:items/wi:*">
        <div id="{$id}_items_{position() - 1}">
   <xsl:if test="not($value = @displayWhen)">
    <xsl:attribute name="style">display:none</xsl:attribute>
   </xsl:if>
          <xsl:apply-templates select="."/>
        </div>
      </xsl:for-each>
  </xsl:template>

Use this to show the checkbox (template):

<wi:group>
    <wi:styling type="checkboxGroup"/>
    <wt:widget-label id="state"/>
    <wi:state>
      <wt:widget-label id="state"/>: <wt:widget id="state"/>
    </wi:state>
    <wi:items>
       <wi:group displayWhen="false">        
        <wi:items>
         Name:  <wt:widget id="name"/>
        </wi:items>
       </wi:group>
   </wi:items>
 </wi:group>

definition:

  <wd:booleanfield id="state">
   <wd:label>Do you want to give your name?</wd:label>
  </wd:booleanfield>
  <wd:field id="name">
   <wd:datatype base="string"/>
  </wd:field>

This should give you a textbox asking if you want to give your name, if checked a textfield should appear.

Note however, that this is just one way, you may accomplish the same by using javascript!

Kind Regards,
Jan

  ----- Original Message ----- 
  From: Jakob Schwendner 
  To: users@cocoon.apache.org 
  Sent: Tuesday, May 18, 2004 8:39 AM
  Subject: disabling widgets in CForms


  Hi,

  Is there a way to disable groups of widgets in CForms?

  My application:

  Payment:
  (x) Invoice
  ( ) Credit Card

  CC Number
  CC Expiry

  There is a choice between invoice or CC payment. In case the user
  selects Invoice payment the CC Number and CC expiry field should
  not get validated and at best not even be displayed. 
  Is there any preferred way to do this in CForms?

  thanks for any suggestions.


  Jakob Schwendner
  ------
  Public Image
  Creative Strategy & Production 
  for Print, Online & Broadcast Media