Coldfusion CFMAIL & CfMailPart Пользовательские теги
Я пишу пользовательский тег для CFMAIL. Мне нужно обрабатывать определенные электронные письма иначе, чем стандартный CFMAIL. Я использую следующий пост в качестве отправной точки - http://www.cfhero.com/2011/11/creating-environment-safe-wrapper-for.html
До
<cfmail to="no@example.com" from="no@test.com" subject="This is only a test">
<cfmailparam name="Importance" value="high">
hello world</cfmail>
После пользовательских тегов
<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
hello world</cf_email>
Все работает правильно для пользовательских CFMAIL и CFMAILPARAM, но мой вопрос заключается в том, как обрабатывать "CFMAILPART". При использовании существующего CFMAILPART в новых тегах CF выдает ошибку.
<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
<cfmailpart type="text">Text</cfmailpart>
<cfmailpart type="html">HTML</cfmailpart></cf_email>
Подробно: тег должен быть вложен в тег cfmail.
Сообщение: ошибка проверки контекста для тега cfmailpart.
Я поражаюсь своими идеями, и мне не удается найти какие-либо справочные документы. Любая помощь или отправные точки будут наиболее цениться.
Заранее спасибо.
2 ответа
РЕДАКТИРОВАТЬ: Хотя это заставит его работать с использованием пользовательских тегов, решение Джона Уиша с использованием CFC является более гибким.
Вы, вероятно, должны будете создать cf_emailpart
пользовательский тег по той же причине, по которой вы создали cf_emailparam
тег. cfemailparam
должны содержаться в cfmail
тег
<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
<cf_emailpart type="text">Text</cf_emailpart>
<cf_emailpart type="html">HTML</cf_emailpart>
</cf_email>
cf_emailpart
Почти так же, как cf_emailparam
, Последняя часть этого ассоциирует тег с cf_email
<cfif CompareNoCase(thisTag.hasEndtag,"YES") EQ 0 AND CompareNoCase(thisTag.executionMode,"END") EQ 0 >
<cfexit method="exittag" />
</cfif>
<cfassociate basetag="cf_email" datacollection="emailPart">
Тогда вам нужно будет добавить это в вашем cf_email
файл пользовательского тега, после раздела, где вы выводите cfmailparam
теги, а внутри cfmail
тег.
<cfif isDefined("thisTag.emailPart")>
<cfloop array="#thisTag.emailPart#" index="attrCol">
<cfmailpart attributecollection="#attrCol#" >
</cfloop>
</cfif>
Я не проверял этот код, но я думаю, что это направление, в котором вы должны идти.
Это должен быть пользовательский тег? Мне кажется, это было бы проще, завернутый в CFC. Что-то вроде:
<cfcomponent output="false">
<cffunction name="init" access="public" returntype="any" output="false">
<cfreturn this>
</cfunction>
<cffunction name="sendEmail" access="public" returntype="void" output="false">
<cfargument name="to" required="true">
<cfargument name="from" required="true">
<cfargument name="subject" required="true">
<cfargument name="importance" required="true">
<cfargument name="htmlContent" required="true">
<cfargument name="textContent" required="true">
<!--- do a check here to see if in production something like--->
<cfif ListFirst(CGI.SERVER_NAME, ".") neq "www">
<!--- override the to email address or whatever here --->
<cfset to = "foo@development.local">
</cfif>
<cfmail to="#to#" from="#from#" subject="#subject#">
<cfmailparam name="Importance" value="#importance#">
<cfmailpart type="text/plain">#textContent#</cfmailpart>
<cfmailpart type="text/html">#htmlContent#</cfmailpart>
</cfmail>
</cffunction>
</cfcomponent>
Тогда вы можете позвонить через:
<cfset Mailer = new Path.To.Component()>
<cfset Mailer.sendEmail(
to="foo@somewhere.com",
from="bar@somewhere.com",,
subject="An Email",
importance="high",
htmlContent="<p>Hello!</p>,
textContent="Hello!"
)>
Экземпляр Mailer может быть одноэлементным (вам нужен только один экземпляр для каждого приложения), и тогда вы можете сделать что-то вроде введения в него параметра конфигурации, если хотите, вместо того, чтобы обнаруживать среду в реальном CFC.