使用: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
此权限。也就是说,我似乎无法获得与实体相关的权限,以便PermissionID
和EntityID
的这种组合可以传递到我的数据库,以便插入到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>
答案 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>