Шаблон Freemarker возвращает строку вместо элемента html - PullRequest
0 голосов
/ 21 июня 2019

Я работаю над шаблоном Freemarker для создания одной формы.Я объявил две переменные, используя <#local>, который будет содержать тег привязки и кнопку

<#local rightElement = "<a class='set-right' href='${data.url}'>Forgot your password?</a>">

<#local rightButton = "<input type='button' class='js-show-pass btn-toggle-password btn-link' value='Show'>">

. Я использовал эту переменную для перехода к макросу, который создает мою структуру формы.Но когда я загружаю свою страницу, переменная, которую я передаю, печатает как String на моей странице формы.Я обращаюсь к ним как ${rightElement} и ${rightButton} в моем макросе.Но он печатает мой якорный тег с двойными кавычками, превращая его в строку.

Я пробовал несколько способов удалить эту двойную кавычку безуспешно.Не могли бы вы предложить способы объявления тега привязки в переменной и использовать его как элемент html, а не как String.

1 Ответ

1 голос
/ 22 июня 2019

Я не уверен, что вы подразумеваете под «печатью моего якорного тега с двойными кавычками, превращая его в строку», но я предполагаю, что печатаемый HTML-код автоматически экранируется, и поэтому вы буквально видите исходный HTML-код.(с < -ами и всеми) в браузере вместо ссылки или кнопки.

Итак, сначала назначьте значения с синтаксисом <#local someName>content</#local> вместо <#local someName="content">:

<#local rightElement><a class='set-right' href='${data.url}'>Forgot your password?</a></#local>

<#local rightButton><input type='button' class='js-show-pass btn-toggle-password btn-link' value='Show'></#local>

Это гарантирует, что ${data.url} и т.п. должным образом экранированы (если вы используете авто-экранирование, и вы должны это сделать), также вам не придется избегать / бежать " или ' внутристроковый литерал, вы можете использовать #if и т. д. при построении значения и т. д.

Затем, где вы печатаете значение HTML, если вы используете современную версию автоматического экранирования (попробуйте ${.output_format}чтобы увидеть - он должен напечатать HTML тогда, а не undefined), теперь вы можете просто написать ${rightElement}, потому что FreeMarker знает, что он захватил HTML, и поэтому больше не нуждается в экранировании.Если вы используете унаследованную версию автоматического экранирования (в которой использовалась директива #escape), вам нужно написать <#noescape>${rightElement}</#noescape>.

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