2010-10-22 73 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更麻烦。