Можете ли вы переназначить <cfargument по умолчанию в cfc? - PullRequest
1 голос
/ 11 августа 2009

Я вызываю cfc, 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.">

Что я хотел бы сделать, это сделать эти аргументы необязательными (как вы можете видеть по required = "no"), но я бы хотел переназначить переменную arguments при необходимости.

Так что-то вроде:

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

Но я не могу переопределить переменную ARGUMENTS по умолчанию. Есть что-нибудь, что вы можете заметить, что я делаю не так?

EDIT:

Я делаю это, потому что если в cfc не передается аргумент, я хочу его создать. Я думаю, что я должен cfset локальной переменной, если аргумент не имеет длины?

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

Ответы [ 2 ]

5 голосов
/ 11 августа 2009

<cfparam> работает, только если переменная была undefined ранее. Параметры вашей функции не являются неопределенными, просто они имеют значения по умолчанию. Так что вы можете сделать это:

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

Таким образом, если вы не предоставите «opt» (или намеренно установите его в «default»), ему будет присвоено какое-то динамическое значение по умолчанию. И вы все равно можете сделать его пустым, если вам нужно.

Вместо «по умолчанию» вы можете выбрать какой-то другой тип невероятного значения, которое позволяет различать «не предоставлено» и «пусто». (Иногда мне хотелось бы, чтобы ColdFusion поддерживал фактические нулевые значения ...)

2 голосов
/ 11 августа 2009
<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">

или ....

<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" по умолчанию, поэтому я обычно не указываю это для уже многословного CFML. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...