【问题标题】:Validate dynamic checkbox验证动态复选框
【发布时间】:2018-02-27 02:03:22
【问题描述】:

我在数据库中有两个表,表 A 和表 B。用户填写表 A,将在表 A 中插入新记录。在表 B 中,表 A 中的记录称为复选框。从此表单中,数据将被插入到表 B 中。以下代码在表单 B 中。在此代码中捕获的数据将被插入到列中(假设列名为 menu_check),结果类似于“value1,value2, value3"(取决于用户选中的复选框数)

<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"   />#qMenu.menu_name_eng#

Form B 完成后,用户将被引导到一个页面,该页面显示 Table B 中所有记录的列表。用户可以从该表中编辑任何记录。类似于用户可以查看、更新或删除任何记录的简单列表。在编辑页面,如何调出menu_check的值,根据列查看是否有checkbox被勾选。

例如:

  • 如果 menu_check 中的值为 'value1,value2,value3',则仅选中第一个、第二个和第三个复选框。
  • 如果 menu_check 中的值为 'value1,value3',则仅选中第一个和第三个复选框。

我尝试使用分隔符,但仍然无法得到它,因为我不知道在此之后从哪里继续。

<cfloop delimiter="," index="a" list="#queryname.menu_check#"></cfloop>

我尝试使用类似的东西;

<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#" <cfif "#queryname.menu_check#" EQ "#qMenu.menu_id#">selected</cfif> /> #qMenu.menu_name_eng#

但这也没有用。我正在使用 ColdFusion9。

【问题讨论】:

  • 这一切都很好。到目前为止,您做了什么尝试来完成这项工作?
  • @James A Mohler 我试过 来获取不带逗号的值,但我没有关于验证它们的想法。我也试过 检查。但它不起作用。
  • 您需要将该类型的信息添加到问题中。您可能还想添加查询转储的屏幕截图和您获得的结果的屏幕截图。了解您使用的 CF 版本也很有用。
  • 注明。在我的问题中添加了更多详细信息。
  • .. data captured in this code will be inserted into a column ... resulting something like "value1,value2,value3" 可能需要重新考虑您的餐桌设计。虽然当前的问题可以通过列表函数解决,但将列表存储在 db 中通常不是一个好主意。列表更难查询和/或操作。

标签: html checkbox coldfusion


【解决方案1】:

为了使input[type=checkbox]被选中,你需要使用checked而不是selected

由于queryname.menu_check 的值,您可以使用listFind(list, value [, delimiters, includeEmptyValues]) 函数检查queryname.menu_check 中是否存在该值。

<cfset checkedstatus = "">
<cfif ListFind(queryname.menu_check, qMenu.menu_id)>
  <cfset checkedstatus = " checked">
</cfif>
<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"#checkedstatus#/> #qMenu.menu_name_eng#

循环中

<cfoutput query="qMenu">
  <cfset checkedstatus = "">
  <cfif ListFind(queryname.menu_check, qMenu.menu_id)>
    <cfset checkedstatus = " checked">
  </cfif>
  <input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"#checkedstatus#/> #qMenu.menu_name_eng#
</cfoutput>

【讨论】:

  • 谢谢!但是当我用 cfloop 尝试这个时(因为我需要循环复选框),如果表中至少有一个值,所有的复选框都会被选中。假设我选中了第一个复选框,在编辑它时,所有复选框都被选中,而不仅仅是第一个复选框。
  • 你只需要做一件事。在每次迭代的开始&lt;cfset checkedstatus = ""&gt; 这需要在那里。 ie. 我的答案中的整个代码 sn-p 需要在循环内。
【解决方案2】:

扩展RRK's answer,列表(和列表函数)肯定有帮助。但是,我不建议以这种方式实际将数据存储在数据库中。取而代之的是use a junction or bridge table,它提供了比列表更大的灵活性和性能。

Sample Table Structure

  • 用户 - 唯一用户表
  • 菜单 - 独特的菜单选项表
  • UserMenu - 每个用户的选定菜单选项表

请注意,联结表将每个选择存储为单独的行。这样,您可以根据需要存储尽可能少或尽可能多的选择,并轻松更改它们。

使用该结构,编辑页面只检索当前用户的选定选项并将这些值转换为列表。

 <cfquery name="qSelectedOptions" ...>
     SELECT MenuId
     FROM   UserMenu 
     WHERE  UserId = <cfqueryparam value="#form.currentUserID#" .... >
 </cfquery>

 <cfset selectedOptions = valueList(qSelectedOptions.MenuId)>

然后在生成复选框的循环中,一个简单的列表函数确定是否应选中每个框:

 <cfquery name="qMenu" ...>
     SELECT MenuId, MenuName
     FROM   Menu
     ORDER BY MenuName
 </cfquery>

 <cfoutput query="qMenu">
     #MenuName# 
     <input type="checkbox" name="menuOptions" value="#MenuId#" 
         <cfif listFind(selectedOptions, menuId)>checked</cfif>>
 </cfoutput>

最后,要将选择保存到数据库,首先删除现有值,然后插入任何新值。

   <cftransaction>
       <cfquery ....>
         DELETE FROM UserMenu 
         WHERE  UserId = <cfqueryparam value="#form.currentUserID#" cfsqltype="...">
       </cfquery ....>
       <cfquery ....>
          INSERT INTO UserMenu (UserID, MenuID)
          SELECT <cfqueryparam value="#form.currentUserID#" cfsqltype="...">
                     , MenuId
          FROM   Menu
          WHERE  MenuId IN (
             <cfqueryparam value="#form.menuOptions#" list cfsqltype="...">

          )
       </cfquery>
    </cftransaction>

【讨论】:

    【解决方案3】:

    我已经设法解决了这个问题。我正在使用 CONTAIN 检查数据库中是否存在该值。我的代码行;

    <input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"  
    <cfif qSubCheck.con_check CONTAINS #qMenu.menu_id#>Checked</cfif>
    />#qMenu.menu_name_eng#
    

    感谢大家的帮助!

    【讨论】:

    • 如果您正在使用列表,请不要使用 CONTAINS。与列表函数不同,CONTAINS 不匹配整个值。因此,搜索“value1”也将匹配“value11”和“value1111”。尽管如此,我不建议将列表存储在数据库表中。此外,与问题无关,但 cfif 中不需要井号。
    • ... 换句话说,CONTAINS 可能会返回错误的列表结果。
    • 注明。我会记住你的建议。到目前为止,我的功能只是在数据库表中查找值 1、2、3 和 4,所以现在应该没问题。再次感谢。
    • 因为这是一个简单的更改,我现在就修复它...以避免在我早已忘记这个问题时产生未来的错误...但这只是我;-)
    猜你喜欢
    • 2011-06-29
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多