Я пытаюсь соединить строку в Netsuite Advanced PDF с помощью Freemarker. Я читал документацию по встроенным строковым командам и не был уверен, как это возможно.
У меня есть таблица, которая должна включать переменную произвольного текста. Я хочу, чтобы текст переходил к следующему td, если он слишком длинный, но я не знаю, возможно ли это вообще. Я подумал, что могу попробовать соединить половину строки, если это определенное количество символов, а затем поместить вторую часть в следующий td. Это приводит к ошибке при создании PDF-файла о том, что диапазон выходит за границы.
Возможно ли то, что я пытаюсь сделать, или я поступаю неправильно? Соответствующий код ниже.
<td style = "background-color:#dce6f1" colspan = "4"><strong>Additional Items:</strong>${record.custbody387[0..*50]}</td>
</tr>
<tr>
<td colspan = "4">${record.custbody387[51..*100]}</td>
</tr>
<tr>
<td colspan = "4" style = "background-color:#dce6f1">This is Note 3</td>
</tr>
<tr>


Вы можете использовать функцию подстроки, но вам все равно нужно проверить пределы.
Я использую такой макрос:
<#macro lim val len><#if val?length < len>${val}<#else>${val?substring(0,len)}</#if></#macro>
который затем используется как:
<@lim val = "${orderAddress.addressee}" len=35 />
Таким образом, вы можете создать свой собственный макрос, который гарантирует, что у вас есть хотя бы 51 символ для запуска. Это могло бы выглядеть так:
<#macro lim val><#if val?length gte 51>${val[51..*100]}</#if></#macro>
Примечание: макросы Freemarker располагаются вверху файла (в отличие от макросов BFO, которые входят в элемент <macrolist>).
Вы можете просто использовать #if или ?then во втором td, чтобы избежать случая, вызывающего ошибку. Получение среза (предопределенного размера) также можно обобщить в функцию (или в макрос, но функция больше подходит для этого), но если вы вызовете ее только дважды, это, вероятно, излишество:
<#function getSlice(s, partNo)>
<#local start = 50 * (partNo - 1)>
<#return (s?length <= start)?then("", s[start..*50])>
</#function>
<tr>
<td style = "background-color:#dce6f1" colspan = "4"><strong>Additional Items:</strong>
${getSlice(record.custbody387, 1)}
</td>
</tr>
<tr>
<td colspan = "4">
${getSlice(record.custbody387, 2)}
</td>
</tr>
Спасибо, в итоге я использовал #if для выполнения этой задачи.