Custom CFInclude для настройки файла
В нашей кодовой базе довольно много следующего примера, поскольку мы позволяем настраивать многие наши базовые страницы в соответствии с индивидуальными потребностями наших клиентов.
<cfif fileExists("/custom/someFile.cfm")>
<cfinclude template="/custom/someFile.cfm" />
<cfelse>
<cfinclude template="someFile.cfm" />
</cfif>
Я хотел создать собственный тег CF, чтобы представить это как простой <cf_custominclude template="someFile.cfm" />
Однако я столкнулся с тем фактом, что пользовательские теги фактически являются черными ящиками, поэтому они не извлекают локальные переменные, которые существуют до начала тега, и я не могу ссылаться на любую переменную, которая была создана в результате тега. от импорта файла.
НАПРИМЕР
<!--- This is able to use someVar --->
<!--- Pulls in some variable named "steve" --->
<cfinclude template="someFile.cfm" />
<cfdump var="#steve#" /> <!--- This is valid, however... --->
<!--- someVar is undefined for this --->
<!--- Pulls in steve2 --->
<cf_custominclude template="someFile.cfm" />
<cfdump var="#steve2#" /> <!--- This isn't valid as steve2 is undefined. --->
Есть ли средства для этого или я должен использовать какую-то другую языковую функцию для достижения своей цели?
1 ответ
Ну, я вообще сомневаюсь в этом, но я знаю, что мы все время получаем код, с которым нам приходится иметь дело, и борьбу за то, чтобы заставить людей проводить рефакторинг.
Это должно делать то, что вы хотите. Важно отметить, что вам нужно убедиться, что ваш пользовательский тег закрывается или не будет работать! Просто используйте упрощенное закрытие, как у вас было выше:
<cf_custominclude template="someFile.cfm" />
Это должно сделать трюк, называется это у вас было: custominclude.cfm
<!--- executes at start of tag --->
<cfif thisTag.executionMode eq 'Start'>
<!--- store a list of keys we don't want to copy, prior to including template --->
<cfset thisTag.currentKeys = structKeyList(variables)>
<!--- control var to see if we even should bother copying scopes --->
<cfset thisTag.includedTemplate = false>
<!--- standard include here --->
<cfif fileExists(expandPath(attributes.template))>
<cfinclude template="#attributes.template#">
<!--- set control var / flag to copy scopes at close of tag --->
<cfset thisTag.includedTemplate = true>
</cfif>
</cfif>
<!--- executes at closing of tag --->
<cfif thisTag.executionMode eq 'End'>
<!--- if control var / flag set to copy scopes --->
<cfif thisTag.includedTemplate>
<!--- only copy vars created in the included page --->
<cfloop list="#structKeyList(variables)#" index="var">
<cfif not listFindNoCase(thisTag.currentKeys, var)>
<!--- copy from include into caller scope --->
<cfset caller[var] = variables[var]>
</cfif>
</cfloop>
</cfif>
</cfif>
Я проверил его, и он отлично работает, должен работать нормально, будучи вложенным. Удачи!
<!--- Pulls in steve2 var from include --->
<cf_custominclude template="someFile.cfm" />
<cfdump var="#steve2#" /> <!--- works! --->