operadores logicos for coldfusion if-statement cfmail

logicos - for coldfusion



¿Cómo fuerzo la evaluación de un cfif almacenado en una cadena? (10)

Intento almacenar el código de coldfusion en una base de datos para usarlo como sujeto de un cfmail. El código almacenado es el siguiente:

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

Cuando recupero cadena de la base de datos, uso cfsavecontent para intentar evaluarla.

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

También intenté

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

Y luego reemplazo todos los {{}} con los valores apropiados.

Sin embargo, el tema del correo electrónico se niega obstinadamente a contener un cfif evaluado, y en su lugar muestra el cfif como si fuera una cadena.

¿Algunas ideas?


Intentaría la función incorporada de QuoteName .


La única forma de evaluar dinámicamente el código que está creando en el tiempo de ejecución es escribirlo en un archivo y luego ejecutarlo.

La forma más fácil sería escribirlo en una página .cfm en el Sistema de archivos virtual (probablemente nombre el archivo después de un UUID, por lo que es único), y luego es donde necesita ejecutar los contenidos.

Normalmente, no recomendaría generar código en tiempo de ejecución como este, pero puede ser la solución más elegante en algunos casos.

Como alternativa, en lugar de almacenar el código CFML en la base de datos, tiene un conjunto de archivos de plantilla de correo electrónico CFML que se almacenan en un directorio de su servidor, y en su base de datos simplemente registra qué plantilla debe incluirse a través de cfinclude o cfmodule.


No se puede evaluar dinámicamente CFML almacenado en una base de datos sin primero escribirlo en un archivo y luego usar <cfinclude> para incluirlo.


Para dar un ejemplo: Supongamos que code.txt es un archivo de texto que contiene lo siguiente (solo para facilitar la simulación de CFML almacenado en un db): <cfoutput>#now()#</cfoutput>

El siguiente código funcionaría:

<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" />


Si absolutamente tiene que hacer esto, mire la función de evaluación (). Esto, esencialmente, activa un nuevo hilo de CF, compila la cadena que se le pasa, lo ejecuta y devuelve el resultado.

Si es posible, trataré de encontrar una manera de mover su lógica al archivo real que se está ejecutando, no a la cadena de la base de datos. Supongo que está extrayendo los datos en función de una cadena que ya ha creado, por lo que podría considerar añadirle algo, por lo que está buscando subjectDotLegal y subjectDocketLegal o algo similar.

Recuerde, evaluar () es lento, feo y puede ser peligroso (¡ejecutará cualquier cosa que se le pase!). Si hay una forma de evitarlo, te sugiero que lo uses.


Además de la respuesta de Mark aquí hay un código de psuedo:

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

He usado código como este antes sin problemas. Cualquier cosa en el sistema de archivos virtual vuela ya que todo se ejecuta en la memoria RAM. Para la mejor práctica, recuerde eliminar los archivos creados;)


¿por qué no usar algo como bigote?

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

tiene la capacidad de no solo hacer parte de la lógica que desea en su secuencia de comandos de forma dinámica. Realmente te sugiero que revises el proyecto y tal vez incluso mejores y contribuyas.

OH y solo por la oportunidad de estar en una tribuna: he estado enviando correos electrónicos a Adobe durante años diciendo que necesitamos la capacidad de analizar dinámicamente y procesar CFML. Tristemente, mis gritos solo han sido ignorados. tal vez si más personas se quejan de que esta característica necesita ser agregada, obtendría la atención que merece.


En OpenBlueDragon está la función de renderizado , que puede hacer esto.

Puede imitar esta función en Railo creando una función incorporada personalizada que guarda el archivo en RAM, luego cf lo incluye, usando el siguiente código:

<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>

(Esto parece inusual porque necesita permitir la salida, pero previene el espacio en blanco adicional, de ahí el por qué de todos los comentarios. Desafortunadamente, el resaltado de sintaxis de SO parece confundirse).

Si necesita una solución compatible con ACF, necesitará usar el sistema de archivos regular y una asignación creada previamente. (Bueno, en ACF9 y superior puede usar el sistema de archivos virtual RAM, pero afaik no puede crear asignaciones sobre la marcha de esta manera).


Hay una mejor manera, es decir, usar en archivos de memoria. De esta forma, no tiene E / S en el disco y, por lo tanto, es mucho más rápido:

Para las etiquetas que toman una ruta lógica, defina la asignación en el Administrador. Ejecute las páginas CFM en memoria usando la etiqueta cfinclude:

Cree una asignación para ram: /// para que pueda usarse en las etiquetas. En este ejemplo, / inmemory es el mapeo que apunta a ram: ///.

Para las etiquetas que toman la ruta absoluta, especifique la sintaxis como se proporciona en el siguiente ejemplo:

También puede eliminar el archivo del ram usinf cffile y eliminar acción.


Así es como almacené mi encabezado y pie de página para todas las páginas de un registro. Este código puede ir en la parte superior de cada página. Pero lo tengo en APPLICATION.cfm y parece estar funcionando bien.

La clave aquí no es utilizar signos # libra # en sus expresiones. Usuario [llaves cuadradas]. El código los elegirá, los evaluará y devolverá el resultado a la plantilla.

Sustituirá el número 0 si no puede evaluar una expresión como un medio de manejo de errores.

<CFSET FooterID=1234> <!-- ID of the record you want to use --> <CFQUERY NAME="StoredHeader" Datasource="DS1"> Select Body from templates where id=#FooterID# </CFQUERY> <CFSET Parse=StoredHeader.Body> <CFLOOP CONDITION="FindNoCase(''['',Parse,1) GT 0"> <CFSET STB=FindNoCase(''['',Parse,1)> <CFSET ENB=FindNoCase('']'',Parse,1)> <CFIF ENB-STB GT 0> <CFSET BracketExp=Mid(Parse,STB+1,ENB-1-STB)> <CFTRY> <CFSET BracketValue=Evaluate(BracketExp)> <CFSET Parse=ReplaceNoCase(Parse,''[''&BracketExp&'']'',Evaluate(#BracketExp#))> <cfcatch type="any"> <div>''Using ZERO 0 for missing <cfoutput>#BracketExp#'' </cfoutput> </div> <CFSET Parse=ReplaceNoCase(Parse,''[''&BracketExp&'']'',''0'')> </cfcatch> </CFTRY> </CFIF> </CFLOOP> <CFSET Footer=Parse> <cfoutput>FOOTER</cfoutput>