2011-12-12 55 views
2

我试图创建一个窗体过滤器,这将做一些窗体的后处理。Alfresco窗体过滤器

我试图实现的是: 每次创建或修改节点时,都应在节点持久化后应用过滤器。

当我编辑/修改现有的,但它不会在创建新节点后运行它运行得很好。

这里是我的代码:

public class CaseFormFilter extends AbstractFilter<Object, NodeRef> 
{ 
    protected ServiceRegistry registry; 
    protected NodeService nodeService; 
    protected SearchService searchService; 
    protected SiteService siteService; 
    protected NamespaceService namespaceService; 

    public void setServiceRegistry (ServiceRegistry registry) 
    { 
     this.registry  = registry; 
     this.nodeService = this.registry.getNodeService(); 
     this.searchService = this.registry.getSearchService(); 
     this.siteService = this.registry.getSiteService(); 
     this.namespaceService = this.registry.getNamespaceService(); 

    } 

    @Override public void afterPersist(Object item, FormData data, NodeRef persistedObject) 
    { 
    System.out.println("Persisting!"); 

    } 

    @Override public void afterGenerate(Object item, List fields, List forcedFields, Form form, Map context) 
    { 
     System.out.println("Calling afterGenerate!!"); 
    } 

    @Override public void beforeGenerate(Object item, List fields, 
         List forcedFields, Form form, Map context) 
    { 
     System.out.println("Calling beforeGenerate!!"); 
    } 

    @Override public void beforePersist(Object item, FormData data) 
    { 
     System.out.println("Calling beforePersist!!"); 

    } 

} 

我可以看到beforeGenerateafterGenerate总是被调用,查看,即使,这是有道理的。 但是,afterPersist仅在编辑节点时运行,而不在创建新节点时运行。

我做错了什么或缺少什么?维基/文档在这一点上是无用的,阅读http://wiki.alfresco.com/wiki/Forms_Developer_Guide#Form_Filter只是告诉我看看DOD5015模块,它提供了一个例子,但并没有真正提供任何答案。

我使用的是Alfresco 4.0.b社区版。

编辑:多一点澄清

回答

4

你必须注册你的表单过滤器两次。我猜你现在只注册nodeFilterRegistry。对于基于内容模型的表单(创建节点),您需要使用typeFilterRegistry注册过滤器。

这是一个在有登记表格过滤器配置的例子:

<bean id="yourFormFilterNode" class="com.domain.YourFormFilter" parent="baseFormFilter"> 
    <property name="filterRegistry" ref="nodeFilterRegistry" /> 
    <property name="nodeService" ref="nodeService" /> 
</bean> 

<bean id="yourFormFilterType" class="com.domain.YourFormFilter" parent="baseFormFilter"> 
    <property name="filterRegistry" ref="typeFilterRegistry" /> 
    <property name="nodeService" ref="nodeService" /> 
</bean> 
+0

你是对的!它在使用typeFilter注册后起作用。现在我只需要弄清楚它实际发送的内容作为持久对象,但至少我的方法已经运行了! – ohej

+0

我想知道你是如何知道这样的东西的,关于它的文档/维基是很不清楚的:/ – ohej

+0

你是对的,缺乏这方面的文档。当我第一次使用它时,我不得不将它从博客文章和源代码拼凑在一起。 – Florian

0

这是相当明显的是,提交时afterPersist只叫,因为上观看你不是“坚持”的任何数据。

所以在大多数情况下,您只需要在/之后生成。

+0

我不希望它观看时运行,我希望它后,我创建一个表单的新节点上运行。编辑现有节点时它工作正常,但在创建时不起作用。 – ohej

+0

您想在创建新节点后运行它。但你想做什么?你想改变一些节点的具体日期吗?然后你可以使用行为(策略)。所以首先澄清你真正想要获得什么。 –

+0

我在保存节点后设置了很多不同的自定义属性,类似于records management/dod5015模块,唯一ID和其他内容。 我的自定义代码工作得很好,它只是没有在创建新节点上运行,因为我需要使用nodeFilterRegistry和typeFilterRegistry注册两次。 – ohej