2011-08-18 100 views
1

我已经存储在会话购物车阵:Screen Shot of Shopping Cart ArrayColdFusion的阵列和结构

我给我的用户选择的所有项目进行删除或通过复选框单个项目的能力。

我送通过表单提交数组索引arrayDeleteAt

现在如果我选择最下面的3个项目,它不会删除它。

这里是我的删除代码:

<cfif isDefined("form.leadId") AND listLen(form.leadId)> 
    <cfloop from="#listLen(form.leadId)#" to="1" step="-1" index="i"> 
    <cfset temp = arrayDeleteAt(session.shoppingcart, #i#)> 
    </cfloop> 
</cfif> 
+2

既然你不使用的结果,可能也删除'temp'。即'' – Leigh

+1

注意Leigh也删除了散列符号,因为它们不是必需的...... ColdFusion已经在没有它们的情况下评估'i'。 –

回答

7

您将有更多的问题与这种管理您的购物车的方法。在使用ArrayDeleteAt之后,数组的索引将被重新计算,因此当您最有可能从数组中删除错误的项目时,或者当您尝试删除超出范围的项目时可能会出错。

看到你正试图通过向后查看你的列表来解决这个问题,而Dan对于你上面的代码的问题是正确的,但是如果列表以不正确的顺序传入,那么你在一个受伤的世界。

我会建议,而不是使用数组,使用结构与代理键,如UUID,然后删除该密钥项目。

5

的问题是,你在柜台的位置删除,而不是在传递的表单字段试试这个:

<cfset temp = arrayDeleteAt(session.shoppingcart, ListGetAt(FORM.leadID, i) /> 

更新:为了解决Tyler提到的问题,您可以使用ListToArrayFORM.leadID的索引列表转换为数组,然后使用ArraySort以确保您的删除操作正确。

虽然我的答案确实解决了您的直接问题,但您肯定会更好地遵循泰勒的建议,并为购物车中的每件商品使用一个密钥,以确保您管理的是您实际上认为应该是该商品的商品管理:)

0

在CF 10或Railo 4,这是可以做到用的Underscore.cfc librarymost recent version

<cfscript> 
if (structKeyExists(form, 'leadId') && listlen(form.leadId)) { 
    _ = new Underscore(); 

    variables.shoppingCart = duplicate(session.shoppingCart); 

    variables.newCart = _.reject(variables.shoppingCart, function(val, index){ 
     return _.include(form.leadId, index); 
    }); 
} 
</cfscript> 

<cfif structKeyExists(variables, "newCart") > 
    <cflock scope="session" type="exclusive" timeout="10"> 
     <cfset session.shoppingCart = variables.newCart> 
    </cflock> 
</cfif> 

你会看到,我复制的购物车到变量的作用域,编辑它,然后如有必要,将其复制(带锁)。如果可以在cfscript中写入cflocks,我会在cfscript中完成这一切。

(声明:我写Underscore.cfc)