2011-08-18 38 views
1

は、私がセッションに保存されているショッピングカートの配列を持っています。ColdFusion配列と構造体

私は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などの代理キーを使用して構造体を使用し、そのキーで項目を削除することをお勧めします。

CF 10またはRailo 4では
5

問題は、あなたがカウンターの位置、およびないで渡されるのフォーム・フィールドで削除しているということである代わりに、これを試してみてください:。

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

更新:Tylerが述べた問題を回避するには、とArraySortを使用して、インデックスのリストをFORM.leadIDからListToArrayに変換し、削除が正しいことを確認する必要があります。

私の答えはあなたの直ぐの問題を解決しますが、あなたが実際にあなたが思っていると思っているものを管理しているかどうか確認するために、カート内の各項目のキーを使って、管理:

0

は、これを使用して行うことができ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を書いた)