3

多くの基本ページを顧客の個々のニーズに合わせてカスタマイズできるようにするため、コード ベースには次の例がかなり含まれています。

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

これを回避する手段はありますか、それとも他の言語機能を利用して目標を達成する必要がありますか?

4

1 に答える 1

5

まあ、私はこれを行うことにまったく疑問を抱いていますが、私たちは皆、対処しなければならないときにコードを渡され、人々にリファクタリングをさせるのに苦労していることを知っています.

これはあなたが望むことをするはずです。注意すべき重要な点の 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! --->
于 2018-12-18T20:40:37.163 に答える