Пользовательские теги Coldfusion CFMAIL и CfMailPart

Я пишу собственный тег для CFMAIL. Мне нужно обрабатывать определенные электронные письма иначе, чем стандартный CFMAIL. В качестве отправной точки я использую следующий пост — http://www.cfhero.com/2011/11/creating-environment-safe-wrapper-for.html

До

<cfmail to="[email protected]" from="[email protected]" subject="This is only a test">
<cfmailparam name="Importance" value="high">
hello world</cfmail>

После пользовательских тегов

<cf_email to="[email protected]" from="[email protected]" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
hello world</cf_email>

Все работает правильно для пользовательских CFMAIL и CFMAILPARAM, но мой вопрос заключается в том, как обрабатывать «CFMAILPART». При использовании существующего CFMAILPART в новых тегах CF выдает ошибку.

<cf_email to="[email protected]" from="[email protected]" 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.

Я вычеркиваю свои идеи, и мне не удается найти какие-либо справочные документы. Любая помощь или отправные точки будут высоко оценены.

Заранее спасибо.


person nope_four    schedule 18.02.2016    source источник
comment
Какая у вас версия ColdFusion? Я вижу, что код от 2011 года. Возможно, этот человек делал это на CF 9.   -  person James A Mohler    schedule 18.02.2016
comment
Каков вариант использования для написания пользовательского тега для cfmail? Не похоже, что вы действительно делаете что-то другое.   -  person Scott Stroz    schedule 18.02.2016
comment
Просто скажите нет пользовательским тегам.   -  person Adrian J. Moreno    schedule 19.02.2016
comment
Я использую пользовательский тег, указывающий CFMAIL третьей стороне для обработки рейтинга кликов, сбросов и тому подобного. У нас есть несколько десятков экземпляров CFMAIL. План состоит в том, чтобы передать некоторые из них третьей стороне сейчас, а затем, в конечном итоге, передать еще несколько. Не все CFMAIL будут направлены на третью сторону, поэтому я хочу использовать CFMAIL и CF_EMAIL.   -  person nope_four    schedule 19.02.2016


Ответы (2)


РЕДАКТИРОВАНИЕ: хотя это заставит его работать с использованием пользовательских тегов, решение Джона Уиша с использованием cfc является более гибким.

Вероятно, вам потребуется создать пользовательский тег cf_emailpart по той же причине, по которой вы создали тег cf_emailparam. cfemailparam должен содержаться в теге cfmail

<cf_email to="[email protected]" from="[email protected]" 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>

Я не тестировал этот код, но я думаю, что это направление, в котором вам придется идти.

person beloitdavisja    schedule 18.02.2016

Должен ли это быть пользовательский тег? Мне кажется, это было бы проще, завернутый в 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 = "[email protected]">
        </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="[email protected]",
    from="[email protected]",,
    subject="An Email",
    importance="high",
    htmlContent="<p>Hello!</p>,
    textContent="Hello!"
)>

Экземпляр Mailer может быть одноэлементным (вам нужен только один экземпляр для каждого приложения), а затем вы можете делать такие вещи, как внедрение в него параметра конфигурации, если хотите, вместо обнаружения среды в фактическом CFC.

person John Whish    schedule 18.02.2016
comment
Мне это решение нравится больше, чем даже мое собственное. cfc гораздо более гибкие, чем пользовательские теги. - person beloitdavisja; 18.02.2016
comment
Не обязательно. CFC и пользовательские теги просто решают разные проблемы. бывают случаи, когда один подходит лучше, чем другой. В этом случае лучше использовать CFC. - person Scott Stroz; 18.02.2016