1

データベースに Coldfusion コードを保存して、cfmail の件名に使用しようとしています。格納されているコードは次のとおりです。

"RE: <cfif myData.general.legalName NEQ """">  {{dotlegalname}}<cfelse>{{docketLegalName}}</cfif>,    
DOT## {{dot}}, Docket ##(s)   {{docketString}}" 

データベースから文字列を取得するときは、cfsavecontent を使用して評価を試みます。

<cfsavecontent variable="subject">
 <cfoutput>#myData.email.subject#</cfoutput>
</cfsavecontent>

私も試しました

<cfsavecontent variable="subject">
     <cfoutput>#evaluate(myData.email.subject)#</cfoutput>
</cfsavecontent>

そして、すべての {{ }} を適切な値に置き換えます。

ただし、電子メールの件名は、評価済みの cfif を含めることを頑固に拒否しており、代わりに cfif を文字列であるかのように表示しています。

何か案は?

4

10 に答える 10

4

実行時に作成しているコードを動的に評価する唯一の方法は、コードをファイルに書き込んでから実行することです。

最も簡単な方法は、仮想ファイル システムの .cfm ページに書き込み (おそらく UUID に基づいてファイルに名前を付けるため、一意です)、コンテンツを実行する必要がある場所に書き込みます。

私は通常、このように実行時にコードを生成することを推奨しませんが、場合によっては最も洗練されたソリューションになる可能性があります。

別の方法として、CFML コードをデータベースに保存する代わりに、一連の CFML 電子メール テンプレート ファイルをサーバーのディレクトリに保存し、データベースにどのテンプレートを含める必要があるかを cfinclude またはcfモジュール。

于 2010-12-20T22:07:04.830 に答える
3

データベースに保存されている CFML は、最初にファイルに書き込んでから、 を使用してインクルードしない限り、動的に評価することはできません<cfinclude>

于 2010-12-20T22:04:29.453 に答える
3

マークの答えに加えて、いくつかの疑似コードがあります:

<cfset fileName = createUUID() & ".cfm">
<cfset fileWrite( fileName, [CODE_FROM_DB]>
<cfinclude template="#fileName#">
<cfset fileDelete( fileName )>

私は以前にこのようなコードを問題なく使用しました。すべてが RAM で実行されるため、仮想ファイル システム内のすべてのものが飛びます。ベスト プラクティスとして、作成されたファイルを忘れずに削除してください ;)

于 2010-12-21T04:01:50.803 に答える
2

絶対にこれを行う必要がある場合は、evaluate() 関数を見てください。これは基本的に、新しい CF スレッドを起動し、渡された文字列をコンパイルして実行し、結果を返します。

可能であれば、データベースの文字列ではなく、実行中の実際のファイルにロジックを移動する方法を見つけようとします。既に作成した文字列に基づいてデータを取得していると想定しているため、それに何かを追加することを検討している可能性があるため、subjectDotLegal や subjectDocketLegal などを検索しています。

evaluate() は遅く、醜く、危険である可能性があることを忘れないでください (渡されたものはすべて実行されます!)。回避策がある場合は、それを使用することをお勧めします。

于 2010-12-20T22:27:10.623 に答える
2

口ひげのようなものを使わないのはなぜですか?

http://mustache.github.com/ https://github.com/pmcelhaney/Mustache.cfc

スクリプトで必要なロジックの一部を動的に実行するだけではありません。プロジェクトをチェックして、改善して貢献することをお勧めします。

ああ、せっかくなので、私は何年もの間、CFML を動的に解析してレンダリングする機能が必要だとアドビにメールしてきました。悲しいことに、私の叫びは無視されるだけです。この機能を追加する必要があると不平を言う人がもっといれば、それに値する注目を集めることになるでしょう。

于 2011-09-30T19:47:19.237 に答える
0

OpenBlueDragonには、これを実行できるrender関数があります。

次のコードを使用して、ファイルを RAM に保存して cfincludes するカスタム組み込み関数を作成することにより、Railo でこの関数を模倣できます。

<cffunction name="render" output="Yes" returntype="string"><!--- 
       ---><cfargument name="Code" required="Yes" type="string"><!--- 
       ---><cfset local.mapping = {'/render_ram_resource':'ram://'}><!--- 
       ---><cfapplication action="update" mappings="#local.mapping#"><!--- 
       ---><cfset local.fileName = "/render_ram_resource/_render_" & 
createUUID() & ".cfm"><!--- 
       ---><cffile action="WRITE" file="#fileName#" 
output="#arguments.Code#"><!--- 
       ---><cfinclude template="#fileName#"><!--- 
       ---><cffile action="DELETE" file="#fileName#"><!--- 
---></cffunction> 

(出力を許可する必要があるが、余分な空白を防ぐ必要があるため、これは異常に見えます。したがって、すべてのコメントが必要です。残念ながら、SO の構文の強調表示はそれらによって混乱しているようです。)

ACF 互換のソリューションが必要な場合は、通常のファイルシステムと事前に作成されたマッピングを使用する必要があります。(まあ、ACF9 以降では RAM 仮想ファイルシステムを使用できますが、このようにオンザフライでマッピングを作成することはできません。)

于 2011-09-30T18:09:52.073 に答える
0

例を挙げます: code.txt が以下を含むテキスト ファイルであると仮定します (db に格納された CFML のシミュレーションを容易にするため):<cfoutput>#now()#</cfoutput>

次のコードが機能します。

<cfset q = queryNew("code") />
<cfset queryAddRow(q,1) />
<cfset querySetCell(q, "code", fileRead(expandPath('code.txt')), 1) />
<cfdump var="#q#">
<cfset newCodeFile = expandPath('dynamic.cfm') />
<cfset fileWrite(newCodeFile, q.code[1]) />
<cfinclude template="dynamic.cfm" />
于 2010-12-20T22:12:10.800 に答える
0

より良い方法があります。つまり、メモリ内ファイルを使用します。この方法では、ディスクに I/O がないため、はるかに高速になります。

論理パスを取るタグについては、管理者でマッピングを定義します。cfinclude タグを使用してメモリ内 CFM ページを実行します。

タグで使用できるように、ram:/// のマッピングを作成します。この例では、/inmemory が ram:/// を指すマッピングです。

絶対パスを取るタグの場合、次の例に示すように構文を指定します。

RAM からファイルを削除するには、inf cffile と action delete を使用することもできます。

于 2013-03-27T18:39:46.487 に答える
-1

組み込みのQuoteName 関数を試してみます。

于 2010-12-20T21:51:49.773 に答える