ColdFusion Application.cfc & cfinvoke & ЭТОТ объем
При использовании CF application.cfc - для начала необходимо создать несколько переменных (в этой области), таких как this.name, this.applicationtimeout() и т. Д.
Я столкнулся с чем-то, что считаю странным, и надеюсь, что кто-нибудь сможет объяснить, почему это происходит, и возможный обходной путь.
Принято довольно много "ЭТ" переменных, которые могут работать для установки переменных, специфичных для приложения (конечно, вы должны проверить "разрешить переменные, специфичные для приложения" в CFADMIN - что я и сделал)
Одним из них является THIS.mappings - массив отображений - MINE выглядит примерно так:
this.path = GetDirectoryFromPath( GetCurrentTemplatePath() );
this.mappings = {
'/files' = '#this.path#_my_files\'
,'/functions' = '#this.path#_my_functions\'
,'/logs' = '#this.path#_my_logs\'
};
он работает нормально - когда он установлен внутри блока cfscript в верхней части application.cfc, он работает нормально - если я помещаю этот блок скрипта в его собственный файл и включаю его в файл application.cfc
однако - в попытке сегментировать мой код - я хотел поместить ВСЕ настройки своего приложения в settings.cfc... (мысль здесь была, ЕСЛИ нужно было изменить некоторые настройки - мне не пришлось бы беспокоиться о 'где "Я не хочу разделять ЭТОТ материал на app.cfc и другие настройки приложения или сеанса в settings.cfc
Итак, я создал метод в файле settings.cfc, называемый getTHIS, и поместил туда блок сценария... затем использовал
<cfinvoke component="settings"
method="getTHIS"
returnvariable="THIS"
/>
Который РАБОТАЕТ - кроме (кажется) на сопоставлениях...
This.name и т. Д., Кажется, что все работает и устанавливается - на самом деле this.mappings также устанавливается нормально (так кажется), если я делаю
<cfdump var="#THIS#" label="THIS" />
Дамп идентичен дампу ЭТОГО, когда я установил его буквально на странице app.cfc.
ОДНАКО - любая попытка вызвать шаблон через сопоставление - приводит к стандартному "если вы хотите использовать абсолютные пути, вы должны создать отображение бла-бла-бла..."
Моей БОЛЬШОЙ целью было (при запуске приложения) сканировать каталог на наличие подкаталогов и создавать сопоставления на основе определенных подкаталогов... но если я не могу абстрагировать эту функциональность в свою собственную функцию - я буду вынужден напишите это прямо в app.cfc (который не убил бы меня, но опять же, я пытался сегментировать мой код логически... Кажется, есть ограничение того, когда и где эти сопоставления могут быть установлены... верно?
Поэтому я думаю, что главный вопрос - могу ли я установить this.mappings с помощью внешнего метода? Я думаю, я мог бы вернуть "настройки, которые я хочу", используя вызов cfc, а затем просто сделать "установить this.whwhat = возвращать форму cfc" - (это может быть мой ответ...)
Спасибо
2 ответа
Я не проверял это, но я уверен, что он будет работать, если ваш application.cfc расширяет ваши settings.cfc.
component {
public any function getMappings() {
var mappings = {};
//code to get your directories etc.
return mappings;
}
}
component extends="settings" {
this.name = "xxxx";
this.mappings = getMappings();
...
}
Сопоставления могут быть установлены только в "псевдо-конструкторе", а не внутри любого из методов внутри Application.cfc - http://adobe.ly/QN2oX1
Вы можете попытаться установить this.mappings для результата вызова CFC (я не могу понять, почему это не будет работать), но если это зависит от сопоставления, это, вероятно, не будет работать.