Forms alfresco共享中的自定义(单独)元数据表单

Forms alfresco共享中的自定义(单独)元数据表单,forms,customization,alfresco,alfresco-share,Forms,Customization,Alfresco,Alfresco Share,看似简单的要求 我需要一个包含4个字段(textfield、authority和datex2)的表单,其行为与编辑元数据表单完全相同,这些字段表示节点上的4个属性 但是,此表单应作为独立于编辑元数据表单的UI提供,最好以UI操作的方式提供;DocLibActions中带有图标的按钮,单击该按钮时会弹出一个窗体 遇到问题 我使用UI操作机制的问题是无法将字段链接到属性。因此,每次打开表单时,都不会加载节点上可用的当前值。此外,适当的约束不会自动强制执行。我也想不出其他方法来实现这一要求 用户界面动

看似简单的要求

我需要一个包含4个字段(textfield、authority和datex2)的表单,其行为与编辑元数据表单完全相同,这些字段表示节点上的4个属性

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

遇到问题

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

用户界面动作方式

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

然后,我继续编写一个自定义JavaWebScript,它使用给定的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操作不是强制性的;我可以用任何方式实现这一点。

看看Actions.js客户端模块()中的
Alfresco.doclib.Actions.onActionDetails()函数。最简单的方法是注册您自己的表单ID,它可以基于
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,
   ...
});
显然,您需要将自定义表单定义添加到
共享配置custom.xml
文件或类似文件中,在该文件中还可以包含文档库操作定义

您不需要编写任何自定义UI组件


此外,当表单由UI呈现时,您不需要手动将属性值注入表单,也不需要编写任何web脚本来处理表单提交-如果您正确使用表单框架,表单框架将为您处理所有这些。

请查看
Alfresco.doclib.Actions.onActionDetails()
actions.js客户端模块()中的函数。最简单的方法是注册您自己的表单ID,它可以基于
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,
   ...
});
显然,您需要将自定义表单定义添加到
共享配置custom.xml
文件或类似文件中,在该文件中还可以包含文档库操作定义

您不需要编写任何自定义UI组件


此外,在UI呈现表单时,您不需要手动将属性值注入表单,也不需要编写任何web脚本来处理表单提交-如果您正确使用表单框架,表单框架将为您处理所有这些。

是否要将第二个编辑表单添加到文档库中?如果是,您是否查看了alfresco是如何实现默认操作的?是否要在文档库中添加第二个编辑表单?如果是,您是否查看了alfresco是如何实现默认操作的?谢谢!这是一条很好的线索。然而,你说的“整页”是什么意思?我可能看错了你的问题。当您说希望自定义弹出表单的行为类似于现有的“编辑元数据”操作时,我假设您希望弹出窗口中有一个按钮链接到具有更详细表单的完整页面。如果这不是一个要求,那么这将简化事情!有点怀疑:P。当然有,谢谢。但是,我已经使用了一个自定义操作,所以我想我可以使用您的自定义处理程序。然后,我想到的唯一问题是,在表单定义的条件下,我是放置动作还是包含属性的内容类型?我将添加我当前的定义以澄清。在操作中嵌入表单配置无效,它必须位于
(或类似)部分中。您还需要在
元素上添加
id
属性,以便您可以从操作处理程序中引用它。我编辑了答案以删除关于第二个表单定义的部分谢谢!这是一条很好的线索。然而,你说的“整页”是什么意思?我可能看错了你的问题。当您说希望自定义弹出表单的行为类似于现有的“编辑元数据”操作时,我假设您希望弹出窗口中有一个按钮链接到具有更详细表单的完整页面。如果这不是一个要求,那么这将简化事情!有点怀疑:P。当然有,谢谢。但是,我已经使用了一个自定义操作,所以我想我可以使用您的自定义处理程序。