我注意到有几个“内联函数”可以用来在打印之前修改值。例如:<isprint value="#replace(data, '$', 'Fr.')#">
我想问的是,我能创建这样的自定义函数吗?如果可以,怎么做?我知道如何创建自定义ISML标记,但我不知道是否有一种方法可以创建这样的自定义内联函数。在Enfinity手册上什么都没有。如果可以的话,这将帮助我减少代码大小,因为我不需要反复使用JSP来处理ISML函数无法处理的所有事情。谢谢。
发布于 2014-03-04 14:28:02
不幸的是,通常没有直接和干净的方法来创建这样的ISML函数--至少在Intershops 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;
}
}如果这需要在任何地方都是可用的通用函数,那么在处理任何客户端请求之前,都要在前缀-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在大多数情况下都被解析为脏,但是它有时会导致更简单的代码/管道:
<%
getPipelineDictionary().put("HelperFunctionInstance", new MyHelperFunction());
%>例如,您可以将其包含在根模板中,使其在ISML代码中可用。将其包含在根模板中的边界是使用它来发出新的SSI请求。在新请求的上下文中,您将释放HelperFunction (您必须重新包含它)。
在这两种情况下,您现在都可以从ISML调用:
<isprint value="#HelperFunctionInstance:prefixedString('prefix', data)#">我知道这不是很好,也不是你所期望的那样。然而,不幸的是,除了“自定义ISML标记”=您已经知道的模块之外,这是Enfinity 6.x中的唯一方法。这些模块用于您在Enfinity套件6.x中描述的大多数场景。
希望这能有所帮助。
发布于 2014-03-05 08:15:45
实际上你不能。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类是内部的,因此对于自定义项目开发,第二种方法被正式禁止。
https://stackoverflow.com/questions/22162403
复制相似问题