Pergunta

Eu estou chamando um cfc, o cfc tem um conjunto padrão de argumentos assim:

<cfargument name="EMAIL_TEMPLATE_CODE" type="string" required="yes" hint="EMAIL_TEMPLATE_CODE is required.">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string" required="no" hint="EMAIL_TEMPLATE_SUBJECT is NOT required.">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string" required="no" hint="EMAIL_TEMPLATE_BODY is NOT required.">

O que eu gostaria de fazer é ter esses argumentos não requred (como você pode ver por required = "não"), mas eu gostaria de transferir a variável de argumentos, se necessário.

Então, algo como:

<cfargument name="EMAIL_TEMPLATE_CODE" type="string" required="yes" hint="EMAIL_TEMPLATE_CODE is required.">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string" required="no" hint="EMAIL_TEMPLATE_SUBJECT is NOT required.">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string" required="no" hint="EMAIL_TEMPLATE_BODY is NOT required.">

<cfinvoke component="#Request.CFCPath#.email_template" method="getEmailTemplate" returnvariable="getEmailTemplate">
    <cfinvokeargument name="EMAIL_TEMPLATE_CODE" value="#ARGUMENTS.EMAIL_TEMPLATE_CODE#">
</cfinvoke>

<cfif getEmailTemplate.RecordCount>
    <cfparam name="ARGUMENTS.EMAIL_TEMPLATE_SUBJECT" default="#getEmailTemplate.EMAIL_TEMPLATE_SUBJECT#" type="string">
    <cfparam name="ARGUMENTS.EMAIL_TEMPLATE_BODY" default="#getEmailTemplate.EMAIL_TEMPLATE_BODY#" type="string">
</cfif>

Mas eu não sou capaz de substituir a variável argumentos padrão. Há algo que você pode manchar que eu estou fazendo errado?

EDIT:

Eu estou fazendo isso porque se nenhum argumento é passado para o cfc, eu quero criar um. Eu acho que deveria CFSET uma variável local se o argumento não tem comprimento?

<cfif Len(ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM)>
    <cfset EMailTemplateAddressFrom = ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM>
<cfelse>
    <cfset EMailTemplateAddressFrom = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>         
</cfif> 
Foi útil?

Solução

<cfparam> só funciona se a variável tem sido indefinido antes. Seus parâmetros de função não são indefinido, que só acontecerá a ter seus valores padrão. Então você poderia fazer isso:

<cffunction name="foo">
  <cfargument name="arg" type="string" required="yes">
  <cfargument name="opt" default="default" type="string" required="no">

  <cfif arguments.opt eq "default">
    <cfset arguments.opt = "whatever dynamic value">
  </cfif>
</cffunction>

Desta forma, se você não fornecer "opt" (ou deliberadamente defini-lo como "default"), ele vai ter atribuído algum tipo de valor padrão dinâmico. E você ainda pode fazê-lo esvaziar, se você precisar.

Em vez de "default", você poderia escolher algum outro tipo de valor improvável que permite que você faça uma distinção entre "não são fornecidos" e "esvaziar". (Às vezes eu desejo ColdFusion iria apoiar valores nulos reais ...)

Outras dicas

<cfargument name="EMAIL_TEMPLATE_CODE" type="string" 
    default="#getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM#">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string">

ou ....

<cfargument name="EMAIL_TEMPLATE_CODE" type="string">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string">
<cfif NOT isDefined("arguments.EMAIL_TEMPLATE_CODE")>
    <cfset arguments.EMAIL_TEMPLATE_CODE = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>
</cfif>

FYI, required="no" por padrão, então eu geralmente não especificá-lo ao já extenso CFML. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top