Как функция 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");

По этой ссылке Adobe:

Когда вы создаете или запускаете компонент, вы можете указать только имя компонента или указать полный путь. Чтобы указать полный путь, разделите имена каталогов точками, а не обратными слешами. Например, myApp.cfcs.myComponent указывает компонент, определенный в myApp\cfcs\myComponent.cfc. Для получения дополнительной информации см. Сохранение и присвоение имен компонентам ColdFusion.

ColdFusion использует следующие правила для поиска указанного CFC: ◾ Если вы используете тег cfinvoke или cfobject или функцию CreateObject для доступа к CFC со страницы CFML, ColdFusion ищет каталоги в следующем порядке:

  1. Локальный каталог вызывающей страницы CFML
  2. Корень сети
  3. Каталоги, указанные на странице пользовательских путей тегов в 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);

Я вижу свойства и методы объекта.

Что ты делаешь по-другому?

Другие вопросы по тегам