Как ссылаться на переменные базы данных внутри тега cfunction Coldfusion8?
Я делаю свои первые шаги в Coldfusion8. Мне удалось настроить компонент / сервис с функцией, которую я звоню.
Внутри функции мне нужно создать таблицу 2x2 с ошибками и соответствующими сообщениями об ошибках. Сообщения об ошибках многоязычны и хранятся в таблице MySQL.
Проблема:
Я не могу найти способ ссылаться на мои переменные внутри тега CFFunction. Это не работает:
// select from database
<cfparam name="Session.Sprache" default="DE">
<cfquery datasource="iln" name="texte">
SELECT *
FROM languages
WHERE sprache = "#Session.lang#"
</cfquery>
<cffunction name="createErrMsgsLog" returntype="object">
// create and populate
<cfset allErrMsgs=ArrayNew(2)>
<cfset allErrMsgs[1][1]="firma">
// not defined
<cfset allErrMsgs[1][2]="#tx_validate_firma#">
....
</cffunction>
Вопрос:
Как я могу ссылаться на мои переменные aka #tx_validate_firma# правильно внутри CFfunction. Они всегда не определены.
РЕДАКТИРОВАТЬ:
Хорошо. Это похоже на работу:
Внутри application.cfc я звоню:
<cfinvoke component="services.errorMsg"
method="createErrMsgsLog"
returnvariable="errMsgs">
</cfinvoke>
Внутри errorMsg.cfc я делаю:
<cfcomponent displayname="errorMsg">
<cffunction name="createErrMsgsLog">
<cfquery datasource="mine" name="texte">
SELECT *
FROM sprachen
WHERE sprache = "#Session.Sprache#"
</cfquery>
<cfoutput query="texte">
// column name = value
<cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
</cfoutput>
// build array
<cfset allErrMsgs=ArrayNew(2)>
<cfset allErrMsgs[1][1] = "firma">
<cfset allErrMsgs[1][2] = #tx_validate_firma#>
...
<cfset errMsgs = serializeJSON(allErrMsgs)>
<cfreturn errMsgs>
</cffunction>
</cfcomponent>
Это просто ужасно много кода...
3 ответа
Просто ответ передовой практики здесь. При ссылке на переменную вы можете просто ссылаться на имя, не нужно использовать ##.
Например<cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
Может быть <cfset "#trim(bezeichner)#" = trim(textinhalt)>
Это не решает вашу неопределенную проблему, но вы должны следовать за ним (не пытайтесь очистить старый код), но это делает его намного более читабельным в imo.
Здесь есть над чем подумать. Не столько ответ, сколько некоторые наблюдения:
Пожалуйста, для здравомыслия, тех, кто должен поддерживать ваш код, и тех, кто хочет помочь, не используйте "select *" в запросах. Из комментариев, которые я видел здесь, tx_validate_firma возвращается в запросе с именем texte. Если код явно сказал:
<cfquery datasource="iln" name="texte">
SELECT tx_validate_firma, etc
FROM languages
WHERE sprache = "#Session.lang#"
</cfquery>
мы все знали бы, откуда взялась ценность. О, и, пожалуйста, посмотрите на использование cfqueryparam в предложении where.
Я предполагаю, что это работает, хотя это кажется странным:
<cfset allErrMsgs[1][2] = #tx_validate_firma#>
Поскольку область действия tx_validate_firma явно не указана, мы, аутсайдеры, остаемся царапающими наши головы, как, возможно, кто-то пытается поддержать это позже.
<cfset allErrMsgs[1][2] = texte.tx_validate_firma>
Обратите внимание, что вам не нужно использовать # в подобных заданиях. Обычно в теге ColdFusion они вам не понадобятся, если вы не заключены в кавычки. Что-то вроде этого:
<cfset fullName = "#firstName# #middleInitial# #lastName#">
Чтобы использовать значение внутри функции, вам нужно передать значение в функцию в качестве значения аргумента, например:
<cffunction name="createErrMsgsLog" returntype="object">
<cfargument name="someName" [etc]>
А затем ссылаться на него как arguments.someName внутри функции.
Хотя вы можете вырваться из внутренней области видимости своей функции и получить доступ к переменным из основной строки, это не считается особенно хорошей практикой.
Другое соображение, возможно, состоит в том, чтобы абстрагировать ваши функции в определения компонентов в файле CFC, а не просто определять их в коде "mainline". Это делает код более аккуратным и понятным и более пригодным для повторного использования. Тем не менее, часто есть основания для определения одноразовой функции, также встроенной. Но, возможно, стоит исследовать:
http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html