Когда вы 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 *