Я хочу расширить CFC в другом каталоге, и у меня есть несколько вариантов, но я не могу понять, как это сделать:
A) Используйте динамическое сопоставление (оно должно быть динамическим в зависимости от сайта, например, для действующего сайта это будет cfc.myPackage.MyCFC, но на сайте разработчиков это будет myCfcRoot.myPackage.MyCFC) - Я пробовал помещать выражения в бит расширения, но, очевидно, CF это не нравится, например :
<cfcomponent name = "MyComponent" extends = "#config.cfcRoot#.BaseComponent">
или же
<cfcomponent name = "MyComponent" extends = "#GetRealPath(../BaseComponent.cfc)#">
Б) Обеспечьте относительный путь (каким-то образом) к CFC для расширения.
Боюсь, что не смогу этого сделать, но надеюсь, что я что-то упустил.





Если CFC не находится в том же каталоге, что и вызывающий скрипт, CFC должен располагаться и ссылаться на него с пути относительно «Отображения».
Я обнаружил, что иногда вам нужно убедиться, что "/" сопоставлен с корнем вашего документа вашего веб-сервера и становится основой для всех относительных путей. Или вы можете настроить отображение для каталога CFC, который содержит все ваши общие CFC.
Этот экран находится в администраторе ColdFusion в разделе «Настройки сервера» -> «Сопоставления».
Даниэль в основном прав, вам нужна карта. Однако есть 3 обходных пути.
CFC выберут текущий путь в качестве относительного корневого сопоставления, поэтому, если все ваши CFC находятся в одном каталоге, вы можете просто сказать
<cfcomponent name = "MyComponent" extends = "Example">
Или, если ваши компоненты находятся в подкаталогах текущего cfc, вы можете получить к нему доступ:
<cfcomponent name = "MyComponent" extends = "subdirectory.Example">
Во-вторых, если вы работаете в ColdFusion 8, вы можете определить сопоставление в своем application.cfc, используя такую структуру сопоставлений:
<cfset this.mappings["/MyApp"] = expandPath(".") />
Есть две хорошие ссылки на Application.cfc, во-первых, Пример Рэя Камдена Application.cfc, который просто дает хорошее представление о том, что и где происходит, затем страница Настройки приложения CF8 Live Docs, на которой есть раздел сопоставлений вместе с некоторыми хорошими комментариями.
Наконец, вы можете использовать встроенное сопоставление вашего корневого веб-сайта, поэтому, если ваше приложение находится в подкаталоге с именем «MyApp» вне корневого веб-каталога, вашим корневым сопоставлением будет «MyApp». Допустим, вы правильно разместили свои компоненты:
wwwroot\MyApp\com\MyApp\example.cfc
Отображение на этот cfc в этом случае будет:
MyApp.com.MyApp.Example
И, используя ваш пример, вы можете расширить его так:
<cfcomponent name = "MyComponent" extends = "MyApp.com.MyApp.Example">
Что-нибудь еще, например, если ваши компоненты находятся за пределами корневого веб-сайта, или если вы не уверены, какой будет структура папок вашего готового приложения, и вам нужно будет установить сопоставление в CF Administrator.
This.mappings внутри Application.cfc только для CF 8, есть ли у вас ссылки на документы.
Я добавил несколько справочных ссылок во второй раздел под примером.
Подход к картированию приложений потрясающий. Он устраняет одно из последних серьезных препятствий для использования типизированных компонентов.
Стоит знать, что сопоставления для конкретных приложений не совпадают со стандартными сопоставлениями ColdFusion, которые вы можете создать в CF Administrator: blog.daemon.com.au/go/blog-post/…
Я также сделал бит this.mappings в CFMX7. В Railo я также должен указать, что использование отображения косой черты в корень, по крайней мере (т.е. this.mappings ["/"]), не нужно, поскольку Рейло каким-то волшебным образом понимает, что отображение косой черты должно ссылаться на папку с Application.cfc в нем.
Сейчас это проверено только в cf8, поэтому другие двигатели могут отличаться.
если вы хотите использовать относительные пути для расширения приложений, вы можете, но должны запускать их с «/.». Например, вы можете сделать это, чтобы расширить application.cfc из корневого веб-каталога в каталог ниже веб-корневого каталога:
<cfcomponent output = "false" extends = "/.application">
<!--- whatever code you have --->
</cfcomponent>
теперь предположим, что в моем приложении есть следующие пути:
[webroot]/1/1a
[webroot]/2
предположим, что application.cfc в [webroot] / 1 / 1a расширяет application.cfc в [webroot]. теперь я хочу поместить application.cfc в [webroot] / 2 и расширить application.cfc в [webroot] / 1 / 1a. все, что мне нужно было сделать в моем [webroot] /2/application.cfc, это следующее:
<cfcomponent output = "false" extends = "/./1/1a/application">
<!--- whatever code you have --->
</cfcomponent>
надеюсь, это имеет смысл.
Что касается метода Б. Это можно сделать с помощью дополнительного файла в вашем примере. Это один дополнительный файл на cfc, который вы хотите расширить для каждого каталога, из которого вы хотите расширить.
3 файла, которые требуются.
/somepathtobasecomponent/basecomponent.cfc
Здесь нечего менять. Это остается прежним.
/pathtoworkingcfc/function.cfc
в теге cffunction установите расширение до extends = "basecomponent_extend"
/pathtoworkingcfc/basecomponent_extend.cfc
Единственным содержимым файла является cfinclude.
<cfinclude template = "/somepathtobasecomponent/basecomponent.cfc">
Да, я так и думал, проблема в том, что я хочу иметь возможность изменять используемое отображение в зависимости от того, на каком сайте оно работает.