2011-12-12 73 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