2016-02-18 8 views
0

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

Перед

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

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

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

+0

Какая версия ColdFusion включена? Я вижу, что код с 2011 года.Этот человек, возможно, делал это на CF 9 –

+0

Каков прецедент для написания пользовательского тега для 'cfmail'? Не похоже, что вы действительно делаете что-то другое. –

+0

Просто скажите «нет» пользовательским тегам. –

ответ

2

EDIT: Несмотря на то, что это позволит работать с использованием пользовательских тегов, решение John Whish с использованием 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> 

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

+0

Спасибо. Это привело меня к правильному пути. –

3

Должен ли он быть пользовательским тегом? Кажется, это было бы проще обернуть в ХФУ. Что-то вроде:

<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 может быть синглтон (требуется только один экземпляр для каждого приложения), а затем вы можете делать вещи, как инъекционные конфиг если вы хотите вместо того, чтобы обнаруживать окружающую среду в фактическом ХФУ.

+0

Мне нравится это решение лучше, чем даже мое. cfcs гораздо более гибкие, чем пользовательские теги. – beloitdavisja

+1

Не обязательно. ХФУ и пользовательские теги просто решают разные проблемы. бывают случаи, когда один лучше подходит другому. В этом случае ХФУ будет лучше. –

 Смежные вопросы

  • Нет связанных вопросов^_^