Enfinity中的功能

时间:2014-03-04 03:37:58

标签: jsp enfinity intershop

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

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

2 个答案:

答案 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的基类。除非你自己重写编译器:-)你不能添加新函数。

您可以执行其他操作来改进代码,但通常使用两个选项:

  1. ISML模块
  2. ISML自定义标记(扩展com.intershop.beehive.core.internal.template.isml.CustomTag的类,并在您的卡带中的module.properties文件中注册。例如,查看core\staticfiles\cartridge\config\modules.properties
  3. 第二个是正式不鼓励进行自定义项目开发,因为CustomTag类是内部的。