coldfusion - एक उपनिर्देशिका में application.cfc विस्तारित करना




(2)

मेरे पास निम्न दो फाइलें हैं और पहले का विस्तार करने के लिए दूसरा चाहेंगे:

  1. wwwroot \ साइट \ application.cfc
  2. wwwroot \ साइट \ dir \ application.cfc

हालांकि, जब मैं दूसरी फाइल के लिए घटक घोषित करने जा रहा हूं, मुझे पता नहीं है कि क्या विस्तार की विशेषता में डाल देना है। मेरी समस्या यह है कि कई देव साइटें (साझा एसवीएन रिपॉजिटरी के साथ) कोल्डफ्यूजन के एक ही उदाहरण से चल रही हैं , इसलिए मैं सीएफ़ व्यवस्थापक में मैपिंग नहीं बना सकता जैसे:

<cfcomponent extends="site.application">

हालांकि, कोल्डफ्यूजन पसंद नहीं करता है:

<cfcomponent extends="..application">

या किसी भी गतिशील इनपुट की तरह:

<cfcomponent extends="#expandpath('..').#application">

एक रनटाइम मैपिंग ( जैसे यहां ) बनाना संभव नहीं लगता है इसे आधार application.cfc में बनाना बेकार है क्योंकि उस कोड का अभी तक निष्पादित नहीं किया गया है जब सीएफसी को विरासत में मिली है; और मैं इनहेरिटिंग घटक परिभाषित होने से पहले मैपिंग नहीं बना सकता, क्योंकि इसमें अभी तक कोई एप्लिकेशन संलग्न नहीं किया गया है।

क्या कोई तरीका है कि मैं अपने विस्तार को पूरा करने के लिए मूल निर्देशिका को संदर्भित कर सकता हूं?

स्पष्ट करने के लिए संपादित करें: ApplicationProxy समाधान ऊपर से बोल्ड टेक्स्ट के कारण काम नहीं करता है अभी, एक वैकल्पिक हल के रूप में, हम केवल \ dir \ application.cfc को एसवीएन में नहीं चेक कर रहे हैं ताकि प्रत्येक डेवलपर एक संस्करण रखे जो कि उसका अपना रूट ऐप। Cfc बढ़ाता है। जाहिर है, यह आदर्श नहीं है।


निम्नलिखित कोड मेरे लिए काम कर रहा है एक बात मैंने देखा है, हालांकि यह है कि application.cfc कैश्ड लग रहा है, इसलिए मूल अनुप्रयोग cfc में परिवर्तन को प्रतिबिंबित नहीं किया जा सकता है। मैं बच्चे आवेदन cfc में एक मामूली परिवर्तन कर इस के आसपास मिल गया।

<cfcomponent output="false">
        <cfset variables.higherPath = ReReplace(GetMetaData(this).name,"\.[^\.]+\.[^\.]+$","") />
        <cfset variables.extendApp = CreateObject("component", "#variables.higherPath#.Application") />

        <cfloop item="variables.key" collection="#variables.extendApp#">
            <cfif IsCustomFunction(variables.extendApp[variables.key])>
                <cfset super[variables.key] = variables.extendApp[variables.key]>
            <cfelse>
                <cfset this[variables.key] = variables.extendApp[variables.key] >
            </cfif>
        </cfloop>
        <cffunction name="onApplicationStart" output="false">
            <cfset super.onApplicationStart() />
        </cffunction>

मुझे पता है यह एक पुराना विषय है, लेकिन मुझे सीएफ प्रशासक मैपिंग का उपयोग किए बिना ऐसा करने का एक तरीका मिला (जो मेरे परीक्षण में काम करता है)

आप एक विस्तारित सापेक्ष पथ का उपयोग करके अपने बच्चे Application.cfc में एक प्रति-अनुप्रयोग मैपिंग जोड़कर ऐसा कर सकते हैं:

<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>

हाँ, यह थोड़ा हैक लगता है, लेकिन यह काम करने लगता है