首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >极限函数

极限函数
EN

Stack Overflow用户
提问于 2014-03-04 03:37:58
回答 2查看 349关注 0票数 1

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

我想问的是,我能创建这样的自定义函数吗?如果可以,怎么做?我知道如何创建自定义ISML标记,但我不知道是否有一种方法可以创建这样的自定义内联函数。在Enfinity手册上什么都没有。如果可以的话,这将帮助我减少代码大小,因为我不需要反复使用JSP来处理ISML函数无法处理的所有事情。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-04 14:28:02

不幸的是,通常没有直接和干净的方法来创建这样的ISML函数--至少在Intershops Suite 6.x生产线中是这样的。

然而,一个非常常见的解决方法是创建“助手对象”。例如,您可以创建一个类。

代码语言:javascript
复制
public class MyHelperFunction
{
    public String getPrefixedString(String prefix, String data)
    {
        return prefix+data;
    }    
}

然后,您将创建一个管道,将该类的一个实例放入管道字典,如下所示

代码语言:javascript
复制
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,但根据此语句返回的内容,调用方式可能有所不同:

代码语言:javascript
复制
select di.domainname, p.stringvalue from preference p inner join domaininformation di on di.domainid=p.domainid where preferencename='SitePrefixPipelineName';

前缀管道方法的边界是不像乔布斯或邮件模板那样是存储请求的请求。在这里,您必须显式地包含上面描述的管道。

但是,您也可以使用一些脏的JSP魔法来获取这个对象的实例-- JSP在大多数情况下都被解析为脏,但是它有时会导致更简单的代码/管道:

代码语言:javascript
复制
<%
    getPipelineDictionary().put("HelperFunctionInstance", new MyHelperFunction());
%>

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

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

代码语言:javascript
复制
<isprint value="#HelperFunctionInstance:prefixedString('prefix', data)#">

我知道这不是很好,也不是你所期望的那样。然而,不幸的是,除了“自定义ISML标记”=您已经知道的模块之外,这是Enfinity 6.x中的唯一方法。这些模块用于您在Enfinity套件6.x中描述的大多数场景。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2014-03-05 08:15:45

实际上你不能。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)

由于CustomTag类是内部的,因此对于自定义项目开发,第二种方法被正式禁止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22162403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档