117 nested refs intermediate
This commit is contained in:
@@ -42,6 +42,8 @@
|
||||
<m:field formatter=#request.castToBool#>sop.is_sensitive</m:field>
|
||||
<m:field>sop.man</m:field>
|
||||
<m:field>sop.func</m:field>
|
||||
<m:field>sop.nested_ref</m:field>
|
||||
<m:field>sop.config</m:field>
|
||||
</m:field_set>
|
||||
from instance_operation_cfs_param iop
|
||||
join svc_operation_cfs_param sop on (iop.svc_operation_cfs_param_id=sop.svc_operation_cfs_param_id)
|
||||
@@ -67,7 +69,10 @@
|
||||
<!--- <cfdump var=#local.qCfsParam#/><cfabort/> --->
|
||||
<cfif len(trim(local.qCfsParam.value_list)) AND listLen(local.qCfsParam.value_list) EQ 1>
|
||||
<cfset local.qCfsParam.default_value=local.qCfsParam.value_list/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
<cfelseif len(local.qCfsParam.nested_ref)>
|
||||
<cfset var fNestedRef = generateClosure(local.qCfsParam.nested_ref, local.qCfsParam.config)/>
|
||||
<cfset local.qCfsParam.nested_ref_data = fNestedRef() />
|
||||
</cfif>
|
||||
|
||||
<cfif local.qCfsParam.data_type EQ "map">
|
||||
@@ -294,5 +299,72 @@
|
||||
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
|
||||
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
<!--- для вложенных справочников --->
|
||||
<!--- дублировано: deck-tool/instance_operation.cfm --->
|
||||
|
||||
<cffunction name="getSelectedResourceRealm" returnType="string">
|
||||
|
||||
<cfset var local={}/>
|
||||
<cfquery name="local.qSelectedResourceRealm">
|
||||
select iop.param_value
|
||||
from instance_operation_cfs_param iop
|
||||
join svc_operation_cfs_param sop on (iop.svc_operation_cfs_param_id=sop.svc_operation_cfs_param_id)
|
||||
where iop.instance_operation_uid=<cfqueryparam cfsqltype="CF_SQL_OTHER" value=#d.instance_operation_uid# null=#!isValid("guid", d.instance_operation_uid)#/>
|
||||
AND sop.svc_operation_cfs_param='resourceRealm'
|
||||
order by 1
|
||||
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
|
||||
<cfreturn local.qSelectedResourceRealm.param_value/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="generateClosure" returntype="function">
|
||||
<cfargument name="functionName" type="string" required="true"/>
|
||||
<cfargument name="config" type="string" required="true"/>
|
||||
<!--- остальные атрибуты необязательные, в argumentCollection --->
|
||||
|
||||
<cfswitch expression=#arguments.functionName#>
|
||||
<cfcase value="">
|
||||
<cfreturn function(){}/>
|
||||
</cfcase>
|
||||
<cfcase value="getRefFromRRealmConfig">
|
||||
<cfreturn function(){return getRefFromRRealmConfig(getSelectedResourceRealm(),config)}/>
|
||||
<!--- тут нам внезапно нужен контекст ресурсной платформы. При первичной отрисовке он может быть неизвестен (кроме специальных случаев, когда есть дефолтная платформа, или она вообще одна --->
|
||||
<!--- теперь даже не знаю, хорошая ли практика - explicitly scope variables: с closures, похоже, так не принято --->
|
||||
</cfcase>
|
||||
<cfcase value="getSampleConfig"><!--- for debug --->
|
||||
<cfreturn function(){return deserializeJson('{"providerVdc": [ { "hystax-pvdc": { "storageVdcProfile": [ ] } }, { "v1cl1-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL1-VSAN-SHARED-01", "SEGROUP-V1CL1-VSAN-SHARED-02" ], "storageVdcProfile": [ "v1-backup-itprotect" ] } }, { "v1cl2-pvdc": { "albSegroup": [ "SEGROUP-V1CL2-SHARED-01", "SEGROUP-V1CL2-SHARED-02" ], "storageVdcProfile": [ "V1-SATA", "V1CL1-F1R1-SSD", "V1CL1-F2R6-SSD", "V1CL1-SAS" ] } }, { "v1cl3-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL3-VSAN-SHARED-01", "SEGROUP-V1CL3-VSAN-SHARED-02" ], "storageVdcProfile": [ "V1-SATA", "v1-sata-cl3", "v1-sata-migr", "V1CL1-SAS", "V1CL3-F1R5-SSD", "V1CL3-F1R6-SSD_new", "V1CL3-F2R1-SSD", "V1CL3-F2R6-SSD" ] } }, { "v1cl4-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL4-VSAN-SHARED-01" ], "storageVdcProfile": [ "V1-SATA", "v1-sata-migr", "V1CL3-F1R6-SSD_new", "V1CL4-F1R1-SSD", "V1CL4-F1R5-SSD", "V1CL4-F2R1-SSD" ] } }, { "v2cl2-1c-pvdc": { "storageVdcProfile": [ "V1CL1-F2R1-SSD", "V1CL1-F2R6-SSD" ] } } ]}')} />
|
||||
</cfcase>
|
||||
<cfdefaultcase>
|
||||
<cfreturn "function not found"/>
|
||||
</cfdefaultcase>
|
||||
</cfswitch>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getRefFromRRealmConfig" returntype="any">
|
||||
<cfargument name="resourceRealm" type="string" required="true"/>
|
||||
<cfargument name="config" type="string" required="true"/>
|
||||
|
||||
<cfquery name="qResourceRealmConfig">
|
||||
select properties::text
|
||||
from resource_realm
|
||||
where resource_realm='ngcloud.ru'
|
||||
<!--- <cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.resourceRealm#/> --->
|
||||
</cfquery>
|
||||
|
||||
<!--- <cfset var local={}/> ---> <!--- паранойя... и есть шансы, что я неправильно понимаю эту химию скоупов--->
|
||||
<cfset var props = deserializeJson(qResourceRealmConfig.properties)/>
|
||||
<cfset var cfg = deserializeJson(arguments.config)/> <!--- удобнее было бы передавать сразу структуру впр --->
|
||||
<cfset cfg={"path":"vcd.providerVdc"}/><!--- *** временный пример для отладки --->
|
||||
<!--- засада на ровном месте: у нас в конфиге оказался массив вместо структуры --->
|
||||
<!--- вернуть нам нужно не просто содержимое по пути, а вместе с контейнером --->
|
||||
<cfset var path=cfg.path/><!--- *** обработать исключение --->
|
||||
<cfset var containerName = listLast(path,".")/>
|
||||
<cfset var result = structNew()/>
|
||||
<cfset structInsert(result, containerName, structGet("props.#path#"))/>
|
||||
<cfreturn result/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
|
||||
</cfcomponent>
|
||||
Reference in New Issue
Block a user