【问题标题】:Custom (separate) metadata form in alfresco share露天共享中的自定义(单独)元数据表单
【发布时间】:2013-07-13 23:10:37
【问题描述】:

看似简单的要求

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

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

遇到的问题

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

UI动作方式

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

然后我开始编写一个自定义 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 操作不是强制性的;我可以随心所欲地实现这一点。

【问题讨论】:

  • 您想在 doclib 中添加第二个编辑表单吗?如果是,你有没有看一下 alfresco 是如何实现默认操作的?

标签: forms customization alfresco alfresco-share


【解决方案1】:

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

【讨论】:

  • 谢谢!这是一个很好的线索。但是,“整页”是什么意思?
  • 我可能误读了您的问题。当您说您希望自定义弹出表单的行为类似于现有的“编辑元数据”操作时,我假设您希望在弹出窗口中有一个按钮,该按钮链接到具有更详细表单的完整页面。如果这不是一个要求,那么这将简化事情!
  • 怀疑沿线的东西:P。当然可以,谢谢。但是,我已经使用了自定义操作,所以我想我可以使用您的自定义处理程序。然后想到的唯一问题是,在表单定义的条件下,我是放置操作还是包含属性的内容类型?我将添加我当前的定义以澄清。
  • 在动作中嵌入表单配置是无效的,它必须在&lt;config evaluator="node-type" condition="cm:content"&gt;(或类似的)部分中。此外,您还需要在您的 &lt;form&gt; 元素上添加一个 id 属性,以便您可以从您的操作处理程序中引用它。
  • 我编辑了答案以删除关于第二个表单定义的部分
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多