#html #freemarker
#HTML #freemarker
Вопрос:
Я использую FreeMarker для создания различных шаблонов от электронной почты до шаблонов счетов. Проблема, которую я ищу прямо сейчас, связана с извлечением кода FreeMarker за пределы тега table, поскольку HTML не допускает других символов внутри него, кроме tbody, thead, tr.
Был бы рад, если у кого-нибудь есть идея, как это обойти.
Пример:
<table>
<tbody>
[#assign eventDetails = []]
[#if items?? amp;amp; 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?? amp;amp; 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>
Комментарии:
1. К сожалению, вам придется либо изменить код редактора HTML, либо найти другое решение для их редактирования перед их отображением.
2. Ага, это то, чего я боялся. Я уже внес изменения и использую div с flex, чтобы получить табличный вид, и это отлично работает в браузере, но по электронной почте и PDF это не работает. Однако спасибо за ваше предложение!
Ответ №1:
Это, конечно, зависит только от используемого вами редактора 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
отредактирован как html
, то <@html.table foo="bar">...</@html.table>
и т.д. будет работать.
Комментарии:
1. Благословляю вас! Своим предложением вы избавили меня от недели мучений. 🙂 Я решил эту проблему с помощью макросов, и теперь это работает как по волшебству. Проблема заключается в функции innerHTML с использованием DOM, и большинство редакторов используют это для правильного отображения HTML внутри текстовой области.