1

我注意到有几个“内联函数”可以用来在打印之前更改值。例如:<isprint value="#replace(data, '$', 'Fr.')#">

我想问的是我可以创建这样的自定义函数吗?如果可以,怎么做?我知道如何创建自定义 ISML 标签,但我不知道是否有办法创建这样的自定义内联函数。Enfinity 手册上没有关于它的内容。如果可以的话,那将帮助我减少代码大小,因为我不必来回使用 JSP 来处理 ISML 函数无法处理的所有事情。谢谢。

4

2 回答 2

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';

Prefix 管道方法的边界是不是真正店面请求的请求,例如在作业或邮件模板中的请求。在那里,您必须明确包含上面描述的 pipelet。

然而,或者你也可以做一些肮脏的 JSP 魔术来获取这个对象的一个​​实例——JSP 在 Intershop 项目中大部分时间被认为是肮脏的,但它有时会导致更简单的代码/管道:

<%
    getPipelineDictionary().put("HelperFunctionInstance", new MyHelperFunction());
%>

例如,您可以将其包含在您的根模板中,以使其在整个 ISML 代码中可用。将其包含在根模板中的边界是使用它会发出新的 SSI 请求。在新请求的上下文中,您将失去 HelperFunction(您必须重新包含它)。

在这两种情况下,您现在都可以从 ISML 调用:

<isprint value="#HelperFunctionInstance:prefixedString('prefix', data)#">

我知道这不是很好,也不完全符合您的预期。然而,不幸的是,它是 Enfinity Suite 6.x 中除了您已经知道的“自定义 ISML 标签”= 模块之外的唯一方法。这些模块用于您在 Enfinity 套件 6.x 中大部分时间描述的场景。

希望这可以帮助。

于 2014-03-04T14:28:02.593 回答
1

你实际上不能。ISML 编译器中对这些 ISML 函数有特殊支持,可将您的 ISML 转换为 JSP。在 Enfinity (IS7) 中引入新功能时,编译器的语法会发生变化,并且这些功能会随产品的新版本一起提供。通常额外的支持被添加到作为AbstractTemplate所有从 ISML 生成的 servlet 的基类的类中。除非你自己重写编译器:-) 你不能添加新函数。

您可以做其他事情来改进您的代码,但通常使用两个选项:

  1. ISML 模块
  2. ISML 自定义标签(扩展com.intershop.beehive.core.internal.template.isml.CustomTagmodule.properties在您的墨盒的文件中注册的类。例如 peek at core\staticfiles\cartridge\config\modules.properties

第二个是官方不鼓励自定义项目开发的,因为CustomTag该类是内部的。

于 2014-03-05T08:15:45.357 回答