我注意到有几个“内联函数”可用于在打印前更改值。例如:<isprint value="#replace(data, '$', 'Fr.')#">
我想问的是,我可以创建这样的自定义函数吗?如果我可以,怎么样?我知道如何创建自定义ISML标记,但我不知道是否有办法创建这样的自定义内联函数。 Enfinity手册中没有任何关于它的内容。如果可以,那将有助于我减少代码大小,因为我不必回到JSP来处理ISML函数无法处理的所有事情。感谢。
答案 0 :(得分:2)
不幸的是,通常没有直接和干净的方法来创建这样的ISML功能 - 至少在Intershops Enfinity Suite 6.x产品系列中。
但是,一个非常常见的解决方法是创建“辅助对象”。例如,您可以创建一个类
public class MyHelperFunction
{
public String getPrefixedString(String prefix, String data)
{
return prefix+data;
}
}
然后,您将创建一个pipelet,将此类的实例放入您的管道字典中,如此
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;
}
}
如果这需要是一个可用的常用函数,请将此pipelet调用到您的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管道方法的边界是不是像Jobs或Mail模板那样的实际店面请求的请求。在那里你必须明确地包括上面描述的小管。
但是,您也可以使用一些脏JSP magick来获取此对象的实例 - 在大多数情况下,在Intershop项目中JSP被认为是脏的,但它有时会导致更简单的代码/管道:
<%
getPipelineDictionary().put("HelperFunctionInstance", new MyHelperFunction());
%>
您可以在根模板中包含此内容,以使其在整个ISML代码中可用。在根模板中包含此边界的边界是其用法将发出新的SSI请求。在新请求的上下文中,您将丢失HelperFunction(您必须重新包含它)。
在这两种情况下,您现在都可以从ISML调用:
<isprint value="#HelperFunctionInstance:prefixedString('prefix', data)#">
我知道这不是很好,并不完全符合您的预期。但是,不幸的是,除了“自定义ISML标签”=您已经知道的模块之外,它是Enfinity Suite 6.x的唯一方法。这些模块用于Enfinity suite 6.x中大部分时间描述的场景。
希望这有帮助。
答案 1 :(得分:1)
你实际上不能。 ISML编译器中有对这些ISML函数的特殊支持,它将您的ISML转换为JSP。当在Enfinity(IS7)中引入新函数时,编译器的语法会发生变化,并且函数会随产品的新版本一起提供。通常会向类AbstractTemplate
添加额外的支持,这是由ISML生成的所有servlet的基类。除非你自己重写编译器:-)你不能添加新函数。
您可以执行其他操作来改进代码,但通常使用两个选项:
com.intershop.beehive.core.internal.template.isml.CustomTag
的类,并在您的卡带中的module.properties
文件中注册。例如,查看core\staticfiles\cartridge\config\modules.properties
)第二个是正式不鼓励进行自定义项目开发,因为CustomTag
类是内部的。