Определите и вставьте фрагменты Thymeleaf в шаблоны TEXT - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать шаблоны электронной почты в виде простого текста и HTML с помощью Thymeleaf. Поскольку я не хочу дублировать общие части, я хочу определить эти части отдельно и вставить их в более конкретные c шаблоны.

Это работает для HTML, но для переменных простого текста в общие части не заменяются:

HTML

  • общие. html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
            <div th:fragment="header">
                <p>
                    Hello, [( ${name} )]
                </p>
            </div>
            <div th:fragment="footer">
                <p>
                    Bye.
                </p>
            </div>
        </body>
    </html>
    
  • Speci c. html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
            <div th:replace="html/common::header"></div>
            <p>
                <a th:href="${myLink}">[( ${myLink} )]</a>
            </p>
            <div th:replace="html/common::footer"></div>
        </body>
    </html>
    

Простой текст

  • header.txt

    Hello ${name}
    
  • footer.txt

    Bye
    
  • speci c .txt

    [( ~{text/header} )]
    [( ${myLink} )]
    [( ~{text/footer} )]
    

Результат

Все это хорошо работает для HTML, но для простой версии текста переменная ${name} из вставленного шаблона header.txt не заменяется:

Hello, [#th:block th:utext="${name}"][/th:block]

    http://example.com

Bye.

Результат HTML выглядит правильно:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>
            <p>
                Hello, name-value
            </p>
        </div>
        <p>
            <a href="http://example.com">http://example.com</a>
        </p>
        <div>
            <p>
                Bye.
            </p>
        </div>
    </body>
</html>

Мои вопросы

  • Существует ли элегантное решение для простой текстовой версии?
  • Есть ли способ определить и использовать фрагменты также для текстового Thymeleaf te mplates?
  • Какие-нибудь общие рекомендации, так как я только начинаю использовать Thymeleaf?

1 Ответ

0 голосов
/ 24 апреля 2020

Переменные в текстовой версии

Для простого текста вы можете использовать синтаксис [#th:block].

В частности, вместо использования этого в вашем specific.txt:

[( ~{text/header} )]

вы можете использовать это:

[#th:block th:replace="text/header"][/th:block]

Кроме того, в файле header.txt, вместо использования этого:

Hello ${name}

вам нужно использовать это:

Hello [( ${name} )]

Это выражение для встраивания - которое вы уже использовали - и оно представлено здесь

Некоторые дополнительные примеры синтаксиса [#th:block] представлены здесь .

Определение и использование фрагментов для текста

Вы можете подумать что синтаксис [#th:block] теперь позволяет нам использовать фрагменты, аналогично подходу HTML. Например, что-то вроде этого:

DOES NOT WORK:
[#th:block th:replace="text/common :: header"][/th:block]

вместе с фрагментом common.txt, подобным этому:

ALSO DOES NOT WORK:
[#th:block th:fragment="header"]
Hello, [( ${name} )]
[/th:block]

Если вы попытаетесь это сделать, вы получите следующую ошибку:

java .lang.IllegalArgumentException: селекторы шаблона не могут быть указаны для шаблона с использованием режима шаблона TEXT: операции вставки шаблона должны всегда выполняться для целых файлов шаблона, а не для фрагментов

Общие комментарии

Единственное, что я хотел бы здесь упомянуть, если вы еще не видели или не использовали его, это параметризованные фрагменты . Они могут сделать HTML фрагментов более гибкими и пригодными для повторного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...