问题我有一个小程序可以对PDF进行“更改”,之后我必须将更改保存到存储库中的相应文件中。如何在工作流程中集成此applet?要阅读的任何提示或文件吗?
我想在一个任务表单(在任务编辑页面中),一个带有按钮的新组件来调用applet,但这是个好主意?有效吗?因为我想当人按下接受按钮时,会调用小程序,然后只有在进行更改时,任务才会完成。但是如何?
答案 0 :(得分:3)
我没有您的applet的详细信息,所以我无法确定它是否可行,但您可以尝试简单地使用一些javascript来访问您的applet的公共方法。
Alfresco中的表单引擎可以轻松自定义编写自定义控件。 自定义控件将生成在表单中嵌入applet所需的html和javascript,并在按下按钮时调用它。
了解您是否可以拦截Alfresco小程序执行的更新将会很有用。例如,您可以在Alfresco中拥有一个将在文档更新时调用的侦听器(行为)。如果根据您的业务逻辑,侦听器可以理解applet已完成操作,则它可以自动触发工作流的转换。 此解决方案非常强大,因为applet执行的更新和任务更新将是事务性的:它们都成功或者回滚更新。
如果可能的话,不要单独调用applet和工作流的转换:这两个操作不会是原子的,你最终会得到一个不一致的存储库。
<强>更新强> 要避免任何自定义Alfresco功能,请不要修改acitiviti过渡。鉴于您只需要添加一个按钮来调用您的applet,请使用自定义ftl并在表单配置中指定它。
以下文章是学习如何操作的好指南(我强烈建议您阅读并遵循练习):
Jeff Potts' article on Advanced Workflows
正如您在段落Edit share-config-custom.xml中看到的那样,您可以指定用于呈现表单中每个字段的免费标记模板。如果您愿意,可以指定用于转换按钮的其他模板。该模板将呈现applet以及html和javascript来调用它。
以下类是一个示例(它是从真实代码中复制的代码段,我没有测试它,它只是为了显示行为的主要部分)是一种侦听节点创建的行为或更新其属性。你必须选择对你更好的东西。小程序究竟是什么?它是否创建了一个新节点?或更新其属性?或者更新节点的内容?
以下链接为您提供了触发转换的代码示例: Trigger Activiti workflow for task sitting in ReceiveTask looping
package com.someco.alfresco.behaviours;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;
public class SomeObjectCreatePolicy implements OnCreateNodePolicy, OnUpdatePropertiesPolicy {
private final Logger logger = Logger.getLogger(SomeObjectCreatePolicy.class);
@Override
public void init() {
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
Model.TYPE_ENTITY_OBJECT,
new JavaBehaviour(this, "onCreateNode",
Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
Model.TYPE_ENTITY_OBJECT,
new JavaBehaviour(this, "onUpdateProperties",
Behaviour.NotificationFrequency.EVERY_EVENT));
}
@Override
public void onCreateNode(ChildAssociationRef childAssocRef) {
/* Your logic to fire the transition */
}
@Override
public void onUpdateProperties(NodeRef nodeRef,
Map<QName, Serializable> before, Map<QName, Serializable> after) {
/* Your logic to fire the transition */
}
}
当然,您可以使用Spring实例化对象:
<bean id="org.alfresco.behaviours.someObjectCreatePolicy" class="com.someco.alfresco.policy.SomeObjectCreatePolicy"
init-method="init">
</bean>
答案 1 :(得分:1)
我们通过在iframe中打开第3方应用(applet)进行了类似的集成。 入口点是一个自定义文档库操作,使用自定义客户端java脚本打开iframe并将参数传递给它,但我想如果您希望它从表单按钮弹出,您可以为它提供自定义控件。
然后第3个pary app使用我们编写的自定义露天网页(用于保存您的pdf)与露天沟通。
=&gt;或者如果你有applets java代码,你可以将它移动到alfresco java web脚本。这将显着简化架构。
答案 2 :(得分:1)
正如我在my comment中提到的那样,它是可行的,但我不会批准你这样做的方式
我的理解(来自之前关于SO的问题)是您在自己的露天实例中集成文档签名功能的原因。并且您已经开发了一个doclib操作,该操作可以导航到带有applet的特殊页面,以验证用户身份,签署文档,然后上传新的(签名)版本。现在,您需要将相同的applet集成到工作流中,以便让用户可以要求其他用户对文档进行数字签名(或者类似的东西......)。
同样,我建议您将代码从applet迁移到服务任务(服务器端),因为它具有更高的兼容性和更高的安全性(仅供参考:并非所有浏览器仍支持NPAPI,afaik至少Chrome不再,所以他们需要配置才能运行你的小程序!)
话虽如此,我想你这样做的方法是:
/org/alfresco/components/form/controls/workflow/activiti-transitions.ftl
获取灵感,并创建自己的sign-transition.ftl
FTL,在其中为applet添加html和js代码,就像在您的页面中一样。task
作为itemId ....)