ColdFusion Array And Struct - PullRequest
       15

ColdFusion Array And Struct

1 голос
/ 19 августа 2011

У меня есть массив корзины покупок, сохраненный в сеансе: Screen Shot of Shopping Cart Array

Я даю своему пользователю возможность выбрать все элементы для удаления или выбрать отдельные элементы с помощью флажка.

Iотправляю индекс массива через форму сообщения на arrayDeleteAt.

Теперь, если я выберу три нижних элемента, он не будет удален.

Вот мой код удаления:

<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>

Ответы [ 3 ]

7 голосов
/ 19 августа 2011

У вас будет больше проблем с этим методом управления вашей корзиной. После использования ArrayDeleteAt индексы массива будут пересчитаны, поэтому, когда вы, скорее всего, удалите неправильный элемент из массива, или вы можете получить ошибку при попытке удалить элемент, выходящий за пределы.

Видно, что вы пытаетесь обойти это, работая в обратном порядке через свой список, и Дэн прав в том, что ваша проблема с кодом выше, но если список передан в неправильном порядке, то вы Мир боли.

Я бы предложил вместо использования массива использовать структуру с суррогатным ключом, например, UUID, а затем удалять элементы по этому ключу.

5 голосов
/ 19 августа 2011

Проблема в том, что вы удаляете в позиции счетчика, а не в поле формы, которое передается. Попробуйте вместо этого:

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

ОБНОВЛЕНИЕ: Чтобы обойти проблему, упомянутую Тайлером, вы можете преобразовать свой список индексов из FORM.leadID в массив, используя ListToArray, а затем ArraySort, чтобы получить их в порядке, необходимом для проверки правильности удалений. .

Хотя мой ответ действительно решает вашу непосредственную проблему, вам, безусловно, будет лучше последовать совету Тайлера и использовать ключ для каждого элемента в корзине, чтобы убедиться, что вы управляете тем, который на самом деле вы считаете нужным :)

0 голосов
/ 06 июля 2012

В CF 10 или Railo 4 это можно сделать с помощью самой последней версии библиотеки Underscore.cfc :

<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)

...