看似简单的要求
我需要一个包含4个字段(textfield,authority和date x2)的表单,其行为与编辑元数据表单完全相同,表示节点上4个属性的字段。
但是,此表单应该作为编辑元数据表单的单独UI提供,最好是以UI操作的方式; DocLibActions中带有图标的按钮,以及单击该按钮时的弹出窗体。
遇到问题
我使用UI动作机制的问题是我无法将字段链接到属性。因此,每次打开表单时,都不会加载节点上可用的当前值。此外,不会自动强制执行适当的约束。我想不出另一种方法来实现这个要求。
用户界面操作方式
将其作为UI操作启动,我尝试使用保存noderef的form.destination
模型变量访问自定义字段控件ftl中的节点。但是,当我想获得具有该属性的节点属性时,结果表明ftl中所需的companyhome
对象对于表单控件是不可用的。
然后我继续编写一个自定义的java webscript,它使用给定的nodeRef返回我需要的4个属性,并使用javascript从我的自定义字段控件中调用它。这提出了以下两个问题:
date.ftl
控件提出了相当大的挑战,但更多的是authority.ftl
控件。当前表单定义
<config evaluator="string-compare" condition="my-action">
<forms>
<form>
<field-visibility>
<show id="textProperty" />
<show id="authorityProperty" />
<show id="dateProperty1" />
<show id="dateProperty2" />
</field-visibility>
<appearance>
<set id="generalSet" appearance="bordered-panel" label="General" />
<field id="textProperty" label="textProp" set="generalSet">
<control template="/org/alfresco/components/form/controls/propertyBasedTextfield.ftl">
<control-param name="propertyProvider">/alfresco/service/mark/custom/nodeProperties</control-param>
</control>
</field>
<field id="authorityProp" label="Authority" set="generalSet" >
<control template="/org/alfresco/components/form/controls/authority.ftl" >
<control-param name="compactMode">true</control-param>
</control>
</field>
<field id="dateProperty1" label="Date 1" set="generalSet">
<control template="/org/alfresco/components/form/controls/date.ftl" />
</field>
<field id="dateProperty2" label="Date 2" set="generalSet">
<control template="/org/alfresco/components/form/controls/date.ftl" />
</field>
</appearance>
</form>
</forms>
</config>
我如何才能最好地实施此要求?请注意,使用UI操作不是必需的;我能以任何我想要的方式实现这一点。
答案 0 :(得分:4)
查看actions.js客户端模块(source code)中的Alfresco.doclib.Actions.onActionDetails()
函数。最简单的方法是注册您自己的custom action handler,它可以基于onActionDetails()
中的代码,但使用您自己的自定义表单ID来公开基本表单,例如
var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&destination={destination}&mode={mode}&submitType={submitType}&formId={formId}&showCancelButton=true",
{
itemKind: "node",
itemId: nodeRef,
mode: "edit",
submitType: "json",
formId: "***custom-form-id***"
});
var editDetails = new Alfresco.module.SimpleDialog(this.id + "-editDetails-" + Alfresco.util.generateDomId());
editDetails.setOptions({
width: "40em",
templateUrl: templateUrl,
...
});
您显然需要将自定义表单定义添加到share-config-custom.xml
文件或类似文件中,您还可以在其中包含文档库操作定义。
您不需要编写任何自定义UI组件。
此外,您不需要在UI呈现时手动将属性值注入表单,或者编写任何Web脚本来处理表单提交 - 如果您使用表单框架,表单框架将为您处理所有这些正确。