Допустим, у вас есть MyUtils
с методами foo()
и bar()
, и вы хотите получить доступ к ним в шаблонах.
Вы можете добавить произвольные объекты Java в модельиспользуя eval
загрузчик данных в data
, например myUtils: eval('new com.example.MyUtils()')
.Тогда вы можете выдать myUtils.foo()
в шаблонах.Но вы хотели добавить методы на верхнем уровне.Это тоже возможно.Как в eval
, так и в пользовательском DataLoader
(в зависимости от того, что вы хотите использовать) у вас есть доступ к engine
, объекту fmpp.Engine
.И тогда вы можете воспользоваться этим трюком:
// Note: In case you are using eval, use Java 1.2 syntax (no generics).
TemplateHashModel myUtilsModel = (TemplateHashModel) engine.wrap(new MyUtils());
Map<String, TemplateModel> myUtilsMethodModels = new HashMap<>();
myUtilsMethodModels.put("foo", myUtilsModel.get("foo"));
myUtilsMethodModels.put("bar", myUtilsModel.get("bar"));
return myUtilsMethodModels;
Затем вы добавите Map
к data
без имени .(Если вы добавите Map
к data
без имени, его ключи станут переменными верхнего уровня.)
Конечно, его можно отполировать, чтобы получше, например, найти нужные вам методы автоматически и т. Д. ПлюсЯ не пробовал это выше (так что опечатки возможны).Но это основная идея.(Полагаю, было бы целесообразно, если бы у FMPP был загрузчик данных, который загружает статические методы класса ... Но сейчас его нет.)