Как вызвать функцию cf только один раз и по триггеру пользователя в Coldfusion?
У меня есть компонент в Coldfusion8, который создает журнал сообщений об ошибках и передает его в переменную в JSON, которая будет подхвачена Jquery.
Я перестраиваю этот компонент, когда пользователь меняет языки (перезагружает страницу) следующим образом:
HTML:
<a href="index.cfm?lang=EN">change to english</a>
В перезагрузке я проверяю lang и, если указано, запускаю это в Coldfusion:
<cfif isdefined("lang")>
<cfset Session.lang= #lang#>
<!--- rebuild error messages --->
<cfinvoke component="services.errorMsg"
method="createErrMsgsLog"
returnvariable="errMsgs">
</cfinvoke>
<cfoutput><script type="text/javascript">var errorLog = '<cfoutput>#errMsgs#</cfoutput>';</script></cfoutput>
</cfif>
Вопрос 1: Есть ли лучший способ сделать это? Из моего маленького опыта Coldfusion CFINVOKE создает и отбрасывает объекты, так что это должно быть дружественным к ресурсам.
Вопрос2:
Как я могу запустить это, когда приложение / сессия запускается? Я попытался запустить его из моего application.cfc onSessionStart, но я не могу вызвать оттуда никакое предупреждение / консоль Javascript, поэтому я боюсь, что ничего не происходит... Также должен быть лучший способ, чем штукатурить application.cfc с такими функциями.
Спасибо за некоторые идеи!
РЕДАКТИРОВАТЬ:
На полпути: я могу выстрелить, когда меняю языки:
<cfif isdefined("Sprachwechsel")>
<cfset Session.Sprache = #Sprachwechsel#>
<cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="Session.errMsgs">
</cfinvoke>
<cfoutput>
<script type="text/javascript">var errorLog = '<cfoutput>#Session.errMsgs#</cfoutput>'</script>
</cfoutput>
Однако я также хочу запустить это один раз из application.cfc. Я могу использовать тот же код или код ниже. Ничего не произошло.
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfscript>
APPLICATION.strObjs = structNew();
APPLICATION.strObjs.objErrMsg = createObject("component","services.errorMsg");
</cfscript>
<cfreturn true />
</cffunction>
<cffunction name="onSessionStart" returnType="void" output="false">
<cfscript>
Session.sprache = "DE";
Session.errMsgs = APPLICATION.strObjs.objErrMsg.createErrMsgsLog();
</cfscript>
<cfreturn true />
</cffunction>
Я испробовал вариант gazillion, но Session.errMsgs просто остается неопределенным, если я проверю его на реальной странице. Есть идеи, что мне не хватает?
EDIT2:
Хорошо. Я нашел проблему при чтении здесь. Когда я изменил имя своего приложения, я увидел, что не работает, и после исправления этого onSessionStart сработал, как и ожидалось. Совершенно поездка...
2 ответа
Вероятно, есть лучший способ сделать это, но из кода, который вы разместили, трудно сказать, какой способ лучше всего подходит для вашей конкретной ситуации. Я полагаю, ваш пример кода находится в вашем index.cfm?
Вот что вы можете сделать:
1) в вашем методе onApplicationStart() в Application.cfc кешируйте ваш компонент:
application.objErrMsh = createobject("component", "services.errorMsg");
2) в onSessionStart() в вашем Application.cfc установите для session.lang язык по умолчанию и установите для session.errMsg var:
session.lang = "DE";
session.errMsg = application.objErrMsg.createErrMsgsLog(session.lang);
(Я предполагаю, что возврат вашего компонента зависит от языковых настроек пользователя. Если нет - какой смысл повторно вызывать компонент при смене языка?)
3) всякий раз, когда вам нужно установить javascript errorLog var, вы можете сделать следующее:
<script type="text/javascript">var errorLog = <cfoutput>#session.errMsg#</cfoutput>;</script>
4) когда пользователь нажимает на ссылку "изменить язык", запустите этот код:
<cfparam name="url.lang" type="string" default="DE">
<cfif url.lang neq session.lang>
<cflock scope="session" type="exclusive">
<cfset session.lang = url.lang>
<cfset session.errMsg = application.objErrMsg.createErrMsgsLog(session.lang)>
</cflock>
</cfif>
Т.е. приведенный выше код будет в верхней части вашей страницы index.cfm. Вы также захотите добавить некоторую проверку для значения url.lang (например, что оно находится в списке допустимых значений), чтобы не допускать появления всякого рода мусора - всегда очищайте все предоставленные пользователем значения.
НТН
Я не могу помочь с вопросом 1, но, возможно, могу с 2.
Вы должны иметь возможность поместить свой код в CFC где-нибудь и запустить его из Application.cfc (и, пожалуйста, убедитесь, что имя файла начинается с заглавной буквы A), метода onRequestStart.