173 instance_data.vault moved up, filter became array and supports multiple field entries
This commit is contained in:
@@ -2,12 +2,14 @@
|
||||
<!--- version 3---><!---16:42 16.11.2020--->
|
||||
<!--- version 4---><!---2025-09-06 19:15:50 больше не нужно объявлять параметр как list, достаточно оператора IN--->
|
||||
<!--- version 5---><!---2025-11-20 ILIKE - потеря совместимости со стандартным SQL (можно вернуться к совместимости через lower, но будут проблемы с индексами)--->
|
||||
<!--- version 6---><!---2025-11-20 ***** фильтр стал массивом вместо структуры, чтобы поддержать множественные вхождения поля --->
|
||||
|
||||
<!--- build query filter string --->
|
||||
|
||||
<cfparam name="ATTRIBUTES.filter" type="struct"/>
|
||||
<cfloop collection=#ATTRIBUTES.filter# item="item">
|
||||
<cfparam name="ATTRIBUTES.filter" type="array"/>
|
||||
<cfloop array=#ATTRIBUTES.filter# index="fltr"><!--- неинтуитивный синтаксис, в индексе не индекс массива, а значение --->
|
||||
<cfsilent>
|
||||
<cfset fltr=structFind(ATTRIBUTES.filter,item)>
|
||||
<!--- <cfset fltr=structFind(ATTRIBUTES.filter,item)> --->
|
||||
<cfparam name="fltr.ftype"/>
|
||||
<cfparam name="fltr.field"/>
|
||||
<cfparam name="fltr.compare" default="EQ"/>
|
||||
|
||||
+36
-34
@@ -5,7 +5,7 @@
|
||||
<!--- v0.02 2024-10-15 --->
|
||||
<!--- v0.03 2024-11-27 --->
|
||||
<!--- v0.04 2025-11-20 columns--->
|
||||
|
||||
<!--- v0.05 2025-11-20 multiple field entries in filter, filter became array instead of structure--->
|
||||
|
||||
<cffunction name="empty2null"
|
||||
access="public"
|
||||
@@ -77,51 +77,53 @@
|
||||
|
||||
|
||||
<cffunction name="parseFilterParams"
|
||||
returntype="struct"
|
||||
returntype="array"
|
||||
output="true"
|
||||
hint="parse and collect filter params, for operators see filter_build">
|
||||
<!---e.g. duration=NEQ:2--->
|
||||
<!---*** add test for multiple values--->
|
||||
<cfargument name="params" type="struct" required="true" /><!--- имена полей и колонок в snake_case --->
|
||||
|
||||
<cfset var local={}/><!--- *** --->
|
||||
<cfset var out=structNew()/>
|
||||
<cfset var local = {}/><!--- *** --->
|
||||
<cfset var out = []/>
|
||||
|
||||
<cfloop collection=#params# index="local.item">
|
||||
|
||||
<cfset var urlParamName=snake2camel(lCase(local.item))/>
|
||||
<cfif structKeyExists(URL,urlParamName)>
|
||||
<cfset var rawValue=URL[urlParamName]/>
|
||||
<cfset var operator="EQ"/>
|
||||
<cfset var value=#rawValue#/>
|
||||
<cfif listLen(rawValue,":") GT 1>
|
||||
<cfset var operator=listGetAt(rawValue,1,":")/>
|
||||
<cfset var value=listGetAt(rawValue,2,":")/>
|
||||
</cfif>
|
||||
<cfif !isValid(ARGUMENTS.params[local.item].type,value)>
|
||||
<cfthrow type="invalidParamValue" message="Filter parameter #urlParamName# value is not a valid #ARGUMENTS.params[local.item].type#"/><!---не выводим значение, чтобы исключить XSS--->
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "column") AND len(ARGUMENTS.params[local.item].column)>
|
||||
<cfset var column="#ARGUMENTS.params[local.item].column#"/>
|
||||
<cfelse>
|
||||
<cfset var column=local.item/>
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "prefix") AND len(ARGUMENTS.params[local.item].prefix)>
|
||||
<cfset var fieldName="#ARGUMENTS.params[local.item].prefix#.#column#"/>
|
||||
<cfelse>
|
||||
<cfset var fieldName=#column#/>
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "list") AND ARGUMENTS.params[local.item].list GT 0>
|
||||
<cfset var list=ARGUMENTS.params[local.item].list />
|
||||
<cfelse>
|
||||
<cfset var list=false />
|
||||
</cfif>
|
||||
|
||||
<cfset var rec={field=#fieldName#, val=#value#, ftype=#ARGUMENTS.params[local.item].type#, compare=#operator#, list=#list#}/>
|
||||
<cfset structInsert(out, local.item, rec, true)/>
|
||||
<cfloop list=#URL[urlParamName]# item="local.rawValue"><!--- when parameter occures in URL more than once, its values compose a comma delimited list --->
|
||||
<cfset var operator="EQ"/>
|
||||
<cfset var value=#local.rawValue#/>
|
||||
<cfif listLen(local.rawValue,":") GT 1>
|
||||
<cfset var operator=listGetAt(local.rawValue,1,":")/>
|
||||
<cfset var value=listGetAt(local.rawValue,2,":")/>
|
||||
</cfif>
|
||||
<cfif !isValid(ARGUMENTS.params[local.item].type,value)>
|
||||
<cfthrow type="invalidParamValue" message="Filter parameter #urlParamName# value is not a valid #ARGUMENTS.params[local.item].type#"/><!---не выводим значение, чтобы исключить XSS--->
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "expression") AND len(ARGUMENTS.params[local.item].expression)>
|
||||
<cfset var expr="#ARGUMENTS.params[local.item].expression#"/>
|
||||
<cfelse>
|
||||
<cfset var expr=local.item/>
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "prefix") AND len(ARGUMENTS.params[local.item].prefix)>
|
||||
<cfset var fieldName="#ARGUMENTS.params[local.item].prefix#.#expr#"/>
|
||||
<cfelse>
|
||||
<cfset var fieldName=#expr#/>
|
||||
</cfif>
|
||||
|
||||
<cfif structKeyExists(ARGUMENTS.params[local.item], "list") AND ARGUMENTS.params[local.item].list GT 0>
|
||||
<cfset var list=ARGUMENTS.params[local.item].list />
|
||||
<cfelse>
|
||||
<cfset var list=false />
|
||||
</cfif>
|
||||
|
||||
<cfset var rec={field=#fieldName#, val=#value#, ftype=#ARGUMENTS.params[local.item].type#, compare=#operator#, list=#list#}/>
|
||||
<cfset arrayAppend(out, rec)/>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
|
||||
</cfloop>
|
||||
|
||||
Reference in New Issue
Block a user