0

我正在 Coldfusion8 中迈出第一步。我设法使用我正在调用的 cffunction 设置组件/服务。

在函数内部,我需要构建一个包含错误和相应错误消息的 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>

问题:如何在CFfunction
中 正确引用我的变量,也就是 #tx_validate_firma# 。它们总是未定义的。

编辑
好的。这似乎有效:

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>  

这似乎是一个非常多的代码......

4

3 回答 3

1

这里只是一个最佳实践答案。引用变量时,只需引用名称即可,无需使用##。

例如 <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">

<cfset "#trim(bezeichner)#" = trim(textinhalt)>

这并不能解决您未定义的问题,但是您应该继续前进(不要费心清理旧代码),但这使它更具可读性 imo。

于 2012-04-29T18:36:45.933 回答
0

要在函数中使用值,您需要将该值作为参数值传递给函数,例如:

<cffunction name="createErrMsgsLog" returntype="object">
    <cfargument name="someName" [etc]>

然后在函数中将其作为 arguments.someName 引用。

虽然您可以突破函数的内部范围并从主线访问变量,但这样做并不是特别好的做法。

另一个考虑可能是将您的函数抽象为 CFC 文件中的组件定义,而不仅仅是在“主线”代码中定义它们。这使得代码更整洁、更连贯,并使其更具可重用性。也就是说,通常也有理由将一次性函数内联定义。但也许值得研究:

http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html#1266855

于 2012-04-29T16:19:42.903 回答
0

这里有几件事要考虑。与其说是答案,不如说是一些观察:

为了你自己的理智,那些必须维护你的代码的人,以及那些想要提供帮助的人,请不要在查询中使用“select *”。从我在这里看到的评论中, tx_validate_firma 在名为 texte 的查询中返回。如果代码明确表示:

<cfquery datasource="iln" name="texte">
    SELECT tx_validate_firma, etc
    FROM languages
    WHERE sprache = "#Session.lang#"
 </cfquery>

我们都知道价值从何而来。哦,请查看在 where 子句中使用 cfqueryparam。

我假设这是可行的,尽管它看起来很奇怪:

<cfset allErrMsgs[1][2] = #tx_validate_firma#>

因为 tx_validate_firma 的范围没有明确说明,所以我们这些局外人只能摸不着头脑,因为以后有人可能会试图维护它。

<cfset allErrMsgs[1][2] = texte.tx_validate_firma>

请注意,您不需要在这样的分配中使用#。通常在 ColdFusion 标记中您不需要它们,除非您在引号内。像这样的东西:

<cfset fullName = "#firstName# #middleInitial# #lastName#">
于 2012-04-29T19:23:16.677 回答