2011-08-18 98 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)