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; variables.indeciesArray = ArrayNew(1); variables.indeciesFile = application.mappings[Plugins]&'/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. Така че вашият код ще бъде: variables.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›. Това: variables.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, обхватът „този“ се отнася само за този конкретен CFC. Така че, когато сте в CFM страница, която попада под юрисдикцията на Application.cfc, тогава обхватът на „този“ е за 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