Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extend a CFC using a relative path

Tags:

coldfusion

cfc

I want to extend a CFC in a different directory and I have a couple of options, but can't figure out how to do this:

A) Use a dynamic mapping (this will have to be dynamic based on the site, e.g. for the live site it would be cfc.myPackage.MyCFC but on a dev site it would be myCfcRoot.myPackage.MyCFC) - I've tried putting expressions into the extends bit but obviously CF doesn't like that, e.g. :

<cfcomponent name="MyComponent" extends="#config.cfcRoot#.BaseComponent">

or

<cfcomponent name="MyComponent" extends="#GetRealPath(../BaseComponent.cfc)#">

B) Provide a relative path (somehow) to the CFC to extend.

I fear that I can't do this, but I'm hoping that there is something I've missed.

like image 697
DEfusion Avatar asked Nov 13 '08 15:11

DEfusion


2 Answers

Now this is only tested in cf8 so other engine could differ.

if you want to use relative paths to extend applications you can but your have to start them with a "/.". For instance you can do this to extend an application.cfc from your web root into directory below you webroot:

<cfcomponent output="false" extends="/.application">
 <!--- whatever code you have --->
</cfcomponent>

now let's say I have the following paths in my application:

[webroot]/1/1a
[webroot]/2

let's say that the application.cfc in [webroot]/1/1a extends the application.cfc in [webroot]. now I want to place an application.cfc in [webroot]/2 and extend the application.cfc in [webroot]/1/1a. all i would have to do in my [webroot]/2/application.cfc is the following:

<cfcomponent output="false" extends="/./1/1a/application">
 <!--- whatever code you have --->
</cfcomponent>

hope this makes sense.

like image 80
rip747 Avatar answered Sep 22 '22 20:09

rip747


Daniel is basically correct, you need a mapping. However, there are 3 workarounds.

CFCs will pick the current path as a relative root mapping, so if your CFCs are all in the same directory, you can just say

<cfcomponent name="MyComponent" extends="Example">

Or if your components are in subdirectories from the current cfc, you can access it:

<cfcomponent name="MyComponent" extends="subdirectory.Example">  

Second, if you are running on ColdFusion 8, you can define a mapping in your application.cfc using the mappings struct like this:

<cfset this.mappings["/MyApp"] = expandPath(".") />

There are two good references for Application.cfc, first, Ray Camden's example Application.cfc which just gives a nice view of what goes where, then the CF8 Live Docs application settings page, which has a section on mappings along with some good comments.

Finally, you can use the built-in mapping of your web root, so if your application is in a subdirectory named "MyApp" off the web root, your root mapping will be "MyApp". Let's say you correctly put your components in:

wwwroot\MyApp\com\MyApp\example.cfc

The mapping to this cfc in this case will be:

MyApp.com.MyApp.Example

And using your example, you can extend like this:

<cfcomponent name="MyComponent" extends="MyApp.com.MyApp.Example">

Anything else, such as if your components are outside of the web root, or if you are not sure what the folder structure of your finished application will be, and you will need to set a mapping in the CF Administrator.

like image 33
Nathan Strutz Avatar answered Sep 22 '22 20:09

Nathan Strutz