更新数量不添加新结构

时间:2011-12-05 11:07:07

标签: coldfusion

我目前正在构建一个购物车,它使用数组中的结构来保存购物车信息。如果产品已经添加到购物车并再次按下添加到购物车按钮,我需要更新结构数量而不是将另一个项目添加到购物车。当按下添加到购物车按钮时,我首先检查数组是否为空,如果没有,我遍历数组寻找表单提交的产品ID,如果找到我只是更新与产品ID关联的数量字段,然后我设置一个变量addNew = no。如果找不到产品,我使用了cfelse设置变量addNew = yes。我意识到我的问题是什么,如果购物车有多个产品,循环继续,显然在某些时候它找不到产品ID并设置变量addNew = new,这将更新数量,也将将产品添加到新结构中,最后使用产品数量2和产品数量1。

这是第一次以这种方式使用数组和结构,我只是找到了解决方法,所以如果我的代码效率不高,我会道歉。任何指针都非常感谢;

<cfif arrayLen(session.mycart) GT 0>
    <cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
        <!---check for existance of the id submitted--->
        <cfif session.mycart[i].itemID eq form.itemID>
        <!---if the id is matched update the quantity--->
            <cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
            <cfset myTotal = form.itemCost*session.mycart[i].quantity>
            <cfset session.mycart[i].totalPrice = myTotal>
            <!---this will tell the add to cart function not add a new item--->
            <cfset addNew = "no">
        <cfelse>
        <!---as this is a new item tell the add to cart function to add it--->
            <cfset addNew ="yes">
        </cfif>
    </cfloop>
<cfelse>
<!---as the array is empty tel the add to cart function insert the product--->
    <cfset addNew ="yes">
</cfif>

3 个答案:

答案 0 :(得分:3)

我能想到两件事。

首先,您可以通过去除阵列上的外部长度检查来简化代码:循环将为您覆盖。

其次,当您找到并更新数量(循环中IF的TRUE部分)时,您 - 此时 - 可以停止查找该项目。继续通过阵列的其余部分寻找你已经找到的东西是没有意义的。因此,在此时使用CFBREAK退出循环。

另一件需要记住的事情是,只有在尚未设置变量的情况下,才能使用CFPARAM设置变量。因此,如果将addNew设置为true,并且后续调用CFPARAM,则该变量将保持原样。但是在这种情况下,CFBREAK方法更好。

答案 1 :(得分:2)

你应该在开始时将标志设置为true,然后在循环时,如果找到产品,只需将标志设置为false。

<!--- first set the flag to add item to cart --->
<cfset addNew = true>

<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
    <!---check for existance of the id submitted--->
    <cfif session.mycart[i].itemID eq form.itemID>
    <!---if the id is matched update the quantity--->
        <cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
        <cfset myTotal = form.itemCost*session.mycart[i].quantity>
        <cfset session.mycart[i].totalPrice = myTotal>

        <!---if the item is already in the cart, tell the add to cart function not add a new item--->
        <cfset addNew = false>
    </cfif>
</cfloop>

答案 2 :(得分:1)

听起来你需要的是购物车中每件商品的布尔值,而不仅仅是一个。所以你甚至可以将它添加到现有结构中。即使ColdFusion允许你使用字符串“yes”和“no”作为布尔值,我认为你最好使用true和false。

        <cfif session.mycart[i].itemID eq form.itemID>
        <!---if the id is matched update the quantity--->
            <cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
            <cfset myTotal = form.itemCost*session.mycart[i].quantity>
            <cfset session.mycart[i].totalPrice = myTotal>
            <!---this will tell the add to cart function not add a new item--->
            <cfset session.mycart[i].addNew = FALSE>
        <cfelse>
        <!---as this is a new item tell the add to cart function to add it--->
            <cfset session.mycart[i].addNew =TRUE>
        </cfif>