2009-08-11 12 views
1

J'invoque un cfc, le cfc dispose d'un ensemble par défaut d'arguments comme ceci:Pouvez-vous réaffecter le <cfargument par défaut dans un cfc?

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

Ce que je voudrais faire est de ces arguments ne requred (comme vous pouvez le voir nécessaire = "no ") mais j'aimerais réaffecter la variable arguments si nécessaire.

donc quelque chose comme:

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

Mais je ne suis pas en mesure de remplacer la variable par défaut ARGUMENTS. Y at-il quelque chose que vous pouvez repérer que je fais mal?

EDIT:

Je fais cela parce que si aucun argument est passé au cfc, je veux créer un. Je suppose que je devrais cfset une variable locale si l'argument n'a pas de longueur?

<cfif Len(ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM)> 
    <cfset EMailTemplateAddressFrom = ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM> 
<cfelse> 
    <cfset EMailTemplateAddressFrom = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>   
</cfif> 

Répondre

5

<cfparam> ne fonctionne que si la variable a été définie avant. Vos paramètres de fonction ne sont pas indéfinis, ils ont juste leurs valeurs par défaut. Donc, vous pouvez le faire:

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

De cette façon, si vous ne fournissez pas « opt » (ou délibérément réglé sur « par défaut »), il se voir assigner une sorte de valeur par défaut dynamique. Et vous pouvez toujours le rendre vide, si vous en avez besoin. Au lieu de "par défaut", vous pouvez choisir un autre type de valeur improbable qui vous permet de faire la distinction entre "non fourni" et "vide". (Parfois, je souhaite ColdFusion soutiendrait les valeurs NULL réelles ...)

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

Pour votre information, required="no" par défaut, donc je généralement ne prévoient pas expressément à la déjà CFML verbeux. :)

+0

J'ai essayé la première option que vous avez fournie plus tôt, avant que je pose la question. Il semble que, pour une raison quelconque, la fonction ferait erreur si quelque chose était au-dessus des arguments. Afin de définir la valeur par défaut comme # getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM # je devais exécuter la requête au-dessus des arguments. Comportement étrange et je n'ai jamais rencontré ce problème, jusqu'à aujourd'hui. – jyoseph

+0

bien, ça dépend si ça peut référencer la variable getEmailTemplate, quelle qu'elle soit. Si c'est une variable dans la portée This ou Variables, ça ira. – Henry