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.

Другие вопросы по тегам