Как ссылаться на переменные базы данных внутри тега 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

Другие вопросы по тегам