Custom CFInclude для настройки файла - PullRequest
0 голосов
/ 18 декабря 2018

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

<cfif fileExists("/custom/someFile.cfm")>
    <cfinclude template="/custom/someFile.cfm" />
<cfelse>
    <cfinclude template="someFile.cfm" />
</cfif>

Я хотел создать собственный тег CFчтобы представить это как простой <cf_custominclude template="someFile.cfm" />, я столкнулся с тем фактом, что пользовательские теги фактически являются черными ящиками, поэтому они не извлекают локальные переменные, которые существуют до начала тега, и я не могу ссылаться ни на одну переменнуюсозданный в результате тега при импорте файла.

EG

<!--- 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 Ответ

0 голосов
/ 18 декабря 2018

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

Это должно делать то, что вы хотите.Важно отметить, что вам нужно убедиться, что ваш пользовательский тег закрывается или не будет работать!Просто используйте упрощенное закрытие, как у вас это было выше:

<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! --->
...