我注意到有几个“内联函数”可以用来在打印之前更改值。例如:<isprint value="#replace(data, '$', 'Fr.')#">
我想问的是我可以创建这样的自定义函数吗?如果可以,怎么做?我知道如何创建自定义 ISML 标签,但我不知道是否有办法创建这样的自定义内联函数。Enfinity 手册上没有关于它的内容。如果可以的话,那将帮助我减少代码大小,因为我不必来回使用 JSP 来处理 ISML 函数无法处理的所有事情。谢谢。
不幸的是,通常没有直接和干净的方法来创建这样的 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 中大部分时间描述的场景。
希望这可以帮助。
你实际上不能。ISML 编译器中对这些 ISML 函数有特殊支持,可将您的 ISML 转换为 JSP。在 Enfinity (IS7) 中引入新功能时,编译器的语法会发生变化,并且这些功能会随产品的新版本一起提供。通常额外的支持被添加到作为AbstractTemplate
所有从 ISML 生成的 servlet 的基类的类中。除非你自己重写编译器:-) 你不能添加新函数。
您可以做其他事情来改进您的代码,但通常使用两个选项:
com.intershop.beehive.core.internal.template.isml.CustomTag
并module.properties
在您的墨盒的文件中注册的类。例如 peek at core\staticfiles\cartridge\config\modules.properties
)第二个是官方不鼓励自定义项目开发的,因为CustomTag
该类是内部的。