Как функция createObject() Coldfusion выполняет поиск компонента?
У меня есть некоторые проблемы с пониманием createObject()
функция, о которой говорится в документации, используется как CreateObject("component", component-name)
,
В документации упоминается, что Coldfusion выполняет поиск компонента в "каталогах, указанных на странице" Путь к пользовательским тегам "в ColdFusion Administrator".
Но это не работает в моем случае. У меня есть папка, сопоставленная в CF admin для пользовательских тегов, внутри этой папки я помещаю папку с именем "mycfcs", где присутствует мой cfc, с именем Item.cfc
На тестовой странице я создаю объект следующим образом:
<cfset testObj = createobject("component","mycfcs.Item")>
Но выдает ошибку "Не удалось найти компонент или интерфейс ColdFusion".
3 ответа
Создайте сопоставление для каждого приложения, указывающее на папку с вашими CFC в Application.cfc
this.mappings["/cfc"] = {path to your CFCs};
Тогда в вашем createObject()
вызовите, используйте путь с разделителями точками к вашему CFC.
createObject("component", "cfc.Item");
Если у вас есть подпапки, вы получите к нему доступ как таковой
createObject("component", "cfc.subFolder.Item");
Когда вы создаете или запускаете компонент, вы можете указать только имя компонента или указать полный путь. Чтобы указать полный путь, разделите имена каталогов точками, а не обратными слешами. Например, myApp.cfcs.myComponent указывает компонент, определенный в myApp\cfcs\myComponent.cfc. Для получения дополнительной информации см. Сохранение и присвоение имен компонентам ColdFusion.
ColdFusion использует следующие правила для поиска указанного CFC: ◾ Если вы используете тег cfinvoke или cfobject или функцию CreateObject для доступа к CFC со страницы CFML, ColdFusion ищет каталоги в следующем порядке:
- Локальный каталог вызывающей страницы CFML
- Корень сети
- Каталоги, указанные на странице пользовательских путей тегов в ColdFusion Administrator
Убедитесь, что у вас правильное имя, имя файла вашего компонента заканчивается на CFC (НЕ CFM), ссылка на путь в вашей команде createObject верна, и ваш случай верен (в зависимости от ОС).
Вот некоторый код, который я использую для динамической загрузки CFC:
<cffunction name="getNewObject" hint="Gets a new object with the specified type, module, project and settings" access="private">
<cfargument name="myDocObj" required="yes" hint="Document Object to create a report from">
<cfscript>
//Create path based on arguments
var objectPath = createPath(arguments.myDocObj);
var tmpObj = createObject("component", "#objectPath#").init(this.Settings)
// return new object based on objectPath, which uses module and type to derive the name of the cfc to load
return tmpObj;
</cfscript>
</cffunction>
<cffunction name="createPath" access="private">
<cfargument name="myDocObj" required="yes">
<cfscript>
var module = LCase(arguments.myDocObj.get('module'));
var type = LCase(arguments.myDocObj.get('documentType'));
// return the name of the cfc to load based on the module and type
return "plugins.#module#_#type#";
</cfscript>
</cffunction>
Просто измените mycfcs.Item на Item.
На нашем сервере разработки в качестве расположения пользовательского тега указано "D:\DW\CF_stuff\CustomTags". У меня есть файл, расположенный по адресу "I:\CF_stuff\CustomTags\Components\CompareData\DW-ScheduleBookdan.cfc". Если я запускаю этот код:
abc = CreateObject("component", "DW-ScheduleBookdan");
WriteDump(abc);
Я вижу свойства и методы объекта.
Что ты делаешь по-другому?