Функции в Enfinity
Я заметил, что есть несколько "встроенных функций", которые я могу использовать, чтобы изменить значение перед его печатью. Например: <isprint value="#replace(data, '$', 'Fr.')#">
Я хочу спросить, могу ли я создать пользовательские функции, подобные этой? Если я могу, как? Я знаю, как создать пользовательский тег ISML, но я не знаю, есть ли способ создать пользовательские встроенные функции, подобные этому. Там нет ничего об этом в руководствах Enfinity. Если бы я мог, это помогло бы мне сократить размер кода, поскольку мне не нужно возвращаться к JSP, чтобы обрабатывать все вещи, которые не могут быть обработаны функциями ISML. Благодарю.
2 ответа
К сожалению, в целом не существует прямого и понятного способа создания таких функций ISML - по крайней мере, в линейке продуктов Intershops Enfinity Suite 6.x.
Тем не менее, довольно распространенным обходным решением является создание "вспомогательных объектов". Вы можете, например, создать класс
public class MyHelperFunction
{
public String getPrefixedString(String prefix, String data)
{
return prefix+data;
}
}
Затем вы создадите конвейер, который помещает экземпляр этого класса в ваш конвейерный словарь, как этот
package com.test.pipelet;
import com.intershop.beehive.core.capi.pipeline.Pipelet;
import com.intershop.beehive.core.capi.pipeline.PipelineDictionary;
public class CreateHelperFunctionInstance extends Pipelet
{
public static final String DN_HELPER_FUNCTION_INSTANCE = "HelperFunctionInstance";
public int execute(PipelineDictionary dict)
{
dict.put(DN_HELPER_FUNCTION_INSTANCE, new MyHelperFunction());
return PIPELET_NEXT;
}
}
Если это должна быть общая функция, доступная везде, поместите вызов этого конвейера в ваш конвейер Prefix-Start, который вызывается перед обработкой любого клиентского запроса... обычно называется Prefix.xml, но может вызываться по-разному в зависимости от того, что возвращает этот оператор:
select di.domainname, p.stringvalue from preference p inner join domaininformation di on di.domainid=p.domainid where preferencename='SitePrefixPipelineName';
Границы метода конвейерного префикса - это запросы, которые на самом деле не являются запросами витрины, как в заданиях или шаблонах почты. Там вы должны будете явно включить описанный выше конвейер.
Однако, в качестве альтернативы, вы также можете сделать немного грязной магии JSP, чтобы получить экземпляр этого объекта - JSP считается грязной в проектах Intershop большую часть времени, но иногда это приводит к более простому коду / конвейерам:
<%
getPipelineDictionary().put("HelperFunctionInstance", new MyHelperFunction());
%>
Например, вы можете включить это в свой корневой шаблон, чтобы сделать его доступным во всем коде ISML. Границы включения этого в корневой шаблон - это использование, которое выдаст новый запрос SSI. В контексте нового запроса вы потеряете свою HelperFunction (вам придется ее повторно включить).
В обоих случаях вы теперь сможете звонить из ISML:
<isprint value="#HelperFunctionInstance:prefixedString('prefix', data)#">
Я знаю, что это не очень хорошо и не совсем то, что вы ожидали. Однако, к сожалению, это единственный путь в Enfinity Suite 6.x, кроме "пользовательских тегов ISML" = модулей, которые вы уже знаете. Эти модули используются для сценариев, которые вы описываете большую часть времени в Enfinity suite 6.x.
Надеюсь это поможет.
Вы не можете практически. Существует специальная поддержка этих функций ISML в компиляторе ISML, который переводит ваш ISML в JSP. Когда в Enfinity (IS7) вводятся новые функции, грамматика компилятора изменяется, и функции приходят с новым выпуском продукта. Обычно в класс добавляется дополнительная поддержка AbstractTemplate
который является базовым классом всех сервлетов, сгенерированных из ISML. Если вы сами не переписываете компилятор:-) вы не можете добавлять новые функции.
Вы можете сделать другие вещи, чтобы улучшить свой код, но чаще всего используются два варианта:
- Модули ISML
- Пользовательские теги ISML (классы, расширяющие
com.intershop.beehive.core.internal.template.isml.CustomTag
и которые зарегистрированы вmodule.properties
файл в вашем картридже. Например, взглянуть наcore\staticfiles\cartridge\config\modules.properties
)
Второй официально не рекомендуется для разработки пользовательских проектов, потому что CustomTag
класс внутренний.