1

看似简单的需求

我需要一个包含 4 个字段(文本字段、权限和日期 x2)的表单,其行为与编辑元数据表单完全相同,这些字段代表节点上的 4 个属性。

但是,此表单应作为与编辑元数据表单分开的 UI 提供,最好以 UI 操作的方式提供;DocLibActions 中有一个带有图标的按钮,单击该按钮时会弹出一个表单。

遇到的问题

我使用 UI 操作机制的问题是我无法将字段链接到属性。因此,每次打开表单时,都不会加载节点上可用的当前值。此外,不会自动强制执行适当的约束。我也想不出另一种方法来实现这个要求。

UI动作方式

从 UI 操作开始,我尝试使用form.destination保存 noderef 的模型变量访问自定义字段控件 ftl 中的节点。但是,当我想用​​它来获取节点属性时,结果发现companyhomeftl 中所需的对象对表单控件不可用。

然后我开始编写一个自定义的 java webscript,它使用给定的 nodeRef 返回我需要的 4 个属性,并使用 javascript 从我的自定义字段控件中调用它。这提出了以下两个问题:

  • 我必须自己将检索到的值传递给表单字段,这对控件提出了相当大的挑战date.ftl,但更甚于authority.ftl控件。
  • 从客户端 javascript 调用 webscript 会增加另一个往返行程。

当前表单定义

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

4

1 回答 1

5

查看Alfresco.doclib.Actions.onActionDetails()actions.js 客户端模块(源代码)中的函数。最简单的方法是注册您自己的自定义操作处理程序,它可以基于 中的代码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 脚本来处理表单提交 - 如果您正确使用表单框架,它将为您处理所有这些。

于 2013-07-15T15:48:53.963 回答