问题描述
我使用FreeMarker构建从电子邮件到发票模板的各种模板。我现在正在寻找的问题与FreeMarker代码在表标记之外提取有关,因为HTML不允许tbody,thead,tr之外的其他字符包含在其中。
如果有人知道如何绕过它,将感到高兴。
示例:
<table>
<tbody>
[#assign eventDetails = []]
[#if items?? && items?has_content]
[#list items as item]
<tr>
<td style="padding: 5px;vertical-align: top;border-bottom: 1px solid #eee; text-align: center;">
${item.name}
</td>
</tr>
[/#list]
[/#if]
</tbody>
</table>
在使用element.innerHTML应用于编辑器后变为:
[#assign eventDetails = []]
[#if items?? && items?has_content]
[#list items as item]
[/#list]
[/#if]
<table>
<tbody>
<tr>
<td style="padding: 5px;vertical-align: top;border-bottom: 1px solid #eee; text-align: center;">
${item.name}
</td>
</tr>
</tbody>
</table>
解决方法
它当然仅取决于您使用的HTML编辑器,但是如果发生以下情况,则应尝试进行以下操作:
- 您正在使用
<#...>
语法。对于编辑器来说,它看起来像是一些未知的标签,而不是CDATA,所以也许它的反应方式不一样。 - 将
<tbody>...</tbody>
替换为[@html.tbody]...[/@html.tbody]
。这样,编辑者可能就不足以删除内容。或者,与[@html.table]
等相同,虽然很尴尬,但可能会比现在更好。 (要使该模板在运行模板时真正起作用,您必须在tbody
名称空间中定义html
宏。它不是内置的。)
最后一个示例:
<#ftl output_format='HTML'>
<#macro table attrs...><@elementWithNested 'table' attrs><#nested></@></#macro>
<#macro tbody attrs...><@elementWithNested 'tbody' attrs><#nested></@></#macro>
<#macro elementWithNested elementName attrs>
<${elementName}<#if attrs?size != 0><#list attrs as k,v> ${k}="${v}"</#list></#if>>
<#nested>
</${elementName}>
</#macro>
如果以上模板是#import
-ed为html
,则<@html.table foo="bar">...</@html.table>
等将起作用。