如何将默认自定义操作添加到dashlet';Alfresco Share中的s标题栏

如何将默认自定义操作添加到dashlet';Alfresco Share中的s标题栏,alfresco,custom-action,alfresco-share,dashlet,Alfresco,Custom Action,Alfresco Share,Dashlet,几天前,我一直在努力寻找在每个dashlet的标题栏中默认添加自定义操作的最佳方法 在这个阶段,我知道在每个dashlet的webscript中,操作都被设置为一个小部件。例如,在docsummary.get.js中: var dashletTitleBarActions = { id : "DashletTitleBarActions", name : "Alfresco.widget.DashletTitleBarActions", useMessa

几天前,我一直在努力寻找在每个dashlet的标题栏中默认添加自定义操作的最佳方法

在这个阶段,我知道在每个dashlet的webscript中,操作都被设置为一个小部件。例如,在docsummary.get.js中:

   var dashletTitleBarActions = {
      id : "DashletTitleBarActions",
      name : "Alfresco.widget.DashletTitleBarActions",
      useMessages : false,
      options : {
         actions: [
             {
                cssClass: "help",
                bubbleOnClick:
                {
                   message: msg.get("dashlet.help")
                },
                tooltip: msg.get("dashlet.help.tooltip")
             }
         ]
      }
   };
   model.widgets = [docSummary, dashletResizer, dashletTitleBarActions];
然后,当呈现页面时,小部件被实例化

我已经找到了下一个方法:

  • 每次呈现页面时,使用自定义JS代码段中所需的操作来扩充每个小部件实例的“操作”数组。我使用以下技术进行了一些测试,但没有成功:

  • 通过添加我的自定义操作修改Alfresco.widget.DashletTitleBarActions的原型。我相信它也不起作用,因为当小部件被实例化时,“actions”对象总是被覆盖,正如您在上面粘贴的代码中看到的那样

  • 为每个dashlet的webscript创建一个扩展模块,为每个Alfresco.widget.DashletTitleBarActions小部件定义添加自定义操作,类似于Dave Drapper在文章中解释的那样

  • 获取每个dashlet div容器,并添加在页面准备就绪后直接操作DOM所需的操作。它应该工作,但我认为有些肮脏和不一致,因此我想避免它。


  • 有人能想出一个更好、可行的解决方案吗?

    让我们从向单个现有dashlet添加操作开始。正如您在(3)中所建议的,您可以定义一个可扩展性模块,通过拦截和修改dashlet的模型来更改dashlet的行为

    博客文章和后续文章详细介绍了创建可扩展性模块,但这里的技巧是提供一个控制器JavaScript扩展,用于定位
    DashletTitleBarActions
    小部件并将您的操作添加到其中,例如

    if (model.widgets)
    {
        for (var i = 0; i < model.widgets.length; i++)
        {
            var widget = model.widgets[i];
            if (widget.id == "DashletTitleBarActions")
            {
                widget.actions.push({...})
            }
        }
    }
    

    让我们从向单个现有dashlet添加操作开始。正如您在(3)中所建议的,您可以定义一个可扩展性模块,通过拦截和修改dashlet的模型来更改dashlet的行为

    博客文章和后续文章详细介绍了创建可扩展性模块,但这里的技巧是提供一个控制器JavaScript扩展,用于定位
    DashletTitleBarActions
    小部件并将您的操作添加到其中,例如

    if (model.widgets)
    {
        for (var i = 0; i < model.widgets.length; i++)
        {
            var widget = model.widgets[i];
            if (widget.id == "DashletTitleBarActions")
            {
                widget.actions.push({...})
            }
        }
    }
    

    我会在这里走2号路

    这个小部件的定义在share.js文件({share.context}/js/share.js)中。对于Alfresco 4.2,DashletTitleBarActions在第1700行左右定义。在小部件的onReady处理程序中,有一个处理操作的循环

     // Reverse the order of the arrays so that the first entry is furthest to the left...
            this.options.actions.reverse();
            // Iterate through the array of actions creating a node for each one...
            for (var i = 0; i < this.options.actions.length; i++)
            {
    

    当然,这需要覆盖共享的js文件,而不是扩展它。如果你做不到这一点,那么你就必须在每个包含share.JS的页面上都包含一个自定义JS文件,并确保它在share.JS之后但在任何小部件准备就绪之前执行,然后覆盖小部件本身的onReady方法,这样它就可以做到这一点。

    我在这里选择第二条路

    这个小部件的定义在share.js文件({share.context}/js/share.js)中。对于Alfresco 4.2,DashletTitleBarActions在第1700行左右定义。在小部件的onReady处理程序中,有一个处理操作的循环

     // Reverse the order of the arrays so that the first entry is furthest to the left...
            this.options.actions.reverse();
            // Iterate through the array of actions creating a node for each one...
            for (var i = 0; i < this.options.actions.length; i++)
            {
    

    当然,这需要覆盖共享的js文件,而不是扩展它。如果你不能做到这一点,那么你就必须在每个包含share.JS的页面上包含一个自定义JS文件,并确保它在share.JS之后但在任何小部件准备就绪之前执行,然后覆盖小部件本身的onReady方法,这样它就可以执行此操作。

    你想添加什么样的操作?考虑到你的答案,我相信无论你怎么说,2都是正确的方式。一个像帮助每个dashlet一样的动作。尽管如此,我相信选项2可以被放弃,因为即使我修改了原始的share.js(定义了objet Alfresco.widget.DashletTitleBarActions),它也不会工作,因为每个dashlet的webscript都覆盖了上面代码段中的“actions”对象。这意味着任何可能的“预加载”操作都将被删除…选项(2)不合适,因为您永远不应该修改核心Alfresco JS类的原型。我认为,如果我可以像@zladuric在回答中解释的那样覆盖onReady方法,但不更改原始share.JS文件,那么选项2将是合适的。我强烈认为一个坏的做法和一个不适当的解决方案的事实,改变露天的源代码,无论资源是什么。那将是我最后的资源,我不同意。您永远不应该修改Alfresco类,即使这些修改位于另一个文件中。相反,您应该使用
    YAHOO.lang.extend()
    使用您自己的实现(应该在您自己的命名空间中)扩展这些类,然后使用可扩展性模块插入自定义类的名称。您希望添加什么类型的操作?考虑到你的答案,我相信无论你怎么说,2都是正确的方式。一个像帮助每个dashlet一样的动作。尽管如此,我相信选项2可以被放弃,因为即使我修改了原始的share.js(定义了objet Alfresco.widget.DashletTitleBarActions),它也不会工作,因为每个dashlet的webscript都覆盖了上面代码段中的“actions”对象。这意味着任何可能的“预加载”操作都将被删除…选项(2)不合适,因为您永远不应该修改核心Alfresco JS类的原型。我认为,如果我可以像@zladuric在回答中解释的那样覆盖onReady方法,但不更改原始share.JS文件,那么选项2将是合适的。我强烈认为一个坏的做法和一个不适当的解决方案的事实,改变露天的源代码,无论资源是什么。那将是我的v