6 Replies Latest reply on Nov 29, 2006 1:14 PM by PamG

    Dynamic variable names and invalid_character_err

    PamG Level 1
      I'm neither an expert at structure notation nor dynamic variable naming conventions and would appreciate any help with the following. Thanks!

      This code works fine.

      <cfset idx="123">
      <cfset form.product[idx]=StructNew()>
      <cfparam name="form.product[idx].product_nm" default="Raspberry Jam">
      <cfform name="data_entry" method="post" format="flash" height="525" width="675" action="formdump.cfm">
      <cfformgroup type="tabnavigator" height="400" width="650">
      <cfformgroup type="page" label="Product #idx#">
      <cfinput name="static_form_name" type="text" label="Product" value="#form.product[idx].product_nm#" height="350" width="600" readonly="yes">
      </cfformgroup>
      </cfformgroup>
      </cfform>

      The following code results in the following error: "ORG.W3C.DOM.DOMEXCEPTION ERROR. Message: INVALID_CHARACTER_ERR: An invalid or illegal XML character is specified." The only change is in the "name" attribute of the <cfinput> tag:

      <cfset idx="123">
      <cfset form.product[idx]=StructNew()>
      <cfparam name="form.product[idx].product_nm" default="Raspberry Jam">
      <cfform name="data_entry" method="post" format="flash" height="525" width="675" action="formdump.cfm">
      <cfformgroup type="tabnavigator" height="400" width="650">
      <cfformgroup type="page" label="Product #idx#">
      <!--- Change value of name attribute from "static_form_name" to "product[idx].product_nm" --->
      <cfinput name="product[idx].product_nm" type="text" label="Product" value="#form.product[idx].product_nm#" height="350" width="600" readonly="yes">
      </cfformgroup>
      </cfformgroup>
      </cfform>

      Pam Grieger
      plgrieger@fedex.com
        • 1. Re: Dynamic variable names and invalid_character_err
          Level 7
          <cfinput name="product[idx].product_nm"

          You can't do this. Ultimately a <cfinput tag is going to create an HTML
          <input...> and the name of that input tag must follow the HTML
          specifications. These specifications do not allow for any kind of
          complex variable type notation.

          Depending on what you are trying to do, there are some conventional work
          arounds.
          • 2. Re: Dynamic variable names and invalid_character_err
            PamG Level 1
            Thanks for the info. Knowing what WON’T work is helpful!

            Here’s what I’m trying to do. I’m rewriting one of my apps, switching out conventional HTML form controls for <cfform> controls in Flash format. Many of the existing forms in my app are for updating data contained in a central database. When such a form is rendered to the screen, each form control is pre-populated with existing data. All form controls are named dynamically based upon the unique ID of the record being updated. Here’s a streamlined but typical example:

            <!--- User selected projects 14, 15, 16, and 17 for update. Get existing project data. --->
            <cfquery name="get_project_detail" datasource="#application.DataSource#">
            SELECT project_oid_nbr, project_nm
            FROM project_table
            WHERE project_oid_nbr IN (14,15,16,17)
            ORDER BY project_oid_nbr
            </cfquery>

            <!--- Initialize the project_nm form control. Form names are dynamic, based upon get_project_detail.project_oid_nbr. --->
            <cfloop query="get_project_detail">
            <cfparam name="form.project_nm_#project_oid_nbr#" default="#get_project_detail.project_nm#">
            </cfloop>

            <!--- Create HTML form control. --->
            <table>
            <cfloop query="get_project_detail">
            <tr>
            <td>
            <cfoutput>
            Project #project_oid_nbr#:
            <input type="text" name="project_nm_#project_oid_nbr#" value="#Evaluate("form.project_nm_#project_oid_nbr#")#">
            </cfoutput>
            </td>
            </tr>
            </cfloop>
            </table>

            This has been working just fine. However, I’m wondering if using the Evaluate() function is the most efficient way to go. Therefore I wanted to use structure notation to avoid the Evaluate() function, but as mentioned in my original post, this naming convention won’t work with <cfform> tags.

            Any suggestions as to the most efficient way to get the same result while still using <cfform> tags? Thanks so much!
            • 3. Re: Dynamic variable names and invalid_character_err
              Level 7
              Well you can use array notation to create the dynamic name of the field,
              while still assuring that the resulting field name is HTML compliant.

              <input type="text" name="project_nm_#project_oid_nbr#"
              value="#form['project_nm_' & project_oid_nbr]#>

              The general consensus that in the latest versions of CF this array form
              and the evaluate form are basically the same speed and performance wise,
              the generate the same javabyte code. But most developers I know say
              this from is easier to read.
              • 4. Re: Dynamic variable names and invalid_character_err
                PamG Level 1
                Wow, thanks! That worked beautifully. One last question: In the following code I get an error on the IsDefined() statement. The error reads: "Parameter 1 of function IsDefined, which is now "form['work_type_oid_nbr_'&idP]", must be a syntactically valid variable name."

                Could you please tell me the correct syntax?

                <cfif IsDefined("form['work_type_oid_nbr_'&idP]")>
                <cfselect name="work_type_oid_nbr_#idP#"
                label="Work Type"
                query="qMenuWorkType"
                value="work_type_oid_nbr"
                display="work_type_desc"
                selected="#form['work_type_oid_nbr_'&idP]#">
                </cfselect>
                </cfif>
                • 5. Re: Dynamic variable names and invalid_character_err
                  Level 7
                  <cfif IsDefined("form['work_type_oid_nbr_'&idP]")>

                  Yes that would take some tweaking to get to work correctly, but since we
                  are treating the form as the structure it is; the struckKeyExists()
                  function is easier to use.

                  <cfif structKeyExists(form, "work_type_oid_ndb_#idP#")>
                  OR
                  <cfif structKeyExists(form, "work_type_oid_ndb_" & idP)>

                  • 6. Re: Dynamic variable names and invalid_character_err
                    PamG Level 1
                    Ian: Sorry it's taken me so long to thank you for that last reply. Just know that your answer sent me off to a couple of very long (but productive) weeks of coding!