在露天共享中自定义(单独)元数据表单

时间:2013-07-13 23:10:37

标签: forms customization alfresco alfresco-share

看似简单的要求

我需要一个包含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控件。
  • 从客户端调用webscript javascript会增加另一次往返。

当前表单定义

<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操作不是必需的;我能以任何我想要的方式实现这一点。

1 个答案:

答案 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脚本来处理表单提交 - 如果您使用表单框架,表单框架将为您处理所有这些正确。