2010-10-22 19 views
5

बढ़ाता है मैंने पैरेंट फाइलों या सीएफ प्रशासन तक पहुंच के साथ मूल फ़ोल्डरों में सीएफसी को विस्तारित करने के लिए सभी प्रकार के समाधान देखे हैं, लेकिन मैंने "साझा"/भाई में सीएफसी बढ़ाने के लिए एक व्यावहारिक समाधान नहीं देखा है पैरेंट फ़ोल्डर तक पहुंच के बिना फ़ोल्डर।सीएफसी भाई फ़ोल्डर

This solution को मूल फ़ोल्डरों तक पहुंच की आवश्यकता है? (यह सुनिश्चित नहीं है कि ये मैपिंग क्या हैं, लेकिन मुझे एप्लीकेशन.cfc तक कोई पहुंच नहीं है)

This solution को एक application.cfc बनाने में सक्षम होने की आवश्यकता है जो मेरे लिए काम नहीं करता है (मेरे ऐप में एक बनाना पर्यावरण के कारण कुछ भी नहीं करता है मैं MyApp में सूचकांक पेज शामिल हैं और वहाँ से ... ग्राहक कभी नहीं इसे सीधे Application.cfc की मान्यता)

आग उदाहरण के लिए कहता है बनाता में:

  • wwwroot/कुछ/पथ /myApp/Shared/Base.cfc
  • wwwroot/कुछ/पथ/myApp/फ़ंक्शन/फ़ंक्शन .cfc

मैं सुपर और एक्सटेंशन के माध्यम से Function.cfc से Base.cfc (जिसमें अनुप्रयोग में उपयोग की जाने वाली सामान्य विधियों में शामिल है) में कार्यक्षमता कॉल करने में सक्षम होना चाहता हूं।

मेरे पास मेरे ऐप के भीतर सभी फाइलों तक पहुंच है, लेकिन "wwwroot", "कुछ", या "पथ" नहीं है।

Fun.c.cc के भीतर Base.cfc को विस्तारित करने के लिए मुझे "some.path.myApp.Shared.Base" का पूरा पथ विस्तार करना होगा, अगर किसी ने मेरा ऐप फ़ोल्डर बदल दिया है तो मुझे समस्याएं पैदा होंगी क्योंकि मुझे हाथ करना होगा हर Function.cfc कि फैली संपादित कि Base.cfc

क्या मैं इसलिए यदि अनुप्रयोग फ़ोल्डर का नाम बदल जाता है यह बड़े पैमाने पर तबाही कि मैं संपादित की आवश्यकता है सब सीएफसी का कारण नहीं बनेगा यह एक आवेदन विशिष्ट "बाधा" बना सकता हूँ करने के लिए देख रहा हूँ फ़ाइलें जो बेस.cfc से कार्यक्षमता का उपयोग करती हैं।

चूंकि मैं बेस ("..Shared.Base") के सापेक्ष पथ का उपयोग नहीं कर सकता हूं, इसलिए मुझे आश्चर्य है कि मेरे ऐप फ़ोल्डर में एक सीएफसी बनाने का कोई तरीका है जिसे मैं विस्तारित कर सकता हूं और नामकरण सिरदर्द को कम कर सकता हूं अगर ऐसा होता है या इसे "myApp" जैसे सामान्य नाम देने का तरीका होता है और वहां से विस्तार होता है। (myApp.Shared.Base)

मेरे पास Application.cfm तक पहुंच नहीं है, न ही कोल्डफ्यूजन प्रशासन।

उत्तर

2

व्यक्तिगत रूप से मैं सरल तरीके से जाऊंगा: फ़ंक्शन में बेस को समाहित करता हूं।

ऐसा लगता है कि आप कुछ सामान्य कार्यक्षमताओं के लिए कोर घटकों के सेट का उपयोग करना चाहते हैं। यदि यह सच है - incapsulation और भी लागू।

वस्तुओं के लिए पथ (आसानी से पढ़ने के लिए कदम दर कदम प्रक्रिया) गतिशील रूप से, उदाहरण के लिए बनाया जा सकता है:

<cfscript> 

    path1 = GetDirectoryFromPath(cgi.SCRIPT_NAME); 
    path2 = ListToArray(path1, "/"); 
    path3 = path2; 
    path3[ArrayLen(path3)] = "shared"; 
    path4 = ArrayToList(path3, "."); 
    path5 = ArrayToList(path2, "."); 

    myBase = CreateObject("component", "#path4#.Base"); 

    myFunction = CreateObject("component", "#path5#.Function").init(myBase); 

</cfscript> 

Function में समारोह init बनाएँ:

<cffunction name="init"> 
    <cfargument name="base"> 
    <cfset variables.Base = arguments.base /> 
    <cfreturn this /> 
</cffunction> 
बेशक

