Обновление количества не добавляет новую структуру - PullRequest
0 голосов
/ 05 декабря 2011

В настоящее время я создаю корзину покупок, которая использует структуру в массиве для хранения информации о корзине. Если товар уже добавлен в корзину и снова нажата кнопка «Добавить в корзину», мне нужно обновить количество структуры, а не добавлять другой элемент в корзину. Когда нажата кнопка «Добавить в корзину», я сначала проверяю, является ли массив пустым, если нет, я перебираю массив, ища идентификатор продукта, представленный в форме, и, если он найден, я просто обновляю поле количества, связанное с идентификатором продукта. Затем я устанавливаю переменную addNew = no. Я использовал cfelse, если продукт не найден, установите переменную addNew = yes. Я понимаю, в чем заключается моя проблема: если в корзине более одного товара, цикл продолжается, и, очевидно, в какой-то момент он не находит идентификатор товара и устанавливает переменную 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 ]

3 голосов
/ 05 декабря 2011

Есть две вещи, о которых я могу думать.

Во-первых, вы можете упростить свой код, избавившись от внешней проверки длины в массиве: цикл покроет это для вас.

Во-вторых, когда вы находите и обновляете свое количество (ИСТИННАЯ часть ЕСЛИ в цикле), вы - в этот момент - можете перестать искать товар. Нет смысла продолжать в остальной части массива искать то, что вы уже нашли. Поэтому используйте CFBREAK в этой точке, чтобы выйти из цикла.

Еще одна вещь, которую следует помнить, это то, что можно использовать CFPARAM для установки переменной, только если она еще не установлена. Так что если вы установите addNew в true и последующие вызовы CFPARAM эта переменная оставит все как есть. Однако в этом случае подход CFBREAK лучше.

2 голосов
/ 05 декабря 2011

Вы должны установить флаг в значение 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>
1 голос
/ 05 декабря 2011

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

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