ColdFusion 11: Как проверить, найдено ли значение поля формы в объекте Struct, без повторной загрузки страницы? - PullRequest
0 голосов
/ 14 июля 2020

Сценарий: у меня есть форма регистрации с полем промокода. Мне нужно проверить, что промо-код, введенный пользователем, действителен без перезагрузки страницы.

Все промокоды сохраняются в Struct следующим образом (не фактические значения, но тот же формат):

<cfset sysPromoCode = structNew()>
<cfset tmp = StructInsert(sysPromoCode,"PC1","1.00")>
<cfset tmp = StructInsert(sysPromoCode,"PC5","5.00")>
<cfset tmp = StructInsert(sysPromoCode,"PC10","10.00")>
<cfset tmp = StructInsert(sysPromoCode,"PC15","15.00")>
<cfset tmp = StructInsert(sysPromoCode,"PC20","20.00")>
<cfset REQUEST.PromoCodeStruct = sysPromoCode>

В моем файле компонента ('cmp-settings.cf c') я создал эту функцию:

<cffunction name="ValidatePromoCode" access="remote" returnformat="json" output="false">
    <cfargument name="PromoCode" type="string" required="true">
    <cfif StructKeyExists(REQUEST.PromoCodeStruct, arguments.PromoCode)>
        <cfset isvalidPromoCode = true>
    <cfelse>
        <cfset isvalidPromoCode = false>
    </cfif>
    <cfreturn isvalidPromoCode />
</cffunction>

И раздел формы, с которой я работаю:

<label for="fPromo">Promo Code</label>

<input type="text" class="form-control" id="id_PromoCode" name="PromoCode" maxlength="10"> 
<a href="javascript:void();" onclick="applyPromo();" class="btn btn-success btn-sm">Apply</a>
                                
<div id="pInvalid" style="display:none;color:##ff0000;font-weight:bold;">Invalid code!</div>
<div id="pValid" style="display:none;color:##66cc00;font-weight:bold;">You've entered a valid code!</div>

'applyPromo ()' - это базовая c javascript функция, которая запускает процесс отображения / скрытия в полях pInvalid и pValid. Это сценарий, который я заменяю, поскольку в настоящее время он предоставляет список промо-кодов в источнике страницы. Я ожидаю, что его нужно заменить на звонок AJAX, но я действительно недостаточно знаком с JQuery и AJAX, чтобы найти решение самостоятельно.

Любые советы и помощь были бы очень благодарны из нового ie в StackOverflow.

1 Ответ

2 голосов
/ 14 июля 2020

Когда вы onclick="applyPromo();", эта функция должна сделать запрос Ajax к серверу для проверки промокода, вернуть сумму скидки и применить ее в пользовательском интерфейсе.

Когда вы отправив форму, вам необходимо повторно подтвердить код скидки на стороне сервера. Убедитесь, что скорректированная сумма также рассчитывается на сервере. Не верьте, что форма не просто принимает то, что код на стороне клиента говорит как скорректированный итог.

У вас есть переменная ColdFusion sysPromoCode, которая определяет коды и существует только в во время исполнения на сервере. Быстрый и грязный подход - создать PromoCodeService.cfc:

<cfcomponent>

    <cffunction name="init" access="public" output="false" returntype="any">
        <cfset variables.PromoCodeStruct = {
            "PC1" : 1,
            "PC5" : 5,
            "PC10" : 10,
            "PC15" : 15,
            "PC20" : 20
        } >
        <cfreturn this>
    </cffunction>

    <cffunction name="getDiscountCodes" access="public" output="" returntype="struct"
        hint="I return all available discount codes.">
        <cfreturn variables.PromoCodeStruct>
    </cffunction>

    <cffunction name="getDiscountByCode" access="public" output="false" returntype="numeric"
        hint="I return a valid discount or -1 for invalid codes.">
        <cfargument name="dicsount_code" type="string" required="true">
        <cfif structKeyExists( variables.PromoCodeStruct, arguments.dicsount_code )>
            <cfreturn variables.PromoCodeStruct[arguments.dicsount_code]>
        <cfelse>
            <cfreturn -1>
        </cfif>
    </cffunction>

</cfcomponent>

Ваш вызов Ajax будет нацелен на некоторый URL-адрес, например /api/check_promo_code.cfm:

<cfcontent type="application/json">
<cfif structKeyExists(form, "PromoCode")>
<cfset oPromoCodeService = new path.to.PromoCodeService()>
<cfoutput>#oPromoCodeService.getDiscountByCode(form.PromoCode)#</cfoutput>
<cfelse>
-1
</cfif>

Этот код проверяет, если код был отправлен через HTTP POST, а затем проверяет структуру на соответствие ключа и возвращает сумму скидки. Если совпадений нет, функция getDiscountByCode() возвращает -1. Если требуемые данные отсутствуют, запрос все равно возвращает -1.

Затем ваш Ajax вызов может применить сумму скидки в пользовательском интерфейсе или показать, что код недействителен (-1).

Затем вы можете заменить существующее определение <cfset REQUEST.PromoCodeStruct = sysPromoCode> следующим образом:

<cfset oPromoCodeService = new path.to.PromoCodeService()>
<cfset REQUEST.PromoCodeStruct = oPromoCodeService.getDiscountCodes()>

Таким образом, вы можете продолжать использовать REQUEST.PromoCodeStruct как есть после этого.

Это также делает даст вам возможность перенести коды скидок в базу данных, если это необходимо. Вы просто обновляете эти функции с помощью запросов, и вам хорошо go.

Последнее замечание:

он устойчив к взиманию платы за время, необходимое для исправления многих беспорядка под капотом

Вы либо платите, чтобы исправить беспорядок по мере необходимости , либо живете с более вероятными более высокими расходами, которые несет этот беспорядок *. 1042 *

...