2010-10-22 68 views
5

我已經看到了在父文件夾或CF管理的父文件夾中擴展cfcs的各種解決方案,但我還沒有看到一個可行的解決方案來擴展一個「共享」/兄弟無法訪問父文件夾的文件夾。CFC擴展兄弟文件夾

This solution需要訪問父文件夾? (不知道這些映射是什麼,但我無論如何無法訪問Application.cfc)

This solution要求能夠創建一個不適用於我的application.cfc(在myApp中創建一個不執行任何操作,因爲環境我在包括對myApp的索引頁,並建立了從那裏...客戶從來不直接調用它開火識別的Application.cfc的)

例如:

  • 的wwwroot /一些/路徑/myApp/Shared/Base.cfc
  • wwwroot/some/path/myApp/Function/Function .cfc

我期望能夠通過超級和擴展從Function.cfc調用Base.cfc(其中包含應用程序中使用的常用方法)的功能。

我可以訪問myApp中的所有文件,但不能訪問「wwwroot」,「some」或「path」。

爲了在Function.cfc中擴展Base.cfc,我必須擴展「some.path.myApp.Shared.Base」的完整路徑如果有人重命名myApp文件夾,這將導致問題,因爲我必須手動編輯每個Function.cfc,擴展Base.cfc

我在做什麼創建一個特定於應用程序的「障礙」,所以如果應用程序文件夾名稱更改它不會造成大規模的破壞,需要我編輯所有的CFC使用Base.cfc功能的文件。

因爲我不能使用相對路徑到基地(「..Shared.Base」)我想知道是否有辦法在myApp文件夾中創建一個CFC,我可以擴展並減輕重命名頭痛如果它發生或者給它一個通用的名字,比如「myApp」並且從那裏延伸。 (myApp.Shared.Base)

我無法訪問Application.cfm,也無法訪問Coldfusion管理。

回答

2

就我個人而言,我會走簡單的方法:將基礎封裝到函數中。

看起來你想使用一組核心組件來實現一些通用功能。如果這是真的 - 封裝更加適用。

路徑的對象可建動態,例如(步驟一步過程更容易閱讀):

<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

我能看到的最簡單的方法是在擴展函數目錄中創建一個符號鏈接點或基點目錄。

不幸的是,它不是一個純粹的CF解決方案,如果需要移動代碼,它也不是便攜式的。希望有人會有更好的答案,但如果沒有提供,這可能是一個回退點。

+0

我沒有控制服務器,所以這不會做,但這是一個很好的猜測。我看到的唯一問題是,它實際上仍然會導致同樣的問題。如果您改變路徑,Coldfusion解析器會在嘗試擴展不在那裏的路徑時死亡。 – Andir 2010-10-23 13:25:48

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允許您更新配置變量並在實時環境中根據需要更新cfc。

1

如果Base.cfc沒有擴展另一個cfc,那麼您可以將Base.cfc文件包含到函數文件夾中的另一個cfc文件中。

例如創建在功能文件夾中的文件的CFC與內容:

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

然後延伸,而不是在共享文件夾中的CFC的新文件。

0

爲什麼要把共享代碼放在一個單獨的文件夾中?如果你只是把它放在與你的「functions」cfcs相同的文件夾中,那麼它們都可以使用相對路徑來擴展它。

所以不是:

  • 的wwwroot /一些/路徑/對myApp /共享/ Base.cfc
  • 的wwwroot /一些/路徑/對myApp /功能/ Function.cfc

使用:

  • wwwroot的/一些/路徑/對myApp /功能/ Base.cfc
  • wwwroot的/一些/ p ATH /對myApp /功能/ Function.cfc

和:

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

但是,如果您有/需要多個 「功能」 級文件夾,那麼你可以做類似的事情。將一個Proxy.cfc每個「功能」級文件夾內,使用此代碼:

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

然後在「功能」級文件夾,每個CFC將擴大其本地Proxy.cfcextends="proxy")。這給你1個代理每個文件夾,這仍然不是理想的,但比更新每個cfc更麻煩。