Функции в 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. Если вы сами не переписываете компилятор:-) вы не можете добавлять новые функции.

Вы можете сделать другие вещи, чтобы улучшить свой код, но чаще всего используются два варианта:

  1. Модули ISML
  2. Пользовательские теги ISML (классы, расширяющие com.intershop.beehive.core.internal.template.isml.CustomTag и которые зарегистрированы в module.properties файл в вашем картридже. Например, взглянуть на core\staticfiles\cartridge\config\modules.properties)

Второй официально не рекомендуется для разработки пользовательских проектов, потому что CustomTag класс внутренний.

Другие вопросы по тегам