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

时间:2013-01-29 13:19:52

标签: alfresco custom-action alfresco-share dashlet

几天前,我很难找到默认情况下在每个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];

然后,小部件在呈现页面时进行实例化。

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

  1. 每次呈现页面时,在自定义JS片段中使用我需要的操作扩充每个窗口小部件实例的“actions”数组。我使用这样的技术执行了一些测试但没有成功:http://acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/

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

  3. 为每个dashlet的webscript创建一个扩展模块,为每个Alfresco.widget.DashletTitleBarActions小部件定义添加自定义操作,类似于Dave Drapper在帖子http://blogs.alfresco.com/wp/ddraper/2012/05/22/customizing-share-javascript-widget-instantiation-part-1/中解释

  4. 获取每个dashlet div容器,并在页面准备好后添加直接操作DOM所需的操作。它应该可以工作,但我觉得它有点脏和不一致,所以我想避免它。

  5. 有人能想象一个更好,更可行的解决方案吗?

2 个答案:

答案 0 :(得分:4)

让我们首先向单个现有的dashlet添加一个动作。正如您在(3)中建议的那样,您可以定义一个可扩展性模块,通过拦截和修改其模型来更改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({...})
        }
    }
}

您在对象文字中添加的内容取决于您的操作的实现方式。如果您需要一些客户端行为(而不是静态链接),那么您还需要使用CustomEvent绑定它 - 请参阅RSS Feed小面板org/alfresco/components/dashlets/rssfeed.get.html.ftl作为示例。

可扩展性模块的缺点是您需要为每个dashlet定义显式扩展JS文件。您可以轻松地将上面的代码放在一个中心文件中,然后将其包含在需要它的每个dashlet扩展中,例如。

<import resource="classpath:alfresco/site-webscripts/org/myco/utils/dashlet.utils.js">

答案 1 :(得分:1)

我会在这里采用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++)
        {

如您所见,它会反转操作参数的顺序,然后添加开始循环操作。因此,如果您希望您的操作成为第一个或最后一个,您可以编辑此文件并添加自定义操作:

myAction = {
"cssClass": "customCSS"
, "tooltip": this.msg("slingshot.messages.generic.tooltip")
, "eventOnClick": ...
...
}
this.options.actions.push(myAction);
// now move on with the rest of the loop
for (...)

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