如何知道每行勾选了哪个复选框?

时间:2014-02-26 13:51:36

标签: html coldfusion coldfusion-10

使用:Coldfusion 10,JQuery 1.9,HTML5(更多HTML4)

对于这个问题,标题看似简单。我有一个表,显示用户对应用程序中的实体的权限。为了创建一个新用户,我有一个FORM,允许您输入个人详细信息,然后在同一页面上输入一个表格,允许您选择要为该用户提供的权限。

所以这就是网页表的外观(排序):

EntityName  | Write | Read | Delete   // Permissions
===================================
Note        |  □    |   □   |   □     // 1 row per entity
Appointment |  □    |   □   |   □
Sale        |  □    |   □   |   □

(想象一下,为方便说明,方框是复选框)。

权限来自名为rsPermissions的结果(主键为PermissionID)。我循环遍历rsPermissions结果集,并为每个结果集创建一个新的标题列。

EntityNames来自名为rsEntities的结果集(主键为EntityID)。我循环遍历rsEntities结果集并为每个结果集创建一个新行。

问题在于:我知道选中了哪个复选框,可以获取PermissionID,例如写或读或删除。但我不知道检查了哪个EntityID此权限。也就是说,我似乎无法获得与实体相关的权限,以便PermissionIDEntityID的这种组合可以传递到我的数据库,以便插入到EntityPermission数据库表中:

EntityID | PermissionID 
=======================
1        |  1
1        |  2
1        |  3
2        |  1
2        |  3
3        |  1
3        |  2  

更新显示HTML: http://jsfiddle.net/2jZYB/

<table>
  <thead>
    <tr>
      <th scope="col">EntityName</th>
      <th scope="col">Write</th>
      <th scope="col">Read</th>
      <th scope="col">Delete</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Note</td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
    </tr>
    <tr>
      <td>Appointment</td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
    </tr>
    <tr>
      <td>Sale</td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
      <td><input name="" type="checkbox" value=""></td>
    </tr>
  </tbody>
</table>

这是ColdFusion标记:

   <cfloop query="rsEntities">
  <table>
    <thead>
      <tr>
        <th scope="col">EntityName</th>
        <cfloop query="rsPermissions">
          <th scope="col">#Permission#</th>
        </cfloop>
      </tr>
    </thead>
    <tbody>
      <cfloop>
        <tr>
          <td>#Entity#</td>
          <cfloop index="i" from="1" to="#rsPermissions.RecordCount#">
            <td><input name="" type="checkbox" value=""></td>
          </cfloop>
        </tr>
      </cfloop>
    </tbody>
  </table>
</cfloop>

3 个答案:

答案 0 :(得分:2)

假设权限列表非常小,另一个选项是按实体ID命名每组复选框,并使用复选框value的权限ID:

 <cfloop query="rsEntities">
     <!--- generate a list of all entity ids --->
     <input type="hidden" name="EntityIDList" value="#rsEntities.EntityID#">

     ...
     <cfloop index="i" from="1" to="#rsPermissions.RecordCount#">
         <!--- Group each set of permissions by entity id --->
         <input name="EntityPermissions_#rsEntities.EntityID#" 
               value="#rsPermissions.permissionID[i]#"
               type="checkbox" >
    </cfloop>
    ...
</cfloop>

最终结果将是每个实体ID的权限列表。所以说你检查了实体“注意”和“销售”的“读”和“写”,结果将是每个实体的权限列表,即:

   FORM.EntityPermissions_1 = 1,2  <== Note (Write=1,Read=2)
   FORM.EntityPermissions_3 = 1,2  <== Sale (Write=1,Read=2)

提交表单时,您可以遍历实体ID,并使用简单的CROSS JOIN通过INSERT / SELECT将所选权限插入到表中,从而最大限度地减少数据库调用的总数。这个方法的一个很好的附带好处是内置于id值的验证。 (显然,查询应该包含在cftransaction中以确保数据完整性。)

<cfloop list="#FORM.EntityIDList#" index="EntityID">

    <!--- if any permissions were assigned for this entity ....--->
    <cfif structKeyExists(FORM, "EntityPermissions_"& EntityID)
            AND listLen(FORM["EntityPermissions_"& EntityID])>

        <!--- insert them into the db ...--->
        <cfquery ...>
            SELECT e.EntityID, p.PermissionID
            FROM   EntityTable e CROSS JOIN PermissionTable p
            WHERE  e.EntityID = <cfqueryparam value="#EntityID#" .... >
            AND    p.PermissionID IN 
                   (
                       <cfqueryparam 
                            value="#FORM['EntityPermissions_'& EntityID]#" 
                            list="true" .... >
                   ) 
        </cfquery>
    </cfif>
</cfloop>

答案 1 :(得分:1)

您可以使用类似

的内容
<input type="checkbox" name="permission[note][1]" />
<input type="checkbox" name="permission[note][2]" />
<input type="checkbox" name="permission[note][3]" />

注意三个复选框?

如果这适用于您的情况,请告诉我。

答案 2 :(得分:1)

如果我们能够看到HTML而不是模型,那么回答会更容易。也就是说,您应该能够为每个复选框指定一个唯一的名称/ ID,您可以在javascript或后端代码中引用它。

<input type="checkbox" id="Write_1"  name="Write_1" />  <!-- Write chk, entity 1 -->
<input type="checkbox" id="Read_1"   name="Read_1" />   <!-- Read chk, entity 1 -->
<input type="checkbox" id="Delete_1" name="Delete_1" /> <!-- Delete chk, entity 1 -->
<input type="checkbox" id="Write_2"  name="Write_2" />  <!-- Write chk, entity 2 -->
<input type="checkbox" id="Read_2"   name="Read_2" />   <!-- Read chk, entity 2 -->
<input type="checkbox" id="Delete_2" name="Delete_2" /> <!-- Delete chk, entity 2 -->

或者更容易的事情:

<input type="checkbox" id="Perm_1_1"  name="Perm_1_1" /> <!-- perm 1, entity 1 -->
<input type="checkbox" id="Perm_2_1"  name="Perm_2_1" /> <!-- perm 2, entity 1 -->
etc.

在ColdFusion中,您可以遍历实体和权限以查看用户已检查的内容 -

<cfloop list="#entityList#" index="entityID">
    <cfloop list="#permissionList#" index="permID">
        <cfif IsDefined("Form.Perm_#permID#_#entityID#")>
            <!--- User has checked this permission. --->
        <cfelse>
            <!--- User has NOT checked this permission. --->
        </cfif>
    </cfloop>
</cfloop>