, आपके पास विस्तार करने के लिए मजबूत कारण हो सकते हैं, लेकिन कम से कम यह दृष्टिकोण मूल निर्देशिका नामकरण के प्रति संवेदनशील नहीं है।

0

यह करने का सबसे आसान तरीका यह है कि एक्सटेंशन फ़ंक्शन निर्देशिका में मूल निर्देशिका में सिम्लिंक या जंक्शन बिंदु बनाना है।

दुर्भाग्य से, यह एक शुद्ध सीएफ समाधान नहीं है, न ही पोर्टेबल यदि आपको अपना कोड स्थानांतरित करने की आवश्यकता है। उम्मीद है कि किसी के पास बेहतर जवाब होगा, लेकिन अगर कोई प्रस्तुत नहीं किया जाता है तो यह एक फॉलबैक पॉइंट हो सकता है।

+0

मेरे पास सर्वर पर कोई नियंत्रण नहीं है, इसलिए यह नहीं होगा, लेकिन यह एक अच्छा अनुमान है। इसके साथ एकमात्र मुद्दा यह है कि यह वास्तव में एक ही समस्या का कारण बन जाएगा। यदि आप किसी भी तरह से पथ बदलते हैं, तो उस पथ को बढ़ाने की कोशिश करते समय कोल्डफ्यूजन पार्सर मर जाएगा। – Andir

0

एप्लिकेशन शुरू पर कोड जेनरेट/रीसेट ...

उदाहरण के लिए घटक टैग इतना है कि सीधे भाग नहीं किया जाना चाहिए एक फ़ाइल में की तरह हो सकता है ...

<cfabort> 
<cfcomponent extends="{sharedpath}.Base"> 
... 
एक में

तो में समारोह या application.cfc से कहा जाता है कुछ इस तरह करते हैं ...

<cfdirectory name="codetemplates" action="list" directory="wwwroot/some/path/myApp/codetemplates" /> 
<cfloop query="codetemplates"> 
    <cffile name="temp" action="read" path="#tempfilepath##filename#" /> 
    <cfset newfilecontent = replace(temp.filecontent, '{sharedpath}', configvarwithrightpath) /> 
    <cfset filecontent = replace(newfilecontent , '<cfabort>', '') /> 
    <cffile name="temp" action="write" path="#livefilepath##filename#" /> 
</cfloop> 

अन्य दृष्टिकोण एक निर्माण प्रक्रिया स्थानीय स्तर पर आप आवश्यक कोड लेकिन wo ऊपर मेरी उदाहरण बनाने के लिए चलने वाले है uld आपको एक कॉन्फ़िगरेशन वैरिएबल अपडेट करने और लाइव वातावरण में आवश्यक सीएफसी अपडेट करने की अनुमति देता है।

1

यदि Base.cfc कोई अन्य सीएफसी नहीं बढ़ाता है तो आप बेसकैफ़ फ़ाइल को अपने फ़ंक्शन फ़ोल्डर में किसी अन्य सीएफसी फ़ाइल में शामिल करने में सक्षम हो सकते हैं।

उदाहरण के लिए सामग्री के साथ समारोह फ़ोल्डर में एक सीएफसी फ़ाइल बनाने:

<cfinclude template="../shared/base.cfc" /> 

तब साझा फ़ोल्डर में सीएफसी के बजाय नई फ़ाइल का विस्तार।

0

साझा कोड को एक अलग फ़ोल्डर में क्यों डालने की परेशानी है? यदि आप इसे अपने "फ़ंक्शंस" सीएफसीएस के समान फ़ोल्डर में डालते हैं तो वे सभी इसे सापेक्ष पथ का उपयोग करके बढ़ा सकते हैं।

तो बजाय:

  • wwwroot/कुछ/पथ/MyApp/साझा/Base.cfc
  • wwwroot/कुछ/पथ/MyApp/कार्य/Function.cfc

उपयोग :

  • wwwroot/कुछ/पथ/MyApp/कार्य/Base.cfc
  • wwwroot/कुछ/p एथलीट/MyApp/कार्य/Function.cfc

और:

<cfcomponent extends="Base"></cfcomponent> 

हालांकि, अगर आपके पास/एकाधिक "समारोह" स्तर फ़ोल्डरों की जरूरत है, तो आप कुछ इसी तरह कर सकते हैं। प्रत्येक "समारोह" स्तर के फ़ोल्डर के अंदर एक Proxy.cfc रखो, इस कोड के साथ:

<cfcomponent extends="some.path.myApp.shared.Base"></cfcomponent> 

और फिर "समारोह" स्तर के फ़ोल्डर में प्रत्येक सीएफसी का विस्तार होगा अपने स्थानीय Proxy.cfc (extends="proxy")।यह आपको प्रति प्रॉक्सी 1 प्रॉक्सी देता है, जो अभी भी आदर्श नहीं है, लेकिन प्रत्येक सीएफसी को अपडेट करने से परेशानी से कम है।

संबंधित मुद्दे