Coldfusion this.mappings не работает в функции cfc ->

Как заставить сопоставления, которые я определил в application.cfc, работать в других функциях других cfc?

т. е. this.mappings["plugins"] отлично работает на любой странице, но если я попытаюсь создать экземпляр cfc, содержащий функцию, которая вызывает this.mappings["plugins"] - произойдет сбой.

Благодарность

РЕДАКТИРОВАТЬ: я не уверен - вот что я пытаюсь сделать: В application.cfc:

this.mappings["Plugins"] = \
getDirectoryFromPath(getCurrentTemplatePath())&'Assets/Plugins';

и в наличии.cfc:

<cfcomponent output="yes" > 
<cffunction name="showIndecies" access="public" output="yes" returntype="string">
<cfscript>
j = 1; 
variables.indeciesArray = ArrayNew(1); 
variables.indeciesFile = \
application.mappings["Plugins"]&'/StockMarketData/Data/indecies.csv'; 
</cfscript>

person Sean Kimball    schedule 14.01.2011    source источник
comment
Я думаю, нам нужно увидеть остальную часть вашей функции. Что вы делаете с путем к CSV, когда он у вас есть? Чтение, обработка и возврат? Вы можете использовать (как отмечает Сэм ниже) cfinclude, чтобы включить CSV, а затем выполнить свою обработку, но я думаю, что использование cffile для чтения файла было бы лучшим способом.   -  person Sean Coyne    schedule 14.01.2011


Ответы (3)


Я думаю, что вы называете сопоставление неправильно. Используя ваше определение в application.cfc:

this.mappings["plugins"]

Затем в другом коде на него будут ссылаться «плагины», поэтому:

var aName = new plugins.theCFC()
var aName = createObject("component","plugins.theCFC").init()
<cfinclude template="/plugins/aFile.cfm">

HTH, если нет, выложите свой код на вызывающей странице.

person Sam Farmer    schedule 14.01.2011
comment
Я не уверен - вот что я пытаюсь сделать: в application.cfc: this.mappings[Plugins] = getDirectoryFromPath(getCurrentTemplatePath())&'Assets/Plugins'; и в stock.cfc: ‹cfcomponent output=yes › ‹cffunction name=showIndecies access=public output=yes returntype=string› ‹cfscript› j = 1; переменные.indeciesArray = ArrayNew(1); variable.indeciesFile = application.mappings[Плагины]&'/StockMarketData/Data/indecies.csv'; ‹/cfscript› - person Sean Kimball; 14.01.2011
comment
Я обновил исходный вопрос - извините, просто разобрался с синтаксисом сообщения - person Sean Kimball; 14.01.2011
comment
На самом деле это не предназначено для сопоставлений. Если вы просто хотите указать путь к файлу для последующего использования, вы можете установить переменную области приложения. поэтому вместо использования this.mappings вы можете сделать application.pluginsPath = getDirectoryFromPath(getCurrentTemplatePath())... тогда в вашем CFC вы можете ссылаться на CFC. Однако имейте в виду, что доступ к области приложения из функции считается плохим OO. Нарушает инкапсуляцию. Вместо этого вы должны передать этот путь в качестве аргумента и вызвать его как showIndices(pluginsPath = application.pluginsPath). - person Sean Coyne; 14.01.2011
comment
Ага, сопоставления не попадают в область применения. ColdFusion будет работать, когда вы используете их, либо проверяя, соответствует ли первое слово в ссылке для cfc, либо если путь начинается с / для cfm. Таким образом, ваш код будет таким: variable.indeciesFile = '/plugins/StockMarketData/Data/indecies.csv - person Sam Farmer; 14.01.2011
comment
@Sean Coyne: Я думаю, это зависит :) Если Шон собирается использовать cfinclude для получения csv, то его решение подойдет. - person Sam Farmer; 14.01.2011
comment
Правда, мы не можем точно сказать, что он пытается с этим сделать, но мне это кажется неправильным :) - person Sean Coyne; 14.01.2011
comment
На самом деле я читаю его с тегом ‹cffile›. Это: variable.indeciesFile = 'Plugins/StockMarketData/Data/indecies.csv' не работает внутри функции. Я просто пытаюсь сохранить путь, на который я могу ссылаться позже, поскольку он может измениться. Итак, this.mappings не подходит для этого, а? Хм. - person Sean Kimball; 14.01.2011
comment
Нет, он используется для включения файлов и загрузки CFC. Вы можете просто использовать простую переменную области приложения, чтобы сохранить ее для вас. Вы должны настроить эту переменную в своем методе onApplicationStart вашего Application.cfc. - person Sean Coyne; 14.01.2011
comment
Да, используйте путь, определенный, как сказал Шон Койн. Вы можете использовать expandPath(), чтобы сделать его более простым и переносимым. Кроме того, если вы используете CF9, cfspreadsheet может помочь вам прочитать файл csv. - person Sam Farmer; 14.01.2011
comment
спасибо, ребята - быстрый поиск и замена, и мне удалось откопать все ссылки this.mappings в приложении и заменить их переменной приложения - конечно, за исключением функций, где она передается в качестве аргумента. Очевидно, мне нужно пересмотреть то, что, как мне казалось, я знал о сопоставлениях. Еще раз спасибо. - person Sean Kimball; 14.01.2011

Внутри CFC, одним из которых является Application.cfc, область действия "this" относится только к этому конкретному CFC. Таким образом, когда вы находитесь на странице CFM, которая подпадает под юрисдикцию Application.cfc, тогда область действия "this" относится к Application.cfc, но когда вы находитесь на CFC, она относится к конкретному CFC.

Тем не менее, зачем вам нужен прямой доступ к структуре сопоставлений? Если вы хотите использовать это сопоставление для загрузки объекта или включения файла, вы можете просто выполнить <cfinclude template="/plugins/path/to/myfile" /> или <cfset obj = createobject("component","plugins.path.to.my.cfc") />.

Каков ваш вариант использования для прямого доступа к структуре? Вы пытаетесь изменить его?

*отредактировано для исправления кода

person Sean Coyne    schedule 14.01.2011

Если ничего не изменилось в CF9, ваша первая ошибка в коде, который определяет ключи сопоставления без косой черты «/» в начале каждого имени сопоставления.

Вы определяете сопоставления как

this.mappings["plugins"] =

Вместо этого должно быть

this.mappings["/plugins"] =

Обратите внимание на косую черту «/» в имени ключа структуры. Вы должны назвать каждое сопоставление таким образом.

Тогда вы бы ссылались на сопоставления, как упомянул Сэм Фармер в своем комментарии.

Затем в другом коде на него будут ссылаться «плагины», поэтому:

var aName = new plugins.theCFC()
var aName = createObject("component","plugins.theCFC").init()
<cfinclude template="/plugins/aFile.cfm">
person Lostlinkpr    schedule 26.09.2011